Vraag Hoe de achtergrondkleur van het venster in te stellen nadat ik het heb geregistreerd?


Ik gebruik geen dialoogvenster, ik gebruik mijn eigen aangepaste klasse die ik heb geregistreerd en heb vervolgens de CreateWindow-aanroep gebruikt om deze te maken, ik heb de achtergrondkleur vooraf ingesteld op rood bij het registreren:

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

maar nu wil ik de achtergrondkleur veranderen tijdens runtime, bijvoorbeeld door op een knop klikken om deze in blauw te veranderen.

Ik heb geprobeerd de SetBkColor () -aanroep in WM_PAINT te gebruiken en probeerde een penseel uit het bericht WM_CTLCOLORDLG terug te sturen, maar deze werken niet.

alle hulp?


18
2017-08-11 22:48


oorsprong


antwoorden:


Van Venster achtergrond komt:

... Het systeem schildert de achtergrond voor a   venster of geeft het venster de   mogelijkheid om dit te doen door het een   WM_ERASEBKGND bericht wanneer de   applicatie-oproepen BeginPaint. Als een   toepassing verwerkt het   bericht maar geeft het door aan   DefWindowProc, het systeem wist de   achtergrond door het te vullen met de   patroon in de achtergrondborstel   gespecificeerd door de klasse van het venster .....

  ...... Een applicatie kan het   WM_ERASEBKGND bericht hoewel a   klasse achtergrondpenseel is gedefinieerd.   Dit is typisch in toepassingen die   schakel de gebruiker in om het venster te wijzigen   achtergrondkleur of patroon voor a   opgegeven venster zonder te beïnvloeden   andere vensters in de klas. In zulke   gevallen moet de aanvraag niet slagen   het bericht naar DefWindowProc. .....

Gebruik daarom de wParam van het WM_ERASEBKGND-bericht om de DC te krijgen en de achtergrond te schilderen.


18
2017-08-11 23:02



U kunt het volgende proberen:

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

12
2017-08-11 22:59



Kort antwoord: omgaan WM_ERASEBKGND.

Langer antwoord:

Wanneer u de WNDCLASS registreert, geeft u informatie over alle vensters van die klasse. Dus als u de kleur van slechts één exemplaar van het venster wilt wijzigen, moet u dit zelf doen.

Wanneer het tijd is om uw venster opnieuw te schilderen, verzendt het systeem uw wndproc a WM_ERASEBKGND bericht. Als je het niet aan, de DefWindowProc zal het clientgebied wissen met de kleur uit de vensterklasse. Maar je kunt de boodschap direct aan, je schildert elke gewenste kleur (of achtergrondpatroon).


4
2017-08-11 23:06