15/12: Executar un quadre de diàleg en Win32 i c++
Una de les coses a les que ens malacostuma l'assistent de programes Win32 de Visual Studio és a fer les coses més simples molt més complexes del que han de ser... Per això moltes vegades per no complicar-me la vida quan havia de fer un programa que només contingués un quadre de diàleg.
Una opció seria crear els controls en temps d'execució en la finestra principal, però sovint és massa feina per fer un programa simple.
El procediment que feia servir inicialment era fer servir l'assistent del Visual Studio per crear un projecte bàsic i en el WndProc() capturava el missatge WM_CREATE (que es rep abans de mostrar la finestra) i allà executava el quadre de diàleg i després matava el programa.
...
switch (message)
{
case WM_CREATE:
DialogBox(hInst, (LPCTSTR)IDD_DIALEG, hWnd, (DLGPROC)Dialeg);
PostQuitMessage(0);
break;
...
Això feia que es veiés només el quadre de diàleg i que el programa es morís abans de mostrar la finestra principal (recordo que en el moment en que es rep el WM_CREATE encara no tenim la finestra visible)
Però està clar que hi ha formes millors de fer-ho. Perquè crear una finestra principal si no ens fa falta?
Per això el procediment més adequat seria no fer servir l'assistent gràfic i crear nosaltres mateixos el programa. Per fer-ho durant la creació de projectes hem d'anar a les "opcions de configuració de l'aplicació" i crear un projecte en blanc:

Això ens farà un projecte sense res, ni recursos ni fitxers de codi, i per tant els hem d'afegir manualment. Anem a la "Vista de recursos" i afegim un quadre de diàleg estàndard i li donem el nom que vulguem:

Per afegir el codi anem a "Explorador de sol·lucions" i hi afegim un arxiu de tipus .CPP (en el meu cas li he dit main.cpp)

Ara hem d'afegir el codi necessari per poder executar un programa. Necessitem una funció WinMain (punt d'entrada del programa), una funció de control de missatges del nostre quadre de diàleg
#include <windows.h>
#include "Resource.h"
HWND hWnd;
HINSTANCE hInst;
LRESULT CALLBACK Dialeg(HWND hdlg, UINT Msg, WPARAM wParam, LPARAM lParam);
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
hInst = hInstance;
DialogBox(hInst, MAKEINTRESOURCE(IDD_CONTROLS_DLG), hWnd,
reinterpret_cast(Dialeg));
return FALSE;
}
Aquí està tota la gràcia de l'assumpte. Podem oblidar-nos completament del famós bucle de missatges perquè ja està implementat en el DialogBox! Com que el DialogBox mostra finestres modals el programa anirà fent fins que es tanqui la finestra i després podem acabar directament.
La finestra de control de missatges del quadre de diàleg és normal o sigui que una cosa com aquesta ja funcionaria pel quadre de diàleg per defecte:
LRESULT CALLBACK Dialeg(HWND hDlg, UINT Msg,WPARAM wParam,LPARAM lParam)
{
switch(Msg)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
case IDCANCEL:
EndDialog(hDlg, 0);
return TRUE;
}
break;
}
return FALSE;
}
Més simple impossible. Cada dia m'agrada més fer coses amb C++ unmanaged :-)
Categoria: Programació | | Fet per: Xavier
Commentaris
Sense comentarisAfegir Comentari
Els comentaris que feu requereixen revisió per evitar que un jutge espanyol em condemni a mi


