Skocz do zawartości

[WinAPI] Program przyczepiony do kursora


dbQuery

Polecane posty

Witam! Jest to mój pierwszy post więc wypadało by się przedstawić. Na imię mi Jerzy. Już od dawna próbuję ukulać coś w języku C++. Raz mi to wychodzi, raz nie. Ale przejdźmy do rzeczy. W dzisiejszym pięknym dniu, postawiłem sobie za cel program, który można przeciągnąć za pomocą kursora - po prostu poruszać nim po ekranie (lewy myszki wciśnięty - przesuwasz go, puszczasz lewy myszki, przestaje być do niej przyczepiony). Skleiłem coś takiego:

 

 case WM_LBUTTONUP:

Przyc = false;
break;
case WM_MOUSEMOVE:
if(Przyc)
{
HDC hdc = GetDC(hWnd);
int positionX, positionY;
GetDesktopWindow();
RECT prostokat2;
GetWindowRect( hWnd, & prostokat2 );
SetWindowPos(hWnd, HWND_TOP, prostokat2.left + LOWORD(lParam), prostokat2.top + HIWORD(lParam), NULL, NULL, SWP_NOSIZE);
ReleaseDC(hWnd, hdc);
}
break;

 

jednak jakkolwiek próbuję to skleić okienko przysłowiowo "spierdala". Dzięki za wszelaką pomoc. Pozdrawiam.

Link do komentarza
Udostępnij na innych stronach

Dawno nic nie kodziłem a w c++ to prawie nigdy ale: lParam przypadkiem nie przechowuje X,Y myszki względem ekranu? Bo nie możesz przecież chyba policzyć X,Y okna poprzez: prostokat2.left + LOWORD(lParam) bo właśnie będzie "spierdalać" okno o duże wartości musisz policzyć albo jakąś delte przesunięcia tylko albo sprawdzić chyba położenie kursora wewnątrz okna (odl. od lewa i góry) i jakoś od tego punkty liczyć przesunięcie.

 

Ale mogę się mylić bo nie kodziłem już ho ho...

 

 

Edit: a w obecnym momencie nie masz przypadkiem tak, że przy ruszaniu oknem i myszką górny lewy róg okna ustawia ci się w miejscu kursora czyli całe okno przesunięte jest mocno mocno w prawo i ew. dół?

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

Próbowałem już wielu sposobów, dlatego podałem to na czym skończyłem. Dla mnie wygląda to tak, że musiałbym pobrać pozycję kursora na monitorze + w dialogu. W momencie ustawiania pozycji okna, musiałbym podać pozycję kursora na monitorze - odległość położenia kursora na dialogu + pozycję okna. Trochę mnie to przerasta, także dzięki za wszelką pomoc.

Link do komentarza
Udostępnij na innych stronach

Ani trochę nie widzę tutaj zastosowania delty. Po długich drugo dziennych przemyśleniach nad tym programem, doszedłem do wniosku, że najlepiej byłoby zastosować tutaj timer, bądź coś podobnego, co będzie w stanie porównać obydwie pozycje kursora myszki. Np. jeśli nowa pozycja X kursora będzie mniejsza od starej pozycji X to wtedy pozycja okna programu przesunie się o H jednostek w lewo. Byłoby z tym masę roboty, ale jeśli ktoś ma inny pomysł to prosiłbym bardzo.

Link do komentarza
Udostępnij na innych stronach

Eee timer będzie złym pomysłem. Przecież ten kawałek kodu co wrzuciłeś: WM_MOUSEMOVE działa w pętli komunikatów nie? To odpowiednio kod jest wywoływany jeśli zachodzi zdarzenie więc podpinanie jeszcze dodatkowego timera jest mocno zbędne.

 

Edit: http://paste.rohitab.com/2732 chyba takiego rozwiązania szukasz.

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

Na wstępie wielkie dzięki za "wykopanie" tego dzieła, aczkolwiek jest ono niesprawne.

 

99466133.png

 

pozwoliłem sobie dodać MessageBox'a sprawdzającego (okno wyparowywało). Nie wiem jakim prawem point.x,y robi się na taką liczbę. Może to po prostu jakiś bug przy wciśniętym przycisku?

Link do komentarza
Udostępnij na innych stronach

:D Na szybkości tylko zacząłem przeglądać kod ale to:

 

void kutas(WORD cursorX, WORD cursorY)

 

rozwaliło mnie już na początku.

 

 

Może problemem jest, że zmienne:

 

    POINT point;
            	POINT curpoint;

 

 

 

są zadeklarowane lokalnie w funkcji:

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

 

Czyli są tworzone potem niszczone i tak ciągle przy jakimiś komunikacie. Przesledź sobie blok switch...case jak się wykonuje pokolei. Przez co w kodzie w zależności od zdarzenia jedna z pozycji jest zapisana poprawnie a w drugiej siedzą śmieci.

 

To chyba przez to głównie.

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

Gość
Temat jest zablokowany i nie można w nim pisać.
×
×
  • Utwórz nowe...