Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    455

    [C++] Finestre multiple

    Ciao a tutti,
    vorrei sapere come fare per realizzare piu' finestre ed averne pieno controllo.

    Insieme all'aiuto della guida Microsoft ho tirato fuori questo:

    [CLASSE EditorCore.h]

    codice:
    #include <windows.h>
    #include <stdlib.h>
    #include <string.h>
    #include <tchar.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    class EditorCore
    {
    public:
    	
    	WNDCLASSEX WndClass[10];
    	HWND hWnd[10];
    
    	int CreateEditorWindow(int wndcID,HINSTANCE hInstance,int nCmdShow)
    	{
         WndClass[wndcID].cbSize = sizeof(WNDCLASSEX);
         WndClass[wndcID].style          = CS_HREDRAW | CS_VREDRAW;
         WndClass[wndcID].lpfnWndProc    = WndProc;
         WndClass[wndcID].cbClsExtra     = 0;
         WndClass[wndcID].cbWndExtra     = 0;
         WndClass[wndcID].hInstance      = hInstance;
         WndClass[wndcID].hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
         WndClass[wndcID].hCursor        = LoadCursor(NULL, IDC_ARROW);
         WndClass[wndcID].hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
         WndClass[wndcID].lpszMenuName   = NULL;
         WndClass[wndcID].lpszClassName  = _T("win32app");
         WndClass[wndcID].hIconSm        = LoadIcon( WndClass[wndcID].hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    
    	 WindowRegister(wndcID);
    
    	 hWnd[wndcID] = CreateWindow(_T("Wname"),_T("wTitle"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,800,600,NULL,NULL,hInstance,NULL);
    
    	 if(!hWnd)
    	 {
    		 MessageBox(NULL,_T("Call to CreateWindow failed!"),_T("Win32 Guided Tour"),NULL);
    	 }
    
    	 ShowEditorWindow(wndcID,nCmdShow);
    
        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        return (int) msg.wParam;
    
    	}
    	void WindowRegister(int wndcID)
    	{
    		if (!RegisterClassEx(&WndClass[wndcID]))
    		{
    			MessageBox(NULL,_T("Call to RegisterClassEx Failed!"),_T("Win32 Guided Tour"),NULL);
    		}
    	}
    	void ShowEditorWindow(int wndID,int nCmdShow)
    	{
    		ShowWindow(hWnd[wndID],nCmdShow);
    		UpdateWindow(hWnd[wndID]);
    	}
    	
    };
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
               case WM_CREATE:
    
                    break;
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    [CLASSE Editor.cpp]

    codice:
    #include "EditorCore.h"
    
    EditorCore test;
    
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nCmdShow)
    {
    	test.CreateEditorWindow(0,hInstance,nCmdShow);
    
    }
    Ma non funziona... non da errori e non parte...

  2. #2
    Perché registri 10 volte la stessa classe-finestra e poi crei la finestra specificando un nome di classe-finestra inesistente? Dovresti riguardarti le basi della programmazione Win32, in particolare la relazione tra finestre e window classes.

    Se devi creare tante finestre con gli stessi attributi di base (in particolare, la stessa WndProc) la cosa corretta da fare è registrare una singola window class, e creare le finestre usando la window-class in questione come base.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    455
    Originariamente inviato da MItaly
    Perché registri 10 volte la stessa classe-finestra e poi crei la finestra specificando un nome di classe-finestra inesistente? Dovresti riguardarti le basi della programmazione Win32, in particolare la relazione tra finestre e window classes.

    Se devi creare tante finestre con gli stessi attributi di base (in particolare, la stessa WndProc) la cosa corretta da fare è registrare una singola window class, e creare le finestre usando la window-class in questione come base.
    Ok, adesso dopo aver creato il nome della finestra funziona.

    Ora,dopo aver fatto un paio di prove, ho visto che usando lo stesso LRESULT CALLBACK tutte le finestre vengono gestite da quella funzione.
    Quindi se ad esempio in questo processo creo un pulsante mi si creerà in entrambe le finestre.

    Come posso creare altri LRESULT CALLBACK?

    Per ogni finestra ne devo creare uno?

  4. #4
    Se la gestione dei messaggi delle varie finestre deve essere differente in maniera significativa conviene avere più window classes, ognuna con la sua window procedure; se invece il grosso del codice è condiviso (le finestre di base sono sostanzialmente equivalenti), usa un'unica window class e disambigua quale finestra stai trattando nella window procedure (tipicamente si fa associando un puntatore ad una struct come "dati utenti" associati ad una finestra - vedi SetWindowLongPtr & co.).

    In realtà, comunque, quando si lavora in C++ la costruzione che si fa è di questo tipo:
    - una classe C++ va a corrispondere ad una window class, registrata al momento della prima creazione di un oggetto di quel tipo (puoi usare un campo static a questo proposito); la window class in questione usa come window procedure un metodo static della classe;
    - ad ogni istanziazione della classe C++, si crea una finestra (basata sulla window class associata alla classe) e si memorizza this nei "dati utente" associati alla finestra con SetWindowLongPtr;
    - dentro alla window procedure (che, ricordo, è static) si può quindi recuperare la specifica istanza della finestra su cui si sta lavorando usando GetWindowLongPtr.

    In ogni caso, l'impressione che ho è che tu non abbia ben presente come siano strutturate le API Win32 di gestione delle finestre, prima di avventurarti in un terreno spinoso come questo dovresti quantomeno leggerti un po' di documentazione o (meglio) un buon libro in proposito.
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.