dbQuery Napisano Październik 29, 2012 Zgłoś Share Napisano Październik 29, 2012 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 More sharing options...
5corpio Napisano Październik 30, 2012 Zgłoś Share Napisano Październik 30, 2012 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 More sharing options...
dbQuery Napisano Październik 30, 2012 Autor Zgłoś Share Napisano Październik 30, 2012 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 More sharing options...
5corpio Napisano Październik 30, 2012 Zgłoś Share Napisano Październik 30, 2012 Tak na szybkości skodziłem obrazek chyba ilustrujący problem. Przypadkiem pozycji okna nie powinieneś ustawiać właśnie na zasadzie: Pozycja_Okna.X = Kursor.X - DeltaX Pozycja_Okna.Y = Kursor.Y - DeltaY Ot taka mini-strona moja po godzinach http://www.wnetrzekuchni.pl Link do komentarza Udostępnij na innych stronach More sharing options...
dbQuery Napisano Październik 30, 2012 Autor Zgłoś Share Napisano Październik 30, 2012 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 More sharing options...
5corpio Napisano Październik 30, 2012 Zgłoś Share Napisano Październik 30, 2012 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 More sharing options...
dbQuery Napisano Październik 30, 2012 Autor Zgłoś Share Napisano Październik 30, 2012 Na wstępie wielkie dzięki za "wykopanie" tego dzieła, aczkolwiek jest ono niesprawne. 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 More sharing options...
5corpio Napisano Październik 31, 2012 Zgłoś Share Napisano Październik 31, 2012 Pokaż cały kod. A przynajmniej ten w całości odpowiedzialny za obsługę okna. Ot taka mini-strona moja po godzinach http://www.wnetrzekuchni.pl Link do komentarza Udostępnij na innych stronach More sharing options...
dbQuery Napisano Październik 31, 2012 Autor Zgłoś Share Napisano Październik 31, 2012 Wiele tego nie ma więc wrzucam cały plik. http://pastebin.com/0nS1DYcE Zaloguj się na pastebin'ie (tylko dla użytkowników). P.S.: Po małej przeróbce z pobieraniem pozycji kursora z LRESULT, myślałem że chociaż to zadziała. (point.x, y w ogóle się nie zmienia) Link do komentarza Udostępnij na innych stronach More sharing options...
5corpio Napisano Październik 31, 2012 Zgłoś Share Napisano Październik 31, 2012 Założyłem tam specjalnie konto teraz a i tak po zalogowaniu się wyrzuca mi, że to jest prywatny paste. Wrzuć ten kod tu na unit1.pl też jest miejsce do wklejania kodu: http://www.unit1.pl/pb i nie będzie problemu. Ot taka mini-strona moja po godzinach http://www.wnetrzekuchni.pl Link do komentarza Udostępnij na innych stronach More sharing options...
dbQuery Napisano Październik 31, 2012 Autor Zgłoś Share Napisano Październik 31, 2012 http://www.unit1.pl/pb-1329 Link do komentarza Udostępnij na innych stronach More sharing options...
5corpio Napisano Październik 31, 2012 Zgłoś Share Napisano Październik 31, 2012 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 More sharing options...
dbQuery Napisano Październik 31, 2012 Autor Zgłoś Share Napisano Październik 31, 2012 O KUHWA JASNA, ZIOMECZGU. Ratujesz mi dupe! Działa. Wyjebawszy POINT point; na szczyty kodu funkcja zaczęła działać. Dzięki Ci przeogromne. Podaj adres, podeślę Ci zgrzewkę ocieplaczy zimowych w postaci płynów pitnych. Link do komentarza Udostępnij na innych stronach More sharing options...
5corpio Napisano Październik 31, 2012 Zgłoś Share Napisano Październik 31, 2012 Cieszę isę, że się udało. Takie śmieciowe wartości zawsze znaczy, że albo coś jest nie tak z wskaźnikiem albo masz gdzieś lokalne zmienne z nieprzypisaną wartością i tam siedzą takie "śmieci" zawsze Ot taka mini-strona moja po godzinach http://www.wnetrzekuchni.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.