Witam, poniżej jest kod przeźroczystego okna z wykorzystaniem biblioteki SFML + WinAPI.
#include <SFML/Graphics.hpp>
#include <Windows.h>
int main()
{
sf::RenderWindow window(sf::VideoMode::getFullscreenModes()[0], "");
window.setFramerateLimit(60);
// Pobieranie uchwytu okna (HWND)
sf::WindowHandle handle = window.getSystemHandle();
// Ustawienie docelowych stylów okna przy użyciu WinAPI - widzialne przeźroczyste okno
SetWindowLongPtr(handle, GWL_STYLE, WS_VISIBLE); // | WS_CAPTION Po dodaniu tego stylu wszystko działa jak należy
SetWindowLongPtr(handle, GWL_EXSTYLE, WS_EX_LAYERED);
SetLayeredWindowAttributes(handle, 0, 100, LWA_ALPHA);
// Zakomentowana naprawa problemu "na oko"
//const sf::FloatRect visibleArea(0, 48, window.getSize().x, window.getSize().y);
//window.setView(sf::View(visibleArea));
bool userSpecifiesArea = false;
sf::Vector2i mouseStartingPositionRelativeToWindow;
sf::RectangleShape userArea;
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event))
if (sf::Event::EventType::Closed)
window.close();
if (sf::Mouse::isButtonPressed(sf::Mouse::Button::Left)) {
if (!userSpecifiesArea) {
userSpecifiesArea = true;
mouseStartingPositionRelativeToWindow = sf::Mouse::getPosition(window);
userArea.setPosition(sf::Vector2f(mouseStartingPositionRelativeToWindow));
userArea.setSize(sf::Vector2f());
}
else {
const sf::Vector2i mousePosition = sf::Mouse::getPosition(window);
userArea.setSize(sf::Vector2f(mousePosition) - userArea.getPosition());
}
}
else if (userSpecifiesArea)
userSpecifiesArea = false;
window.clear();
if (userSpecifiesArea)
window.draw(userArea);
window.display();
}
}
Chciałem umożliwić użytkownikowi zaznaczenie obszaru (podobnie jak w Windowsie działa zaznaczanie wielu ikon na pulpicie). Problem w tym, że pozycja myszy z jakiegoś powodu nie jest położona w rogu rysowanego obszaru. Tak to wygląda:
Jak widać mysz jest trochę wyżej niż róg. Sprawdzałem i kiedy okno jest ustawione jako "z tytułem" (styl WS_CAPTION) wszystko działa jak należy. Wie ktoś jak to można naprawić bez dodawania tego stylu?
PS Póki co "na oko" poprawiłem to w ten sposób:
const sf::FloatRect visibleArea(0, 48, window.getSize().x, window.getSize().y);
window.setView(sf::View(visibleArea));
I teraz wygląda to dużo lepiej: