Toon posts:

[C/win32] Edit controls achtergrondkleur instellen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een leuk woordspelletje en nu zit ik met het probleem dat het me niet lukt om de achtergrondkleur van de edit-box controls in te stellen. Het is dus de bedoeling dat de achtergrond rood wordt. Ik heb het volgende al geprobeerd:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
...
if (Message==WM_CTLCOLORSTATIC) return ColorHandler(hwnd, wParam, lParam);
...

BOOL ColorHandler(HWND hwnd, WPARAM wParam, LPARAM lParam) {
    HDC hdcStatic = (HDC) wParam;       // handle to display context 
    HWND hwndStatic = (HWND) lParam;    // handle to static control 

    SetBkColor(hdcStatic, RGB(0,0, 255));
    SetTextColor(hdcStatic, RGB(255, 0, 0));
//  SetBkMode(hdcStatic, OPAQUE);
    return TRUE;
}


En wat variaties hierin. SetBkColor lijkt gewoon niet te werken! Ik had ook ergens gelezen dat je een nieuwe brush moest aanmaken en die meegeven, maar hoe moet dat dan?

Verwijderd

Topicstarter
http://www.winprog.org/tutorial/dlgfaq.html

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
HBRUSH g_hbrBackground;
...
g_hbrBackground = CreateSolidBrush(RGB(0, 0, 255));
...
BOOL ColorHandler(HWND hwnd, WPARAM wParam, LPARAM lParam) {
    HDC hdcStatic = (HDC) wParam;       // handle to display context 
    HWND hwndStatic = (HWND) lParam;    // handle to static control 

    SetBkColor(hdcStatic, RGB(0,0, 255));
    SetTextColor(hdcStatic, RGB(255, 0, 0));
    
    return g_hbrBackground;
}


Ik snap nog niet helemaal hoe je een HBRUSH kan teruggeven als je je functie BOOL gedeclareerd hebt, maar het werkt nu in ieder geval.

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Voor een edit control wordt WM_CTLCOLOREDIT gebruikt als ie enabled is, anders WM_CTLCOLORSTATIC. Ik weet niet of je een dialog als main window gebruikt, zoja vergeet dan niet dat het retourneren van een waarde in een DlgProc anders gaat dan in een WndProc. Bij een dialog is de returnwaarde TRUE of FALSE en geeft aan of de message afgehandeld is of niet. De 'echte' return waarde kan geset worden met SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult) en dat moet dus met de brush gebeuren als je een dialog hebt (wordt volgens mij fout gedaan in die tutorial).

[ Voor 6% gewijzigd door madwizard op 10-03-2003 00:08 ]

www.madwizard.org


Verwijderd

Topicstarter
madwizard schreef op 10 March 2003 @ 00:08:
Ik weet niet of je een dialog als main window gebruikt,
Ja, een dialog als main window en daarop staan 100+ editboxes, waarvan het meerendeel read-only.
vergeet dan niet dat het retourneren van een waarde in een DlgProc anders gaat dan in een WndProc. Bij een dialog is de returnwaarde TRUE of FALSE en geeft aan of de message afgehandeld is of niet.
Dus als ik TRUE return gebeurt er niets meer, als ik FALSE return wordt de message nog doorgestuurd naar de standaard message-handler. Moet ik dan hier FALSE teruggeven omdat ik wel wil dat de achtergrond getekend wordt?
De 'echte' return waarde kan geset worden met SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult) en dat moet dus met de brush gebeuren als je een dialog hebt (wordt volgens mij fout gedaan in die tutorial).
Dank je, ik zal het morgen eens proberen.

[ Voor 1% gewijzigd door Verwijderd op 10-03-2003 00:33 . Reden: typo ]


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Verwijderd schreef op 10 March 2003 @ 00:33:
Dus als ik TRUE return gebeurt er niets meer, als ik FALSE return wordt de message nog doorgestuurd naar de standaard message-handler. Moet ik dan hier FALSE teruggeven omdat ik wel wil dat de achtergrond getekend wordt?
Nee wel TRUE teruggeven, het gaat puur om het bericht dat je afhandeld.. WM_CTLCOLORSTATIC/EDIT is gewoon een notificatie voor de parent window dat een window bijna getekend wordt die de mogelijkheid biedt nog dingen in te stellen voordat dat gebeurd. Als je de message afhandeld moet je gewoon TRUE retourneren, tenzij je echt wil dat de default handler er ook nog eens overheen gaat (kan heel soms wel eens handig zijn) maar aangezien die bij deze message hoogstwaarschijnlijk niks doet is dat niet je bedoeling.

www.madwizard.org


Verwijderd

Topicstarter
madwizard schreef op 10 March 2003 @ 20:08:
[...]

Nee wel TRUE teruggeven.
Er staat ook in de handleiding dat je TRUE moet teruggeven, omdat anders een andere message-handler je waarde overschrijft. Het is me echter niet gelukt dit werkend te krijgen (met SetWindowLong). De brush teruggeven met return werkt wel, maar iets zegt me dat dat niet de goede manier is.

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Hmm, ik zie net dit in de PSDK bij WM_CTLCOLORSTATIC (WM_CTLCOLOREDIT hetzelfde verhaal):
If a dialog box procedure handles this message, it should cast the desired return value to a BOOL and return the value directly. If the dialog box procedure returns FALSE, then default message handling is performed. The DWL_MSGRESULT value set by the SetWindowLong function is ignored.
Moet dus wel gewoon returnen, al is dat niet de normale methode.
Verwijderd schreef op 11 March 2003 @ 00:53:
Er staat ook in de handleiding dat je TRUE moet teruggeven, omdat anders een andere message-handler je waarde overschrijft. Het is me echter niet gelukt dit werkend te krijgen (met SetWindowLong). De brush teruggeven met return werkt wel, maar iets zegt me dat dat niet de goede manier is.
SetWindowLong is dus het probleem, je kan die brush gewoon teruggeven, maar:
The system does not automatically destroy the returned brush. It is the application's responsibility to destroy the brush when it is no longer needed.
Dus zeker niet steeds een brush aanmaken want dan kan je ze niet meer wissen, gewoon 1 als je programma start en als je programma afsluit die brush weer deleten.

www.madwizard.org

Pagina: 1