C++ - CreateWindowEx

di il
1 risposte

C++ - CreateWindowEx

Dunque: per fare un pò di esercizio sto imparando le API di windows per creare finestre in Win32. La finestra principale si crea con CreateWindow; i controlli si aggiungono con CreateWindowEx.Su tutti i tutorial e anche sulla MSDN trovo scritto che per aggiungere i controlli bisogna gestire l'evento WM_CREATE. Solo che non funziona, perchè per creare le finestre figlie serve l'handle della finestra padre, mentre l'evento WM_CREATE si verifica prima del ritorno della funzione che crea la finestra padre, quindi l'handle della finestra padre non è ancora disponibile.
1).Possibile che sia sulla MSDN che su tutti i tutorial sia presente un errore così grossolano?
2).Qual'è l'evento da gestire per creare i controlli?

1 Risposte

  • Re: C++ - CreateWindowEx

    Ciao,

    Come ho risposto (anche) altrove :

    Facciamo un po'di luce sull'argomento... innanzitutto, alla creazione di un controllo (con la CreateWindowEx) il messaggio WM_CREATE viene inviato al controllo (come recita chiaramente MSDN), e non alla finestra genitore... per l'aggiunta di controlli (bottoni, label e quant'altro) il messaggio non è ovviamente intercettabile in maniera diretta (né c'è alcuno scopo per farlo).

    Per aggiungere controlli ad una finestra già esistente (la puoi creare anch'essa con la versione Ex, la differenza sta solo negli stili estesi WS_EX_xxx... stessa cosa per i controlli, puoi usare tranquillamente la CreateWindow) utilizzerai la funzione apposita (CreateWindow, ex o meno)...
    Normalmente questo processo di creazione dovrebbe avvenire nella WndProc del padre, alla ricezione (da parte del padre) della WM_CREATE... l'handle del padre lo ottieni giusto giusto nella WndProc(HWND hwnd,UINT uMSg,LPARAM,WPARAM). Nella wndproc dovresti, per sicurezza, sempre usare l'handle che ti viene passato e mai un eventuale handle salvato globalmente.

    In alternativa puoi aggiungere i controlli quando più ti aggrada, non c'è una regola fissa... si può pensare ad una funzione che, dato come parametro un HWND, aggiunga i controlli... basta chiamarla dopo la CreateWindow (principale) e prima della ShowWindow (principale) per evitare effetti fastidiosi a video...

    Per quanto riguarda le domande:
    1) Non so esattamente a quale tutorial tu ti riferisca... nella mia versione di MSDN (quella fornita assieme ad MSVC.NET 2003 Standard Edition) ci sono esempi, più che corretti, per i vari controlli che puoi aggiungere.

    2) Quello che preferisci, ma per evitare artefatti a video (pulsanti che appaiono qualche msec dopo che è apparsa la finestra) conviene che tu lo faccia prima di mostrarla (con la ShowWindow e/o la UpdateWindow) e prima di entrare nel ciclo di gestione dei messaggi ( while(!PeekMessage()) )


    PS: A proposito... ben vengano gli studi sull'utilizzo delle API per la creazione... per il futuro, comunque, ti consiglio di passare ad MFC (o equivalente). Quando le cose si complicano un minimo, scoprirai che la WndProc e tutti i suoi annessi/connessi può diventare velocemente un semplice incubo escheriano quando si cerca di scrivere un'interfaccia per la propria applicazione...
    In alternativa, comunque può essere un approfondimento interessante, a meno che tu non voglia scrivere un'applicazione SDI o MDI (single o multiple document interface), la strada più semplice è disegnare una dialog con l'editor di risorse e poi gestire quella (con le apposite API per caricare una dialog dalle risorse e gestirne i messaggi) piuttosto che aggiungere i controlli "a mano". Per applicazioni generiche il tutto è spesso molto meno intricato...

    Ciaociao Smile
Devi accedere o registrarti per scrivere nel forum
1 risposte