PDA

Visualizza la versione completa : [C] GUI in WIN32: resource e finestre


Gil Mour
10-04-2008, 12:52
Non ho capito una cosa fondamentale :p

So creare una classe ed una finestra via codice, impostando tutti i parametri a mano (dimensioni, posizione, stile, menu, ecc).

Inoltre so creare delle dialog box a partire da un modello di resource.

Quello che non riesco a capire come si fa creare una finestra avendone definito l'aspetto in un file .rc. Mi spiego meglio: posso creare un dialog da un file rc con un codice del genere



DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(ID D_MY_DIALOG), hwnd, DlgProc);


Invece per creare una finestra e definirne l'aspetto sono costretto, a mano, a valorizzare i campi delle WNDCLASSEX e ad passare i giusti parametri ad una delle CreateWindow. Inoltre, in questo modo, sarei costretto anche ad inserire i vari controlli di cui ho bisogno (bottoni,label,ecc) a runtime.

Come faccio a definire l'aspetto di una finestra da file .rc ?

MItaly
10-04-2008, 16:57
Un dialog una finestra, ed molto comodo da usare anche come finestra principale dell'applicazione quando dovresti aggiungere tanti controlli a mano.

XWolverineX
10-04-2008, 17:49
Con Visual Studio, facendo doppio click sulla finestra .rc, avrai un editor come quelli del .netFramework
Se non hai visual studio, dovrai scrivere il codice di quest'ultima a mano.

Gil Mour
11-04-2008, 12:12
veramente no, ed il problema proprio quello

posso editare i dialog e tutte le altre risorse (menu,icon, ecc) ma non la finestra principale

Gil Mour
11-04-2008, 14:03
Boh forse mi sono spiegato male, perche credo di trovarmi di fronte ad un problema banalissimo.
Provo a riformulare con maggiore precisione.



INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG Msg;
HWND hWnd;
WNDCLASSEX WndClsEx;


WndClsEx.cbSize = sizeof(WNDCLASSEX);
WndClsEx.style = CS_HREDRAW | CS_VREDRAW;
WndClsEx.lpfnWndProc = WndProcedure;
WndClsEx.cbClsExtra = 0;
WndClsEx.cbWndExtra = 0;
WndClsEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClsEx.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClsEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WndClsEx.lpszMenuName = NULL;
WndClsEx.lpszClassName = ClsName;
WndClsEx.hInstance = hInstance;
WndClsEx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);


RegisterClassEx(&WndClsEx);


hWnd = CreateWindowEx(0,
ClsName,
WndName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);


if( !hWnd ) return FALSE;


ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);


while( GetMessage(&Msg, NULL, 0, 0) )
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}

return Msg.wParam;
}


In questo modo ho creato una fantastica finestra vuota.
Adesso avrei bisogno di metterci dentro dei bottoni, delle label, delle cose

E mi piacerebbe farlo scrivendo in un file di risorse come deve presentarsi la finestra, piuttosto che creare ed aggiungere controlli a runtime.

Habanero
11-04-2008, 14:48
crea la tua finestra principale come se fosse una finestra di Dialogo e imposta opportunamente gli stili e gli stili estesi

Gil Mour
11-04-2008, 16:08
argh
e come?

Sto provando in questo modo ma non va, CreateDialog mi restituisce NULL




#include <windows.h>
#include "resource.h"


BOOL CALLBACK DialogProc (HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam);


int WINAPI WinMain
(HINSTANCE hInst, HINSTANCE hPrevInst, char * cmdParam, int cmdShow)
{


HWND hDialog;
MSG msg;
int status;


hDialog = CreateDialog (hInst,
MAKEINTRESOURCE(IDD_MAIN),
NULL,
DialogProc);

if (hDialog==NULL)
{
char buf [100];
wsprintf (buf, "Error x%x", GetLastError ());
MessageBox (0, buf, "CreateDialog", MB_ICONEXCLAMATION | MB_OK);
return 1;
}


while ((status = GetMessage (&msg, 0, 0, 0)) != 0)
{
if (status == -1)
return -1;
if (!IsDialogMessage (hDialog, &msg))
{
TranslateMessage ( &msg );
DispatchMessage ( &msg );
}
}

return msg.wParam;
}


BOOL CALLBACK DialogProc (HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
MessageBox(hwnd,"ciao","ciao",0);
return TRUE;

case WM_COMMAND:

return TRUE;
case WM_HSCROLL:

return 0;

case WM_DESTROY:
PostQuitMessage(0);
return TRUE;
case WM_CLOSE:

DestroyWindow (hwnd);
return TRUE;
}
return FALSE;
}

MItaly
11-04-2008, 21:48
Molto pi semplicemente:


#include <windows.h>
#include "resource.h"


BOOL CALLBACK DialogProc (HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char * cmdParam, int cmdShow)
{
return DialogBoxParam(hInst,MAKEINTRESOURCE(IDD_MAIN),0,D ialogProc,(LPARAM)cmdShow);
}
BOOL CALLBACK DialogProc (HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
ShowWindow(hwndDlg,(int)lParam);
return TRUE;
case WM_CLOSE:
//Occhio: con i dialog non devi usare DestroyWindow ma EndDialog
EndDialog(hwnd,0);
return TRUE;
//... altri case ...
}
return FALSE;
}

; infatti la DialogBoxParam include gi il message loop.

Gil Mour
14-04-2008, 11:19
E' corretto quindi dire che un Dialog solo un template di finestra?

MItaly
14-04-2008, 16:33
S, corretto. Infatti la DialogBoxParam legge la risorsa dialog che gli indichi e in base ad essa costruisce una finestra e la riempie di controlli (usando la CreateWindowEx); quindi imposta un message loop che termina solo quando viene "pescato" un WM_QUIT o quando la finestra creata viene distrutta.

Loading