L'affichage d'une image bitmap sur un “BOUTON” de la classe de fenêtre dans WIN32
Edit: je pense que le message WM_CREATE n'est pas envoyé lors de la création des fenêtres enfant (en l'occurrence mon bouton). En appelant SendMessage pendant WM_CREATE, je suis l'envoi d'un message à une fenêtre qui n'a pas encore été créé. La seule solution est d'appeler la fonction SendMessage() au cours de la WM_SHOWWINDOW message. N'windows envoyer WM_CREATE messages lors de la création?
Pourquoi n'est-ce pas l'image bitmap à afficher sur le bouton? Le bitmap est 180x180 pixels.
J'ai un fichier de ressources:
Bit BITMAP bit.bmp
J'ai ensuite créer la fenêtre principale et un enfant "BOUTON" fenêtre avec:
HWND b, d;
b = CreateWindow(L"a", NULL, WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, 0, 0,
hInstance, 0);
d = CreateWindow(L"BUTTON", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP,
10, 10, 180, 180, b, 200, hInstance, 0);
Puis, dans ma procédure de windows, j'envoie le "BOUTON" de la fenêtre "BM_SETIMAGE" message avec:
HBITMAP hbit;
case WM_CREATE: //It works if I change this to: case WM_SHOWWINDOW
hbit = LoadBitmap(hInstance, L"Bit");
SendMessage(d, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hbit);
LoadBitmap() renvoie un descripteur valide car Il n'est pas de retourner la valeur NULL, et je suis capable d'afficher l'image dans l'espace client à l'aide de la fonction BitBlt (). Donc, je suis pas d'envoyer le message correctement, ou je ne suis pas en créant le "BOUTON" de la fenêtre correctement.
Ce que je fais mal?
Merci!
OriginalL'auteur tyler | 2009-05-09
Vous devez vous connecter pour publier un commentaire.
La procédure de fenêtre pour la fenêtre de votre classe "a" est appelée avec
WM_CREATE
lorsqu'une fenêtre de la classe est créée. C'est au cours de votre première appel àCreateWindow
, qui est avant la création de l'enfantBUTTON
fenêtre.WM_CREATE
signifie "vous êtes en cours de création" - cela ne veut pas dire "un enfant est en cours de création".La solution est d'appeler
d = CreateWindow(L"BUTTON"...)
dans leWM_CREATE
gestionnaire de classe "a":Je parie que c'est parce que vous êtes d'appel d = CreateWindow(..., b, ...) plutôt que d = CreateWindow(..., hwnd, ...) - n'oubliez pas, vous êtes dans le premier appel à CreateWindow, donc b n'a pas encore été attribué.
Wow, génial..complètement de sens. Merci homme.
OriginalL'auteur RichieHindle
Comment êtes-vous de vérifier que
WM_CREATE
n'est pas appelé? DepuisBUTTON
n'est pas votre classe de fenêtre (mais plutôt définie par le système d'exploitation) il est propriétaire de l'WndProc
de la fenêtre, et non pas vous - doncWM_CREATE
ne devrait pas être appelé pour le bouton dans votre code, parce queBUTTON
n'est pas votre classe.Si vous souhaitez recevoir les messages pour le bouton, vous aurez à la sous-classe, puis de fournir votre propre
WndProc
.OriginalL'auteur Andy