Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme Creation Bouton

8 réponses
Avatar
Fender6
Salut,

J'ai un probl=E8me lorsque je veux cr=E9er un bouton , celui ne s'affiche
pas dans la fen=EAtre pourtant je n'ai pas d'erreurs a la compilation .

Je creer une fenetre Static comme ceci :

HWND fenetre5 =3D 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 =3D LoadBitmap(instance,"IDB_Ajouter");
HWND bouton =3D 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+

8 réponses

Avatar
Christian ASTOR
On 4 déc, 17:21, Fender6 wrote:
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:



Normal, c'est trop tard pour WM_CREATE
Il faut superclasser, pas subclasser.
Avatar
Fender6
On 4 déc, 23:56, Christian ASTOR wrote:
On 4 déc, 17:21, Fender6 wrote:

> J'ai un problème lorsque je veux créer un bouton , celui ne s'affic he
> pas dans la fenêtre  pourtant je n'ai pas d'erreurs a la compilatio n .
> 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:

Normal, c'est trop tard pour WM_CREATE
Il faut superclasser, pas subclasser.



Merci pour ton aide ^^
Avatar
Fender6
On 4 déc, 23:56, Christian ASTOR wrote:
On 4 déc, 17:21, Fender6 wrote:

> J'ai un problème lorsque je veux créer un bouton , celui ne s'affic he
> pas dans la fenêtre  pourtant je n'ai pas d'erreurs a la compilatio n .
> 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:

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 .
Avatar
Christian ASTOR
On 5 déc, 10:03, Fender6 wrote:
> 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.



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 );
}
Avatar
Fender6
On 5 déc, 11:19, Christian ASTOR wrote:
On 5 déc, 10:03, Fender6 wrote:

> > 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.

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 Sta tic
=>

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 = LoadLi brary("shell32.dll");
                        HICON hBitmap = (HICON) LoadImage(hLib,  MAKEINTRESOURCE(41),
IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);
                        FreeLibrary(hLib);
                        SendMessage(hButton, BM_S ETIMAGE, IMAGE_ICON, (LPARAM)hBitmap);
                };
                break;
                case WM_COMMAND :
                {
                        if (HIWORD (wParam) = = BN_CLICKED)
                        {
                                char sId[ 32];
                                wsprintf( sId, "Button Id = %d", LOWORD(wParam));
                                MessageBo x(NULL, sId, "Click", MB_OK);
                        }
                }
                break;
                default :
                        return(CallWindowProc(Old SuperClassWndProc, 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 . ^^
Avatar
Fender6
On 5 déc, 11:19, Christian ASTOR wrote:
On 5 déc, 10:03, Fender6 wrote:

> > 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.

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 Sta tic
=>

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 = LoadLi brary("shell32.dll");
                        HICON hBitmap = (HICON) LoadImage(hLib,  MAKEINTRESOURCE(41),
IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);
                        FreeLibrary(hLib);
                        SendMessage(hButton, BM_S ETIMAGE, IMAGE_ICON, (LPARAM)hBitmap);
                };
                break;
                case WM_COMMAND :
                {
                        if (HIWORD (wParam) = = BN_CLICKED)
                        {
                                char sId[ 32];
                                wsprintf( sId, "Button Id = %d", LOWORD(wParam));
                                MessageBo x(NULL, sId, "Click", MB_OK);
                        }
                }
                break;
                default :
                        return(CallWindowProc(Old SuperClassWndProc, 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
Avatar
Christian ASTOR
On 5 déc, 13:31, Fender6 wrote:

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/librar y/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
Avatar
Fender6
On 5 déc, 15:09, Christian ASTOR wrote:
On 5 déc, 13:31, Fender6 wrote:

> 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 articlehttp://msdn.microsoft.com/en-us/libra ry/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/dow nload-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