DialogBox

Résolu
Messages postés
245
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008
-
Messages postés
245
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008
-
Bonjour, j'ai téléchargé une source ici (de deck_bsd sur les processus) et j'ai donc vu qu'il faisait des DialogBox pour par exemple afficher une boite "a propos de ", j'ai essayé de faire pareil, mais euh, ben ca marche pas. Le problème, c'est que je met un button sur ma DialogBox et ce bouton apparait mais le fond de ma DialogBox est transparent et on dirait que celle-ci prend tout l'écran car quand je clique quelque part, ça ne fait rien ...

Voici mon code (j'ai débuter le GUI hier, c'est donc surement un peu un peu boulet ...) :

[...]

LRESULT CALLBACK dlgProc(HWND hwDlg, UINT message, WPARAM wParam, LPARAM lParam) {

        static HWND hwOk;

        switch(message){
            case WM_INITDIALOG :

                 hwOk = CreateWindow("button","OK",WS_VISIBLE | WS_CHILD,
                        10,70,60,20,hwDlg,(HMENU)1,GlobalInstance,NULL);

                 break;

            case WM_COMMAND:

                if (HIWORD(wParam) == BN_CLICKED)
                    EndDialog(hwDlg, 0);

                break;

            case WM_CLOSE :
                 EndDialog(hwDlg,0);
                 break;
        }

}
[...]

 case 4:

                    HGLOBAL hgMemory;
                    LPDLGTEMPLATE lpDlgBox;
                    LPWORD lpwWord;
                    LPWSTR lpwsWindowName;

                    hgMemory = GlobalAlloc(GPTR, 512);
                    if (!hgMemory) return false;

                    lpDlgBox = (LPDLGTEMPLATE) hgMemory;

                    lpDlgBox->style = WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_POPUP | DS_MODALFRAME;
                    lpDlgBox->cx = 200;
                    lpDlgBox->cy = 200;
                    lpDlgBox->x = 50;
                    lpDlgBox->y = 50;

                    lpwWord = (LPWORD) (lpDlgBox+1);

                    lpwsWindowName = (LPWSTR) (lpwWord +2);

                    MultiByteToWideChar(CP_ACP, 0, "Editer", -1, lpwsWindowName, 128);

                    DialogBoxIndirect(GlobalInstance, lpDlgBox,0, (DLGPROC)dlgProc);

                    GlobalFree(hgMemory);

                    break;
[...]

GlobalInstance est l'instant de la fenetre principale.

Voilà, j'espère que mon code n'est pas trop mauvais et que quelqu'un saura m'éclairer ...

["http://ziman4000.free.fr" www.vb6team.fr.st]

8 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Mets ton code complet ici. Normalement ta fonction dlgProc doit se terminer par un returrn 0;
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Regarde mon code source sur la création de boites de dialogues sans ressources:
http://www.cppfrance.com/code.aspx?ID=26264

Tu peux également regarder mon dernier code source dans lequel j'utilise une boite de dialogue avec un seul bouton.
Messages postés
245
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008

Oui d'accord, il est bien fait et je pense que la source de Deck était basé dessus vu les commentaires qu'il a laissé mais regarde mon code, je le pense identique à part les noms de variables mais rien n'y fait ...

["http://ziman4000.free.fr" www.vb6team.fr.st]
Messages postés
245
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008

Erf, ben ce sera pas utile de mettre le code, c'est bien le return 0 qui fait que ca foirait ... Merci beaucoup, mais j'ai une autre question. Je comprend assez bien les lignes de codes sauf 2 :

                    lpwWord = (LPWORD) (lpDlgBox+1);

                    lpwsWindowName = (LPWSTR) (lpwWord +2);

Je ne comprend pas bien ce que l'on fait en faisant cela. Merci si tu peux m'éclairer (plus que les commentaires :p)

["http://ziman4000.free.fr" www.vb6team.fr.st]
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
lpwWord = (LPWORD) (lpDlgBox+1); permet d'obtenir un pointeur sur la zone juste après la fin de la structure DLGTEMPLATE.
lpwsWindowName = (LPWSTR) (lpwWord +2); permet d'obtenir un pointeur sur la zone qui contiendra le titre de la boite de dialogue. Ce pointeur sera utilisé dans la fonction MultiByteToWideChar().
On peut enlever ces trois lignes de code et donner le titre qu'on veut à la boite de dialogue avec SetwindowText() pendant le traitement de WM_INITDIALOG.

case WM_INITDIALOG:
SetWindowText(hwDlg,"Titre de la boite de dialogue");
Messages postés
245
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008

Oki je comprend pour lpsWindowName car on s'en sert comme tu le dis dans MultiByteToWideChar mais lpwWord n'est utilisé nul part alors quel est son interet ?

["http://ziman4000.free.fr" www.vb6team.fr.st]
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Je l'avais mis dans mon code source juste pour que les choses soient un peu claires. Pour montrer qu'on est au delà de la zone allouée à la structure DLGTEMPLATE.
Messages postés
245
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008

Ah d'accord. Merci de la précision, j'ai adopté la solution 2 avec SetWindowText, je préfère, au moins je comprend cette syntaxe.

Merci de ton aide

["http://ziman4000.free.fr" www.vb6team.fr.st]