Realizzazione di una Finestra con le API Windows | |||
Mer 03 Ott 2007 |
|
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.
Figura 10. Dialog Box.
resource.h
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by Script1.rc
//
#define IDD_DIALOG1 101
#define IDC_EDIT1 1002
#define IDC_EDIT2 1004
#define IDC_BUTTON1 1007
#define IDC_BUTTON2 1008
#define IDC_BUTTON3 1009
#define IDC_STATIC -1
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1008
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
Il file script1.rc è il seguente
script1.rc
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Italian (Italy) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ITA)
#ifdef _WIN32
LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 289, 201
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Comunicazione"
FONT 8, "MS Sans Serif"
BEGIN
GROUPBOX "Comunicazione",IDC_STATIC,7,7,201,187
CTEXT "Output",IDC_STATIC,66,16,72,11,SS_CENTERIMAGE
EDITTEXT IDC_EDIT3,13,28,187,92,ES_AUTOHSCROLL
CTEXT "Input",IDC_STATIC,69,130,66,9,SS_CENTERIMAGE
EDITTEXT IDC_EDIT5,13,143,187,40,ES_AUTOHSCROLL
PUSHBUTTON "Connetti",IDC_BUTTON1,221,20,54,18
PUSHBUTTON "Disconnetti",IDC_BUTTON2,221,49,54,17
PUSHBUTTON "Inserisci",IDC_BUTTON3,220,122,54,18
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
IDD_DIALOG1, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 282
TOPMARGIN, 7
BOTTOMMARGIN, 194
END
END
#endif // APSTUDIO_INVOKED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // Italian (Italy) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#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.
IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 289, 201
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Comunicazione"
FONT 8, "MS Sans Serif"
BEGIN
GROUPBOX "Comunicazione",IDC_STATIC,7,7,201,187
CTEXT "Output",IDC_STATIC,66,16,72,11,SS_CENTERIMAGE
EDITTEXT IDC_EDIT3,13,28,187,92,ES_AUTOHSCROLL
CTEXT "Input",IDC_STATIC,69,130,66,9,SS_CENTERIMAGE
EDITTEXT IDC_EDIT5,13,143,187,40,ES_AUTOHSCROLL
PUSHBUTTON "Connetti",IDC_BUTTON1,221,20,54,18
PUSHBUTTON "Disconnetti",IDC_BUTTON2,221,49,54,17
PUSHBUTTON "Inserisci",IDC_BUTTON3,220,122,54,18
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
IDD_DIALOG1, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 282
TOPMARGIN, 7
BOTTOMMARGIN, 194
END
END
In particolare, si indica il tipo di finestra e le sue dimensioni
IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 289, 201
lo stile del dialog box, il testo che comparirà sulla toolbar, ed il font utilizzato
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Comunicazione"
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)
BEGIN
GROUPBOX "Comunicazione",IDC_STATIC,7,7,201,187
CTEXT "Output",IDC_STATIC,66,16,72,11,SS_CENTERIMAGE
EDITTEXT IDC_EDIT3,13,28,187,92,ES_AUTOHSCROLL
CTEXT "Input",IDC_STATIC,69,130,66,9,SS_CENTERIMAGE
EDITTEXT IDC_EDIT5,13,143,187,40,ES_AUTOHSCROLL
PUSHBUTTON "Connetti",IDC_BUTTON1,221,20,54,18
PUSHBUTTON "Disconnetti",IDC_BUTTON2,221,49,54,17
PUSHBUTTON "Inserisci",IDC_BUTTON3,220,122,54,18
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
#include <windows.h>
#include "resource.h"
BOOL CALLBACK DialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY: PostQuitMessage(0);
return TRUE;
case WM_CLOSE:
DestroyWindow (hwnd);
return TRUE;
}
return FALSE;
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char * cmdParam,
int cmdShow)
{
HWND handle = 0;
handle = CreateDialog (hInst, MAKEINTRESOURCE (IDD_DIALOG1), 0,
(DLGPROC)DialogProc);
if (!handle)
{
MessageBox(NULL, "Dialog Box", "Errore!", MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(handle, cmdShow);
UpdateWindow(handle);
MSG message;
while(GetMessage(&message, NULL, 0, 0) > 0)
{
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam;
}
Per creare il dialog box si usa la funzione CreateDialog, la cui
sintassi è la seguente
i parametri sono i seguenti
Se la funzione ha successo il valore restituito è l'handle del dialog box, se non ha successo restituisce NULL.
HWND CreateDialog(
HINSTANCE hInstance,
LPCTSTR lpTemplate,
HWND hWndParent,
DLGPROC lpDialogFunc
);
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
tipicamente la funzione DialogProc dovrebbe restituire TRUE se ha processato il messaggio, o FALSE se non l'ha processato.
INT_PTR CALLBACK DialogProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
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.