Per la mia applicazione ho bisogno di creare una finestra di dialogo senza usare la risorsa. Sto provando a farlo con la funzione DialogBoxInderect. Il codice è incredibilmente brutto ma in qualche modo sono riuscito a farlo.DialogBoxIndirect crea una finestra di dialogo più grande di quella richiesta
Il problema è che il dialogo, per qualche motivo, è molto più grande di quello che ho chiesto con caratteri molto più grandi.
Ecco come la finestra si presenta come se carico dalla risorsa:
E qui è il dialogo con la stessa dimensione indicata quando chiamo DialogBoxInderect funzione.
Ecco come è definito nel codice:
HGLOBAL hGlobal;
LPDLGTEMPLATE wlsDialogTemplate;
LPDLGITEMTEMPLATE wlsDialogItemTemplate;
LPWORD nextItem;
LPWSTR itemString;
int32_t itemStringLength;
// Check for memory allocation errors
hGlobal = GlobalAlloc(GMEM_ZEROINIT, 1024);
if (!hGlobal)
return -1;
wlsDialogTemplate = (LPDLGTEMPLATE)GlobalLock(hGlobal);
// Define a dialog box.
wlsDialogTemplate->style = WS_CAPTION;
wlsDialogTemplate->x = 0;
wlsDialogTemplate->y = 0;
wlsDialogTemplate->cx = 320;
wlsDialogTemplate->cy = 115;
GlobalUnlock(hGlobal);
retCode = DialogBoxIndirect(0, (LPDLGTEMPLATE)hGlobal, 0, ActivateWlsMsgDialog);
Ed ecco come si è definita nel file RC:
IDD_WLS_SMALL_MESSAGE_DLG DIALOGEX 0, 0, 320, 115
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",ID_CUSTOM_OK,175,95,120,15
PUSHBUTTON "Cancel",ID_CUSTOM_CANCEL,45,95,120,15
CTEXT "Static",IDC_HEADER_TEXT,120,10,170,70
CONTROL "",IDC_LOGO,"Static",SS_BITMAP,16,10,83,70
END
Come si può vedere, la seconda finestra è molto più più grande di definito. Ho provato a giocare con varie bandiere di stile ma senza successo (ecco perché c'è una croce rossa nella finestra di dialogo più grande).
Qualsiasi aiuto con quello? Grazie!
Grazie mille per la rapida risposta. Sì, ho il sospetto che il problema sia il font, tuttavia, non ho trovato alcun esempio su come aggiungere le informazioni sul font all'intestazione. Puoi aiutarmi con quello? L'impostazione del carattere richiesto come risposta a WM_INITDIALOG non risolverà il problema, poiché cambierà il carattere ma non ridimensionerà la finestra di dialogo a meno che non lo ridimensioni manualmente. –
Btw, il termine tecnico è DLU = unità di dialogo. Si (di solito) progettare una finestra di dialogo in DLUs non pixel – demorge
@Iron: Troverai ulteriori informazioni di base [qui su MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms644994. Aspx # fonts) (e proprio quell'intero articolo). Penso che se capisci come funziona, scrivere il codice reale è la parte facile. Ma una rapida ricerca su Google per il codice di esempio risulta [questa classe template di dialogo] (http://www.flipcode.com/archives/DialogTemplate.cpp). Non so perché 'WM_INITDIALOG' non funzioni per te; Lo faccio sempre e tutto viene ridimensionato correttamente. –