Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI - lekcja 3 i 5] Okno nie odświeża się po kliku LMP, dziwna zależność

Ostatnio zmodyfikowano 2011-10-06 22:36
Autor Wiadomość
ceppman
Temat założony przez niniejszego użytkownika
[WinAPI - lekcja 3 i 5] Okno nie odświeża się po kliku LMP, dziwna zależność
» 2011-10-05 11:28:36
C/C++
case WM_LBUTTONDOWN:
{
   
    hdc = GetDC( hwnd );
    LineTo( hdc, LOWORD( lParam ), HIWORD( lParam ) );
    ReleaseDC( hwnd, hdc );
}
break;

Chciałbym by po kliku, linia rysowała się jak w lekcji i powyższym kodzie.. bajer w tym, że wszystko jest niby ok, po za tym, że okienko się nie odświeża i nic się nie rysuje, a przynajmniej dopóty, dopóki nie wstawię go pod inne okienko, najadę na jakiś przycisk / obszar innego okna pod spodem (np. Środowiska Dev C), czy wyskoczy tooltip spóźniony z DEVa. Wtedy prawdopodobnie odpala się WM_PAINT w moim programie i chodź miałem w nim do tej pory białe tło, wszystko co naklikałem i działo się w WM_LBUTTONDOWN nagle się pojawia.

Co ciekawsze, gdy dołączę pod spodem ten fragment kodu w klamrach powyższego case'a dla WM_LBUTTONDOWN, wszystko się zaczyna odświeżać prawidłowo (oczywiście rysuje się stale dodatkowa mała linia na górze).

C/C++
HDC hdcOkno = GetDC( hwnd );
HPEN CzerwonePioro, Pudelko;
POINT stary;
CzerwonePioro = CreatePen( PS_SOLID, 1, 0x0000FF );
Pudelko =( HPEN ) SelectObject( hdcOkno, CzerwonePioro );
MoveToEx( hdcOkno, 21, 10, & stary );
LineTo( hdcOkno, 55, 10 );
SelectObject( hdcOkno, Pudelko );
DeleteObject( CzerwonePioro );
ReleaseDC( hwnd, hdcOkno );

Szukałem przyczyny takiego zachowania i doszedłem do niego w pewien sposób, ale nie wiem skąd to dziwactwo (może coś pomijam ?!), a oto rzeczona przyczyna, czyli najlepsze:

Przy takim kodzie (bo tylko ten z góry nie działa, tak jak i podstawienie w miejsce współrzędnych w LineTo LOWORD(lParam) itd..): ...

C/C++
case WM_LBUTTONDOWN:
{
    hdc = GetDC( hwnd );
    LineTo( hdc, LOWORD( lParam ), HIWORD( lParam ) );
    ReleaseDC( hwnd, hdc );
   
    HDC hdcOkno = GetDC( hwnd );
    HPEN CzerwonePioro, Pudelko;
    POINT stary;
    CzerwonePioro = CreatePen( PS_SOLID, 1, 0x0000FF );
    Pudelko =( HPEN ) SelectObject( hdcOkno, CzerwonePioro );
    MoveToEx( hdcOkno, 21, 10, & stary );
    LineTo( hdcOkno, 55, 10 );
    SelectObject( hdcOkno, Pudelko );
    DeleteObject( CzerwonePioro );
    ReleaseDC( hwnd, hdcOkno );
}
break;

... Moja linia do miejsca kliknięcia narysuje się POD WARUNKIEM ŻE CHODŹ JEDNA WSPÓŁRZĘDNA w razem wziętych (?) MoveToEX() i LineTo() JEST TAKA SAMA (coś z odwołaniem do pamięci ?) ! Innymi słowy, po kliknięciu w dowolnym punkcie rysuje linię do pkt. kliknięcia, jeśli druga część kodu, rysująca inną linię wypluwa linię pionową lub poziomą (a nie skośną !:). Tak więc jak druga część kodu jest taka

C/C++
MoveToEx( hdcOkno,[ b ] 21[ / b ], 10, $ stary );
LineTo( hdcOkno,[ b ] 21[ / b ], dowolna_liczba, $ stary );

lub też gdy:

C/C++
MoveToEx( hdcOkno, 21,[ b ] 10[ / b ], $ stary );
LineTo( hdcOkno, dowolna_liczba,[ b ] 10[ / b ], $ stary );

... czyli albo iksy, albo igreki są takie same. Ale jak zrobię tak: ...

C/C++
MoveToEx( hdcOkno,[ b ] 21[ / b ],[ b ] 10[ / b ], & stary );
LineTo( hdcOkno,[ b ] 55[ / b ],[ b ] 30[ / b ] );

...czyli gdy współrzędne są różne, lub gdy zostawię tylko kod z pobranym położeniem kursora: LOWORD( lParam ), HIWORD( lParam ), to odświeżanie się krzaczy i działa dopiero jak sobie najadę na coś z innego okna, czy przykryję je i odkryję...

Co jest !? ; )

P.S. Fajny kurs, stawiam pierwsze kroki, więc zakładam że coś pochrzaniłem, ale dochodząc do tej dziwacznej zależności zaczynam się zastanawiać czy nie jest to coś w stylu tego "21" by było "20" (Czyli pewnie chodzi o tablicę zaczynającą się od 0), ale przy "10" bez "11" ; ))
P-41741
DejaVu
» 2011-10-05 12:12:47
Czytałem Twojego posta ze 3 razy i wciąż nie wiem o co Ci chodzi :) Coś się raz odświeża, a raz nie - jak jakiś kod masz to Ci działa dobrze ale jest czarna linia, a jak jakiegoś nie ma to nie działa odświeżanie. Najwyraźniej w kursie było napisane, że dany fragment kodu jest potrzebny po to by się okienko prawidłowo odświeżało :) Generalnie trochę czasu trzeba poświęcić na to żeby zrozumieć jak działa WinAPI i jakimi prawami się rządzi. Warto czytać również dokumentację MSDN funkcji, które używasz.
P-41742
ceppman
Temat założony przez niniejszego użytkownika
» 2011-10-05 12:43:40
Tak w ogóle to dzięki za quote... jak to się tu robi ?...
próba, udało mi się
 ?.. [quote]a może teraz[/quote]..
No nic, w każdym bądź razie myślę, że łapię jako tako kursik ; ) Natomiast jako, że jeden obraz wart jest 1000 słów, zaraz postaram się podesłać filmik. Sęk w tym, że gdy nagrywam, to działa, a to dlatego, że captury z ekranu bezpośrednie odświeżają ów ekran prawdopodobnie, tak więc filmik nagram z aparatu foto jaki mam pod ręką (jakość niestety nie będzie najlepsza). Ściągnę tylko coś do kompresji jeszcze i gdzieś wrzucę plik.

<...>
1) Do 15 sec. odpalam kompilator i klikam jak szalony po okienku (nic się nie dzieje), potem najeżdżam na pierwszy lepszy przycisk IDE DEVa i pyk... pojawia się wszystko (okno się chyba odświeżyło).
2) Powtarzam to do 22 sec.
3) Do 49 sec. zmieniam X wspomnianych funkcji na taki sam (21), więc linia narysuje się pionowa + moje wyklikane i... voila ! Idziet !
4) Do mniej więcej 1 min 12 sec. zmieniam X w LineTo na 99, więc teraz zarówno X, Y w MoveTo i X, Y w LineTo są różne... odświeżyły się (z jakiegoś powodu dziwnego) 3 linie, potem nic... Ale po najechaniu na inny button z aplikacji pod spodem jak widać znowu okienko ruszyło.
5) 1 min. 38 - zmieniam tym razem Y na takie same (10), więc będzie linia pozioma, X inne... i idzie jak należy
6) dalej podnoszę Y w MoveTo o 1... więc wszystko inne i... padaka...

Fajne, nie ? :DD

Mam Windę 7, 64 bitki. Co to jeszcze może mieć wpływ z istotnych rzeczy ? Wer. Deva (i chyba bibliotek najnowszą, choć GDI to chyba z windy...)...

Za chwilę dodam filmik, bo jeszcze mi się zasysa wszystko do kompresji ; (
P-41743
DejaVu
» 2011-10-05 12:52:51
» KursyKurs STC kurs
P-41744
ceppman
Temat założony przez niniejszego użytkownika
» 2011-10-05 13:14:00
Hehe, to widzę spolszczone jest, a ja quoty ang. próbowałem. Dzięki ; )
Oto link do pliczku. Nie jest najlepszej jakości, ale chyba widać o co biega...

TUTAJ PLIK




<...>
Musi chodzić o odświeżanie okna, tylko, że samo kliknięcie myszą tego nie robi, a dodanie UpdateWindow w obsłudze komunikatu nie działa. Co natomiast działa ? Jak dodam pole EDIT, to gdy zrobię na niego focusa (i kursor mruga), to używając rzeczonego kodu tzn. tylko:

C/C++
case WM_LBUTTONDOWN:
{
    HDC hdc = GetDC( hwnd );
    LineTo( hdc, LOWORD( lParam ), HIWORD( lParam ) );
    ReleaseDC( hwnd, hdc );
}
break;

to linie rysują się w momencie gdy kursor się pojawi, lub zniknie (a jak zdążę się naklikać parę razy pomiędzy tymi, to linii nie widać).

Tak więc podsumowując, jak sprawić, by okno odświeżało się samoczynnie gdy stanie się cokolwiek (a najlepiej nawet jak się nie stanie), a nie czekało w pętli GetMessage na jakikolwiek komunikat ?




P.S.1
Poprawiłem kod z pierwszego posta, był za bardzo spontaniczny, mam nadzieję, że już jest lepiej ; )

P.S.2
Nie działa boldowanie z linka to STC... chyba, że nie śmiga tylko w obrębie tagów code ; (

P.S.3
A nie fajniej BB Code wszędzie ?
P-41746
DejaVu
» 2011-10-06 22:36:41
I co doszedłeś do czegoś? :) Ja bym nie liczył na to aż ktoś za Ciebie rozwiąże problem - przeczytaj jeszcze raz wymienione rozdziały kursu i postaraj się zrozumieć jak to działa - na tym polega praca programisty :) Drążyć, drążyć, drążyć - aż zadziała :)
P-41802
« 1 »
  Strona 1 z 1