J'ai un problème lorsque je veux créer un bouton , celui ne s'affiche
pas dans la fenêtre pourtant je n'ai pas d'erreurs a la compilation .
Je creer une fenetre Static comme ceci :
HWND fenetre5 = CreateWindow("STATIC","",WS_CHILD | WS_VISIBLE |
SS_NOPREFIX,235, 130, 530, 365,fenetrePrincipale,NULL,instance,NULL);
Et je la remplie en la subclassant :
case WM_CREATE:
{
HBITMAP hb2 = LoadBitmap(instance,"IDB_Ajouter");
HWND bouton = CreateWindow("button","", WS_CHILD |
WS_VISIBLE | BS_BITMAP,490,327,35,35,hwnd, NULL , instance, NULL);
SendMessage(bouton, BM_SETIMAGE, IMAGE_BITMAP,
(LPARAM)hb2);
}
Aurais je fait une erreur quelque part ?
a+
Normal, c'est trop tard pour WM_CREATE
Il faut superclasser, pas subclasser.
Peux tu m'expliquer en détail en quoi consiste le surclassement car
cette méthode n'est pas très mentionner sur la toile et j'ignore
comment m'en servir.
Merci quand même du temps que tu as déjà passé a résoudre mon
problème .
Le superclassing (pas subclassing), c'est créer une nouvelle classe de
fenêtre à partir d'une classe existante.
Pour ton exemple, nouvelle classe appelée, par ex, "SuperStatic" avec
un bouton créé en child sur WM_CREATE, à partir de la classe Static
=>
WNDPROC OldSuperClassWndProc;
LRESULT CALLBACK SuperClassWndProc(HWND hWnd, UINT uMsg, WPARAM
wParam, LPARAM lParam);
BOOL InitClass(void)
{
WNDCLASS wc;
GetClassInfo(hInst, "STATIC", &wc);
wc.hInstance = hInst;
wc.lpszClassName = "SuperStatic";
OldSuperClassWndProc = wc.lpfnWndProc;
wc.lpfnWndProc = SuperClassWndProc;
if ( !RegisterClass( &wc ) )
{
MessageBox (NULL, "Registering Error", "Information", MB_OK |
MB_ICONSTOP);
return(FALSE);
}
return (TRUE);
}
avec :
LRESULT CALLBACK SuperClassWndProc(HWND hWnd, UINT uMsg, WPARAM
wParam, LPARAM lParam )
{
static HWND hButton;
switch (uMsg)
{
case WM_CREATE :
{
RECT rc;
GetClientRect(hWnd, &rc);
hButton = CreateWindow("BUTTON","", WS_CHILD | WS_VISIBLE |
BS_ICON,
(rc.right-rc.left - 35)/2,(rc.bottom-rc.top - 35)/2, 38, 38, hWnd,
(HMENU)100, hInst, NULL);
HINSTANCE hLib = LoadLibrary("shell32.dll");
HICON hBitmap = (HICON)LoadImage(hLib, MAKEINTRESOURCE(41),
IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);
FreeLibrary(hLib);
SendMessage(hButton, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hBitmap);
};
break;
case WM_COMMAND :
{
if (HIWORD (wParam) == BN_CLICKED)
{
char sId[32];
wsprintf(sId, "Button Id = %d", LOWORD(wParam));
MessageBox(NULL, sId, "Click", MB_OK);
}
}
break;
default :
return(CallWindowProc(OldSuperClassWndProc, hWnd, uMsg, wParam,
lParam));
}
return 0;
}
Appel =>
if (InitClass())
{
HWND hSuperStatic = CreateWindow ("SuperStatic", "", WS_CHILD |
WS_VISIBLE | SS_NOTIFY, 150, 150, 100, 100, hWnd, 0, hInst, NULL );
}
Merci pour ton explication .
C'est vraiment sympas de passer du temps a aider les débutant . ^^
J'ai utilisé ce que tu m'as dit mais j'obtiens toujours l'erreur
"Registering Error" .
J'ai héberge le code source de mon main j'espère que tu pourras
m'aider : http://website2.olympe-network.com/main.cpp
> J'ai utilisé ce que tu m'as dit mais j'obtiens toujours l'erreur
> "Registering Error" .
> J'ai héberge le code source de mon main j'espère que tu pourras
> m'aider :http://website2.olympe-network.com/main.cpp
Il y a diverses erreurs (les WM_PAINT, les subclassing un peu bizarres
(faire comme le superclassing pour la procédure initiale qu'on met en
en global comme sur le vieil article http://msdn.microsoft.com/en-us/library/ms997565.aspx),
...)
Appeler GetLastError() si RegisterClass() renvoie 0, pour connaitre la
raison exacte de l'erreur.
J'ai mis un rapide exemple à partir du Wizard Win32 de VS en créant
des contrôles en boucle pour tester =>
http://www.datafilehost.com/download-932cc0da.html
Merci , je pense que cette fois ci je vais me débrouiller un peu tout
seul et arrêtez de t'embêter xD