Win32 API - změna pozadí
Chtěl bych se zeptat jak je možné změnit barvu pozadí v okně v aplikaci Win32 API ?
Konkrétně při tvorbě instance okna:
int ColorR,ColorG,ColorB = 0; //rozsah mozny 0 ~ 255
WNDCLASSEX wcex;
wcex.hbrBackground = (HBRUSH)COLOR_WINDOW;
wcex.hbrBackground = CreateSolidBrush(RGB(ColorR,ColorG,ColorB));
Uvedena ukazka funguje pri prvotnim spusteni instance okna.
Pokud je pozdeji kdekoliv ve funkci pouzito:
ColorR=100;
ColorG=255;
ColorB=100;
InvalidateRect(hWnd, NULL, TRUE); // Prekresleni okna
Tak to samozrejme nefunguje.......
Musis pri WM_ERASEBACKGROUND (doufam, ze se tak ta zprava jmenuje) zajistit, aby se okno prekreslilo, jak potrebujes
Jo. To bude ono. Ale nedari se mi najit priklad z kama by to slo pochopit (hotový)
Najprv by si mal napisat ako ten program robis, mas vlastnu WindowProc alebo pouzivas nejaky "framework" (MFC apod).
Co na tom treba pochopit, zavesis sa na ten message a vykreslis obdlznik (PatBlt()) podla toho ktory obdlznik je invalidovany (GetClipBox()), pozri si MSDN.
P.S. a vratis nenulovu hodnotu.
P.S.2. inac aj google najde toho dost:
WM_ERASEBKGND sample
Samozrejme ze menit tie premenne po zavolani CreateSolidBrush (po vytvoreni triedy okna) je uz nanic, ani si nemusel robit tie premenne staci dat do toho RGB(...) konstanty.
BTW. naco tam mas wcex.hbrBackground = (HBRUSH)COLOR_WINDOW; ?
Ak to chces dynamicky menit tak napr. nastavit wcex.hbrBackground = NULL a pozadie si kreslit sam, bud spracovat message WM_ERASEBKGND, alebo vo WM_PAINT po BeginPaint testovat polozku fErase v PAINTSTRUC a ak je true tak prekreslit najprv pozadie v invalidovanom rectangle.
Ak budes chciet aj ovplyvnovat pozadie child dialogovych komponentov, tak potom je asi zaujimava aj notifikacia WM_CTLCOLOR.
Díky. Někdo se mě ptá a má to takto:
... a konečně vytvoření instance okna atd.....
Při volání funkcí:
SetZelenou
SetCervenou
By se tak mělo stát......
Uz som pisal vyssie co treba robit, wcex.hbrBackground = NULL a potom musi zmenit MyWndProc, bud tam pridat dalsi case (pre WM_ERASEBKGND) alebo pridat mazanie pozadia v sekcii ktora tam je pre WM_PAINT. Pouzit moze tie 3premenne co uz ma, nebude musiet menit funkcie SetZelenou, SetCervenou atd.
To
je preboha co.
Dobré toho si nevšímej.
Přesnější nápověda by nebyla ? Píšeš co změnit, ale ne jak to změnit.
Když tomu sám nerozumím tak nemůžu pomoci.
Programovat za druhych sa mi fakt nechce. Na konkretnu otazku poradim, ale nie ze budem pisat kod za druhych. Preco chce ten niekto "programovat" ak nezvladne ani tak jednoduchu zalezitost?
Pisal som vyssie aj o google, ako inspiracia sa da pouzit napr. http://support.microsoft.com/?scid=kb%3Ben-us%3B103 786&x=10&y=19 ten prvy sample code, je to ale pisane pre MFC staci to zmenit na ciste WinAPI volania (nazvy fcii su tie iste). A to co tam je (upravene) vlozis do novej sekcie case WM_ERASEBKGND: v MyWndProc
P.S. na popis WinAPI funkcii pouzivaj MSDN, ak nemas lokalne, tak msdn.microsoft.com
Máš pravdu. Těch pět řádků by bylo moc.
Nejde mi o 5riadkov ale ide mi o princip (poradit vs. robit nieco za niekoho)
Inac moze tam byt tych riadkov aj viac, fcia GetClipBox ma podla MSDN aj navratovu hodnotu, ktoru by bolo dobre asi aj testovat, to chce ale najprv si poriadne precitat popis tej fcie v MSDN, a prip. ak to nie je pochopitelne z popisu fcie ako to funguje tak pouzit v MSDN aj linky na suvisiace temy (clipping regions apod)...
... například on tam má funkce void...
co?
Inac este jedna vec ktoru budes potrebovat: V tom
budes mat HDC v premennej wParam (mas to popisane v MSDN v popise WM_ERASEBKGND).