Pb avec CreateDialog()

[Résolu]
Signaler
Messages postés
14
Date d'inscription
mardi 6 juin 2006
Statut
Membre
Dernière intervention
9 août 2006
-
Messages postés
14
Date d'inscription
mardi 6 juin 2006
Statut
Membre
Dernière intervention
9 août 2006
-
Bonjour à tous ! Voila un pb qui m'occupe depuis plusieurs heures et je ne trouve pas d'ou vient le pb !

je veux faire une appli (GUI Win32) fondée sur une DialogWindow ... mais le CreateDialog() me retourne un handle à zéro ... Voici mon main.cpp :

--------------------------------------------------------------------------------
#include <windows.h>
#include "resource.h"

bool CALLBACK DlgProcedure (HWND, UINT, WPARAM, LPARAM);

HWND hDlgModeless ;

int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow) {

MSG msg;
hDlgModeless = CreateDialog (hThisInstance, MAKEINTRESOURCE("IDD_MAIN"), 0, (DLGPROC)DlgProcedure) ;
ShowWindow(hDlgModeless, SW_SHOWNORMAL);
BOOL bRet;

if (hDlgModeless == 0) {
MessageBox(0, TEXT("Impossible de créer la boite de dialogue"),TEXT("Dialog App"), MB_OK | MB_ICONWARNING);
return 1;
}
while ( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0 ) {
if (bRet == -1 ) {
// handle the error and possibly exit
} else if (!IsWindow(hDlgModeless) || !IsDialogMessage(hDlgModeless, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam ;
}

bool CALLBACK DlgProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_INITDIALOG :
return TRUE ;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
MessageBox(hwnd, TEXT("Bouton OK"), TEXT("Dialog App"), MB_OK | MB_ICONINFORMATION);
return TRUE;
case IDCANCEL:
MessageBox(hwnd, TEXT("Bouton Annuler"), TEXT("Dialog App"), MB_OK | MB_ICONINFORMATION);
DestroyWindow(hwnd);
return TRUE;
}
}
return FALSE ;
}
--------------------------------------------------------------------------------


... et au cas ou cela viendrais de la, le contenu de mon fichier ressource :
--------------------------------------------------------------------------------
// Generated by ResEdit 1.2
// Copyright (C) 2006

#include <windows.h>
#include "resource.h"


IDD_MAIN DIALOGEX 0,0,186,95
STYLE WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SETFONT | DS_FIXEDSYS | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
EXSTYLE WS_EX_OVERLAPPEDWINDOW
CAPTION "Dialog"
FONT 8,"MS Shell Dlg 2",400,0,1
BEGIN
PUSHBUTTON "OK",IDOK,129,7,50,14,BS_DEFPUSHBUTTON
PUSHBUTTON "Annuler",IDCANCEL,129,24,50,14
END
--------------------------------------------------------------------------------


Avec un appel à GetLastError(), j'obtient ce message d'erreur :
"Impossible de créer un fichier déjà existant"

Au secours !!!!! Je suis totalement largué la !

Par avance, merci de vos réponses

C++ Rooky

7 réponses

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Sinon je crois que c'est ton MAKEINTRESOURCE le problème. Essais sans les "":

MAKEINTRESOURCE(IDD_MAIN)

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution

http://programmationdebat.discutforum.com
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
En effet, remplacer MAKEINTRESOURCE("IDD_MAIN") par (LPCTSTR)IDD_MAIN

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
Ajoute ceci dans DlgProcedure:
case WM_DESTROY:
  PostQuitMessage(0);
  break;

Ca permettra de terminer la boucle des messages

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Si tu essayez avez DialogBoxParam comme suit:

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nCmdShow)
{
    DialogBoxParam(hThisInstance, (LPCSTR)IDD_MAIN, 0, DlgProcedure, 0);
    return 0;
}

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution

http://programmationdebat.discutforum.com
Messages postés
14
Date d'inscription
mardi 6 juin 2006
Statut
Membre
Dernière intervention
9 août 2006

Génial ! Merci ! avec MAKEINTRESOURCE(IDD_MAIN), cela fonctionne ben mieux .... fatal me direz vous !
Par contre, un click sur mon bouton "Annuler" ne ferme pas la boite ! Je pense que c'ets ma boucle while dans WinMain() qui tourne indéfiniment ?
Est-ce que vous auriez une option à me proposer pour cela ?
Est-ce que le handle de ma dialogue passe à zéro après le DestroyWindow() ? auquel cas je pourrais le tester dans la condition du while ?

C++ Rooky
Messages postés
14
Date d'inscription
mardi 6 juin 2006
Statut
Membre
Dernière intervention
9 août 2006

PArdon ! Je corrige ! Un click sur le bouton "Annuler" ferme bien la boite (encore heureux ! avec un DestroyWindow() !!) mais par contre, le process continue de tourner et je dois le killer via le gestionnaire des tâches !
Messages postés
14
Date d'inscription
mardi 6 juin 2006
Statut
Membre
Dernière intervention
9 août 2006

Nickel ca roule du feu de dieux !! Merci vecchio56 !

C++ Rooky