DialogBox

Résolu
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 septembre 2008 - 20 août 2006 à 23:48
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 septembre 2008 - 21 août 2006 à 03:18
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

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
21 août 2006 à 01:22
Mets ton code complet ici. Normalement ta fonction dlgProc doit se terminer par un returrn 0;
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
21 août 2006 à 00:49
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.
0
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 septembre 2008
21 août 2006 à 01:14
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]
0
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 septembre 2008
21 août 2006 à 01:30
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]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
21 août 2006 à 01:48
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");
0
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 septembre 2008
21 août 2006 à 02:14
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]
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
21 août 2006 à 03:15
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.
0
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 septembre 2008
21 août 2006 à 03:18
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]
0
Rejoignez-nous