• 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

Object Storage Arubacloud
0 głosów
221 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 142 wizyt
pytanie zadane 19 maja 2017 w C i C++ przez Knayder Nałogowiec (37,640 p.)
0 głosów
2 odpowiedzi 404 wizyt
pytanie zadane 19 kwietnia 2018 w C i C++ przez Cixo Gaduła (4,070 p.)
0 głosów
0 odpowiedzi 364 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...