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.

Calculadora de xarxa


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:

Opcions


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:
Afegir quadre de diàleg


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)
Afegir arxiu 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 comentaris

Afegir Comentari

Els comentaris que feu requereixen revisió per evitar que un jutge espanyol em condemni a mi

:

:
: