Realizzazione di una Finestra con le API Windows
3 Ottobre 2007 Programmazione
   





Costruzione di un Dialog Box

Per costruire un dialog box si può utilizzare un resource builder, nell'esempio si è utilizzato il resource builder di Visual C++. Sarà possibile inserire diversi componenti all'interno del dialog box e posizionarli a proprio piacimento, sarà possibile ridimensionare il dialog box e i vari componenti.

Figura 9. MS Visual C++ resource builder.
Una volta completato il disegno del dialog box si salva il file resource (con estensione rc) nella cartella dove risiede il progetto. Oltre al file con estensione rc il resource builder salverà il file resource.h  
Nell'esempio che segue sono stati inseriti nel dialog box un pannello, tre bottoni (connetti, disconnetti ed inserisci) e due componenti Edit.

Figura 10. Dialog Box.
Il file resource.h relativo al dialog box è il seguente

resource.h
  1. //{{NO_DEPENDENCIES}}
  2. // Microsoft Developer Studio generated include file.
  3. // Used by Script1.rc
  4. //
  5.  
  6. #define IDD_DIALOG1 101
  7. #define IDC_EDIT1 1002
  8. #define IDC_EDIT2 1004
  9. #define IDC_BUTTON1 1007
  10. #define IDC_BUTTON2 1008
  11. #define IDC_BUTTON3 1009
  12. #define IDC_STATIC -1
  13.  
  14. // Next default values for new objects
  15. //
  16. #ifdef APSTUDIO_INVOKED
  17. #ifndef APSTUDIO_READONLY_SYMBOLS
  18. #define _APS_NEXT_RESOURCE_VALUE 102
  19. #define _APS_NEXT_COMMAND_VALUE 40001
  20. #define _APS_NEXT_CONTROL_VALUE 1008
  21. #define _APS_NEXT_SYMED_VALUE 101
  22. #endif
  23. #endif

Il file script1.rc è il seguente

script1.rc
  1. //Microsoft Developer Studio generated resource script.
  2. //
  3. #include "resource.h"
  4.  
  5. #define APSTUDIO_READONLY_SYMBOLS
  6. /////////////////////////////////////////////////////////////////////////////
  7. //
  8. // Generated from the TEXTINCLUDE 2 resource.
  9. //
  10. #include "afxres.h"
  11.  
  12. /////////////////////////////////////////////////////////////////////////////
  13. #undef APSTUDIO_READONLY_SYMBOLS
  14. /////////////////////////////////////////////////////////////////////////////
  15. // Italian (Italy) resources
  16.  
  17. #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ITA)
  18. #ifdef _WIN32
  19. LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN
  20. #pragma code_page(1252)
  21. #endif //_WIN32
  22.  
  23. /////////////////////////////////////////////////////////////////////////////
  24. //
  25. // Dialog
  26. //
  27.  
  28. IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 289, 201
  29. STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
  30. CAPTION "Comunicazione"
  31. FONT 8, "MS Sans Serif"
  32. BEGIN
  33. GROUPBOX "Comunicazione",IDC_STATIC,7,7,201,187
  34. CTEXT "Output",IDC_STATIC,66,16,72,11,SS_CENTERIMAGE
  35. EDITTEXT IDC_EDIT3,13,28,187,92,ES_AUTOHSCROLL
  36. CTEXT "Input",IDC_STATIC,69,130,66,9,SS_CENTERIMAGE
  37. EDITTEXT IDC_EDIT5,13,143,187,40,ES_AUTOHSCROLL
  38. PUSHBUTTON "Connetti",IDC_BUTTON1,221,20,54,18
  39. PUSHBUTTON "Disconnetti",IDC_BUTTON2,221,49,54,17
  40. PUSHBUTTON "Inserisci",IDC_BUTTON3,220,122,54,18
  41. END
  42.  
  43. /////////////////////////////////////////////////////////////////////////////
  44. //
  45. // DESIGNINFO
  46. //
  47.  
  48. #ifdef APSTUDIO_INVOKED
  49. GUIDELINES DESIGNINFO DISCARDABLE
  50. BEGIN
  51. IDD_DIALOG1, DIALOG
  52. BEGIN
  53. LEFTMARGIN, 7
  54. RIGHTMARGIN, 282
  55. TOPMARGIN, 7
  56. BOTTOMMARGIN, 194
  57. END
  58. END
  59. #endif // APSTUDIO_INVOKED
  60.  
  61. #ifdef APSTUDIO_INVOKED
  62. /////////////////////////////////////////////////////////////////////////////
  63. //
  64. // TEXTINCLUDE
  65. //
  66.  
  67. 1 TEXTINCLUDE DISCARDABLE
  68. BEGIN
  69. "resource.h\0"
  70. END
  71.  
  72. 2 TEXTINCLUDE DISCARDABLE
  73. BEGIN
  74. "#include ""afxres.h""\r\n"
  75. "\0"
  76. END
  77.  
  78. 3 TEXTINCLUDE DISCARDABLE
  79. BEGIN
  80. "\r\n"
  81. "\0"
  82. END
  83.  
  84. #endif // APSTUDIO_INVOKED
  85.  
  86. #endif // Italian (Italy) resources
  87. /////////////////////////////////////////////////////////////////////////////
  88.  
  89. #ifndef APSTUDIO_INVOKED
  90. /////////////////////////////////////////////////////////////////////////////
  91. //
  92. // Generated from the TEXTINCLUDE 3 resource.
  93. //
  94.  
  95. /////////////////////////////////////////////////////////////////////////////
  96. #endif // not APSTUDIO_INVOKED

è costituito da direttive al compilatore che indicano i dati del dialog box (o in generale della finestra) da costruire. Il compilatore in base a questi dati inserirà nel codice del programma il codice che costruirà il dialog box (la finestra).
Nel file resource sono indicate la composizione della finestra, i vari componenti presenti, le loro dimensioni e la loro disposizione.

  1. IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 289, 201
  2. STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
  3. CAPTION "Comunicazione"
  4. FONT 8, "MS Sans Serif"
  5. BEGIN
  6. GROUPBOX "Comunicazione",IDC_STATIC,7,7,201,187
  7. CTEXT "Output",IDC_STATIC,66,16,72,11,SS_CENTERIMAGE
  8. EDITTEXT IDC_EDIT3,13,28,187,92,ES_AUTOHSCROLL
  9. CTEXT "Input",IDC_STATIC,69,130,66,9,SS_CENTERIMAGE
  10. EDITTEXT IDC_EDIT5,13,143,187,40,ES_AUTOHSCROLL
  11. PUSHBUTTON "Connetti",IDC_BUTTON1,221,20,54,18
  12. PUSHBUTTON "Disconnetti",IDC_BUTTON2,221,49,54,17
  13. PUSHBUTTON "Inserisci",IDC_BUTTON3,220,122,54,18
  14. END
  15.  
  16. /////////////////////////////////////////////////////////////////////////////
  17. //
  18. // DESIGNINFO
  19. //
  20.  
  21. #ifdef APSTUDIO_INVOKED
  22. GUIDELINES DESIGNINFO DISCARDABLE
  23. BEGIN
  24. IDD_DIALOG1, DIALOG
  25. BEGIN
  26. LEFTMARGIN, 7
  27. RIGHTMARGIN, 282
  28. TOPMARGIN, 7
  29. BOTTOMMARGIN, 194
  30. END
  31. END

In particolare, si indica il tipo di finestra e le sue dimensioni

  1. IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 289, 201

lo stile del dialog box, il testo che comparirà sulla toolbar, ed il font utilizzato

  1. STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
  2. CAPTION "Comunicazione"
  3. FONT 8, "MS Sans Serif"

Quindi si indicheranno tutti i componenti presenti, e per ogni componente si specificherà il tipo, l'identificatore (ad es. "comunicazione" o "connetti"), la posizione iniziale con riferimento al dialog box (la finestra), e le dimensioni (X e Y)

  1. BEGIN
  2. GROUPBOX "Comunicazione",IDC_STATIC,7,7,201,187
  3. CTEXT "Output",IDC_STATIC,66,16,72,11,SS_CENTERIMAGE
  4. EDITTEXT IDC_EDIT3,13,28,187,92,ES_AUTOHSCROLL
  5. CTEXT "Input",IDC_STATIC,69,130,66,9,SS_CENTERIMAGE
  6. EDITTEXT IDC_EDIT5,13,143,187,40,ES_AUTOHSCROLL
  7. PUSHBUTTON "Connetti",IDC_BUTTON1,221,20,54,18
  8. PUSHBUTTON "Disconnetti",IDC_BUTTON2,221,49,54,17
  9. PUSHBUTTON "Inserisci",IDC_BUTTON3,220,122,54,18
  10. END

Una volta prodotto il dialog box con il resource builder si dovrà produrre il codice C++. Il codice sarà simile a quello visto in precedenza per la costruzione di una finestra. Ci sarà una funzione WinMain e una funzione che sarà utilizzata per processare i comandi inviati al dialog box.
Si creerà il dialog box, in questo caso usando la funzione CreateDialog, invece della funzione CreateWindowEx utilizzata per creare una normale finestra, la si visualizzerà utilizzando la funzione ShowWindow, quindi ci si porrà in ascolto di comandi inviati al dialog box che saranno catturati ed inviati alla funzione DialogProc che si occuperà di processarli.

dialogbox.c
  1. #include <windows.h>
  2. #include "resource.h"
  3.  
  4. BOOL CALLBACK DialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  5. {
  6. switch (msg)
  7. {
  8. case WM_DESTROY: PostQuitMessage(0);
  9. return TRUE;
  10. case WM_CLOSE:
  11. DestroyWindow (hwnd);
  12. return TRUE;
  13. }
  14.  
  15. return FALSE;
  16. }
  17.  
  18. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char * cmdParam,
  19. int cmdShow)
  20. {
  21. HWND handle = 0;
  22. handle = CreateDialog (hInst, MAKEINTRESOURCE (IDD_DIALOG1), 0,
  23. (DLGPROC)DialogProc);
  24.  
  25. if (!handle)
  26. {
  27. MessageBox(NULL, "Dialog Box", "Errore!", MB_ICONEXCLAMATION | MB_OK);
  28. return 0;
  29. }
  30.  
  31. ShowWindow(handle, cmdShow);
  32. UpdateWindow(handle);
  33.  
  34. MSG message;
  35. while(GetMessage(&message, NULL, 0, 0) > 0)
  36. {
  37. TranslateMessage(&message);
  38. DispatchMessage(&message);
  39. }
  40.  
  41. return message.wParam;
  42. }

Per creare il dialog box si usa la funzione CreateDialog, la cui sintassi è la seguente

  1. HWND CreateDialog(
  2. HINSTANCE hInstance,
  3. LPCTSTR lpTemplate,
  4. HWND hWndParent,
  5. DLGPROC lpDialogFunc
  6. );

i parametri sono i seguenti

hInstance Handle del modulo che contiene il template del dialog box
lpTemplate Specifica il template del dialog box. è un puntatore ad una stringa che contiene il nome del template del dialog box o ad un intero che specifica l'identificatore della risorsa del template del dialog box, in questo caso si può usare la macro MAKEINTRESOURCE per creare questo valore.
hWndParent Handle della finestra che "possiede" il dialog box.
lpDialogFunc Puntatore alla funzione che processerà i messaggi diretti verso il dialog box.

Se la funzione ha successo il valore restituito è l'handle del dialog box, se non ha successo restituisce NULL.

La funzione CreateDialog utilizza la funzione CreateWindowEx per creare il dialog box, quindi invia il messaggio WM_INITDIALOG alla funzione che gestisce il dialog box, visualizza il dialog box se nel template (parametro lpTemplate passato a CreateDialog) è specificato, tramite WS_VISIBLE, che deve essere visibile, quindi termina e restituisce l'handle del dialog box.
Dopo che la CreateDialog ha terminato la sua esecuzione l'applicazione visualizza il dialog box utilizzando la funzione ShowWindow. L'applicazione elimina (distrugge) il dialog box utilizzando la funzione DestroyWindow.
La funzione che processerà i comandi diretti al dialog box è la funzione DialogProc, la cui sintassi è la seguente

  1. INT_PTR CALLBACK DialogProc(
  2. HWND hwndDlg,
  3. UINT uMsg,
  4. WPARAM wParam,
  5. LPARAM lParam
  6. );

tipicamente la funzione DialogProc dovrebbe restituire TRUE se ha processato il messaggio, o FALSE se non l'ha processato.

Come nella WndProc, nel caso di una finestra, all'interno della DialogProc si processeranno tutti i comandi inviati al dialog box.
Il dialog box prodotto sarà il seguente

Figura 11. Dialog box.

Pagina 4 di 5
Prec 1 2 3 4 5 Succ