Zmiana bitmapy przycisku w momencie najechania kursorem myszki

0

Witam,

Robię aplikację pod winapi i chciałem zrobić coś jak interaktywne przyciski - w momencie gdy kursor znajduje się nad przyciskiem następuje podmiana bitmapy. Zrobiłem okno (przycisk) na podstawie systemowej klasy Button ze stylem BS_OWNERDRAW. Z tego co wyczytałem istnieje parę opcji. Pierwsza z nich to przetworzenie odpowiedniej wiadomości w procedurze okna rodzica, a konkretnie wiadomości WM_NOTIFY wysyłanej do tegoż okna. W parametrze lparam mamy adres struktury NMHDR, w której to jednym z pól jest kod notyfikacji. Jednak gdy w procedurze okna rodzica wypisuje coś takiego:

case WM_NOTIFY:
MessageBox(0,L"",L"",MB_OK);

brak jest jakiegokolwiek efektu podczas ruchu myszy nad oknem-przyciskiem.
Druga z opcji jest drobne zmodyfikowanie pętli wiadomości, np. dodaj warunek

if( PeekMessage(&msg,UchwytOknaPrzycisku,0x0200,0x0201,NULL) == WM_MOUSEMOVE) //i tutaj jej przetworzenie

Jednak takie coś nie działa, nie mam pojęcia dlaczego. (Działa tylko kiedy klikne LPM na przycisk... ).
Ponadto mam jakiś problem z programem bo po kompilacji łapie zawieche dopiero jak uruchamiam menadżera zadań to odzyskuje sprawność. I w końcu ostatnia sprawa program prawidłowo wyświetla przycisk i bitmape w oknie jednak po zminimalizowaniu nie odrysowywuje przycisku. Proszę o jakieś sugestie co zmienić itp. kod źródłowy wrzucam tu na wklej.org, post będzie bardziej czytelny:

http://wklej.org/id/1208102/

0

Źle sformułowałem tą pętlę wiadomości. Oczywiście aby przetworzyć wiadomość WM_MOUSE move nad przyciskiem zrobiłem coś takiego:

	for( ;; )
	{
	
		if(GetMessage(&msg,0,0,0) != 0)
		{
			if((msg.message == WM_MOUSEMOVE) && (msg.hwnd == UchwytPrzycisku)) MessageBox(0,L"",L"",MB_OK);
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		if(msg.message == WM_QUIT) break;
	}

A wspomnianą zawiechę aplikacja łapała przez wywołanie przy WM_CREATE funkcji SetCapture(hWnd). Teraz wszystko wydaje się być ok, jednak dalej nie wiem dlaczego po zminimalizowaniu okna przycisk znika pod bitmapą okna. Było by też fajnie gdyby ktoś wyjaśnił jak osiągnąć coś podobnego (przechwycić ruch myszy nad przyciskiem) w procedurze okna rodzica. Pozdrawiam :)

0

Jednak gdy w procedurze okna rodzica wypisuje coś takiego:

case WM_NOTIFY:
MessageBox(0,L"",L"",MB_OK);

brak jest jakiegokolwiek efektu podczas ruchu myszy nad oknem-przyciskiem.

A po co przycisk miałby wysyłać własne komunikaty myszy do okna rodzica? Jak chcesz przechwycić komunikaty z wnętrza przycisku, subklasuj go.

1 użytkowników online, w tym zalogowanych: 0, gości: 1