Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698

    [C] GUI in WIN32: resource e finestre

    Non ho capito una cosa fondamentale

    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

    codice:
    DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_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 ?

  2. #2
    Un dialog è una finestra, ed è molto comodo da usare anche come finestra principale dell'applicazione quando dovresti aggiungere tanti controlli a mano.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    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.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    veramente no, ed il problema è proprio quello

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

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    Boh forse mi sono spiegato male, perche credo di trovarmi di fronte ad un problema banalissimo.
    Provo a riformulare con maggiore precisione.

    codice:
    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.

  6. #6
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    crea la tua finestra principale come se fosse una finestra di Dialogo e imposta opportunamente gli stili e gli stili estesi
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    argh
    e come?

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


    codice:
    #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;
    }

  8. #8
    Molto più semplicemente:
    codice:
    #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,DialogProc,(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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    E' corretto quindi dire che un Dialog è solo un template di finestra?

  10. #10
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.