2010-08-11 10 views
17

non sto usando una finestra di dialogo, im utilizzando la mia classe personalizzata che ho registrato e poi utilizzato la chiamata CreateWindow per crearlo, ho preimpostare il colore di sfondo rosso al momento della registrazione:Come impostare il colore di sfondo della finestra dopo averlo registrato?

WNDCLASSEX wc; 
wc.hbrBackground = CreateSolidBrush(RGB(255, 0, 0)); 

ma ora ho vuoi cambiare il colore di sfondo in fase di esecuzione, ad es facendo clic su un pulsante per cambiarlo in blu.

Ho provato a utilizzare la chiamata SetBkColor() in WM_PAINT e ho provato a restituire un pennello dal messaggio WM_CTLCOLORDLG, non funzionano.

aiuto?

risposta

17

Da Window Background deriva:

... Il sistema dipinge lo sfondo di una finestra o di dà la finestra opportunità di farlo inviandogli un messaggio WM_ERASEBKGND quando l'applicazione chiama BeginPaint. Se un'applicazione non elabora il messaggio ma passa a DefWindowProc, il sistema cancella la sfondo riempiendola con il modello in background pennello specificato dalla classe della finestra .....

.. .... Un'applicazione può elaborare il messaggio WM_ERASEBKGND anche se è definito un pennello di sfondo della classe . Questo è tipico nelle applicazioni che consentono all'utente di modificare il colore dello sfondo della finestra per una finestra specificata senza influire sulle altre finestre nella classe . In tali casi , l'applicazione non deve passare il messaggio a DefWindowProc. .....

Quindi, utilizzare il wParam del messaggio WM_ERASEBKGND per ottenere il DC e dipingere lo sfondo.

+0

Ci proverò, grazie – Kaije

+0

sì, ha funzionato. Ho gestito questo messaggio e ho usato la chiamata FillRect() per dipingere il mio background – Kaije

+0

Sono un po 'nuovo a Windows C++. Cosa intendi per 'DC' qui? –

10

Si può provare il seguente:

HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255)); 
    SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG)brush); 
+0

Questo lo cambia per tutte le istanze di quella classe. Avrai anche bisogno di invalidare la finestra per farla cancellare e ridipingere. –

+0

sì, questo ha funzionato, ma ho il mio wrapper di classe e la ragione per cui volevo impostarlo dopo la registrazione è perché voglio che le finestre della stessa classe abbiano colori di sfondo diversi – Kaije

+0

funziona come un incantesimo in WTL! – sailfish009

4

Risposta breve: handle WM_ERASEBKGND. risposta

più lunga:

Quando si registra il WNDCLASS, si sta fornendo informazioni su tutte le finestre di quella classe. Quindi, se vuoi cambiare il colore di una sola istanza della finestra, dovrai gestirla tu stesso.

Quando è il momento di ridipingere la finestra, il sistema invia il tuo wndproc un messaggio WM_ERASEBKGND. Se non lo gestisci, lo DefWindowProc cancellerà l'area client con il colore dalla classe della finestra. Ma puoi gestire direttamente il messaggio, dipingendo qualsiasi colore (o pattern di sfondo) che ti piace.

Problemi correlati