PDA

Visualizza la versione completa : [WIN32/C] Creare controlli a runtime


Gil Mour
12-01-2009, 17:06
Ogni tanto mi incasino con le interfacce in windows -.-'

Ho un dialog che in parte definito in un file di risorse, ed in parte deve essere costruito runtime. La parte risorse ok, la parte runtime non riesco a visualizzarla. Ho ridotto all'osso il codice



//...
DialogBox(TheInstance,MAKEINTRESOURCE(IDD_DIALOG1) ,0,guiDialogProc);
//...

BOOL CALLBACK guiDialogProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:

return TRUE;
break;

case WM_CREATE:
{
int i;
HANDLE hWndStatus;

hWndStatus = CreateWindowEx(

0L,
"EDIT",
"safa",
WS_CHILD | WS_BORDER | WS_VISIBLE,
300, 300, 100, 100,
hwnd,
NULL,
TheInstance,
NULL);

if (hWndStatus == NULL)

MessageBox (NULL, "Status Bar not created!", NULL, MB_OK );

return TRUE;
}
break;

case WM_DESTROY:

DestroyWindow(hwnd);
PostQuitMessage(0);
return TRUE;
break;

case WM_CLOSE:
EndDialog(hwnd,0);
return TRUE;
break;

default: return FALSE;
}

return FALSE;
}


Nel dialog vengono visualizzati i controlli definiti nel resource e basta. Forse mi manca un passaggio. Io presumo che il link tra controllo creato e finestra che deve contenerlo avvenga tramite il passaggio di hwnd..ma probabilmente sbaglio. Cosa mi manca?

MItaly
12-01-2009, 17:28
Mi pare che tu debba anche mostrare il controllo appena creato con ShowWindow.

Gil Mour
12-01-2009, 17:37
Mm ho provato ma pare che non dipenda da quello

Ho anche controllato un'altra cosa: ho lanciato il programma e sono andato a controllare cosa c'era dentro la finestra con spy++. Ci sono solo i controlli definiti nel resource.

Vincenzo1968
12-01-2009, 19:49
Attenzione,

devi mettere il codice per la creazione del controllo nel messaggio WM_INITDIALOG e non in WM_CREATE:



...
...
#define ID_MYEDIT 101
...
...
BOOL CALLBACK DlgProc (HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
static HANDLE hWndStatus;
HINSTANCE hInstance;

switch (message)
{
case WM_CREATE:

hInstance = ((LPCREATESTRUCT) lParam)->hInstance;
return TRUE;

case WM_INITDIALOG :
hWndStatus = CreateWindowEx(
0L,
TEXT("EDIT"),
TEXT(""),
WS_CHILD | WS_VISIBLE | WS_BORDER,
0,0,50,50,
hDlg,
(HMENU)ID_MYEDIT,
NULL, /*hInstance,*/
NULL);

return TRUE ;

case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDOK :
case IDCANCEL :
EndDialog (hDlg, 0) ;
return TRUE ;
}
break ;
}
return FALSE ;
}

Gil Mour
13-01-2009, 12:21
Grazie Vincenzo il problema era proprio quello

Loading