• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z pozycją myszy na ekranie

Cloud VPS
0 głosów
287 wizyt
pytanie zadane 22 sierpnia 2019 w C i C++ przez Huberti Gaduła (4,500 p.)
edycja 24 sierpnia 2019 przez Huberti

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:

1
komentarz 23 sierpnia 2019 przez niezalogowany
Wstaw minimalny, kompletny i działający przykład kodu.
komentarz 24 sierpnia 2019 przez Huberti Gaduła (4,500 p.)
Gotowe

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 195 wizyt
pytanie zadane 19 maja 2017 w C i C++ przez Knayder Nałogowiec (37,640 p.)
0 głosów
2 odpowiedzi 724 wizyt
pytanie zadane 19 kwietnia 2018 w C i C++ przez Cixo Gaduła (4,070 p.)
0 głosów
0 odpowiedzi 610 wizyt

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,909 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...