[C++ WinAPI] GDI+ w WM_ERASEBKGND

0

Witam,

w Toolbarze maluje tło przechwytując WM_ERASEBKGND w subklasowanej procedurze za pomocą takiego kodu:

case WM_ERASEBKGND:{
         RECT r;
         GetClientRect(hwnd, &r);
         Graphics graph(hwnd);
         Color kolor = 0xFF000000 | GetSysColor(COLOR_MENU);
         LinearGradientBrush linGrBrush(
            Point(0, 0),
            Point(0, r.bottom),
            kolor,
            Color(255, 132, 209, 214));
         graph.FillRectangle(&linGrBrush, 0, r.top, r.right, r.bottom);

      }return TRUE;

I pojawia się problem, bo zamalowane zostają przyciski na Toolbarze. Jak najadę mychą na batona, to się pojawia, jak zjadę - znowu zostaje zamalowany przez FillRectangle'a.
Ustawiłem dla Toolbara WS_CLIPCHILDREN i WS_CLIPSIBLINGS i nic. Pewnie to GDI+ maluje jakoś bez opamiętania, tak? Czy jest jakiś sposób? Dopiero poznaje GDI+ więc.. :)

0

Może spróbuj wyciągnąć update region okna i ustawić go dla GDI+ - być może regiony GDI i GDI+ to nie to samo. Z drugiej strony, dlaczego nie malujesz w WM_PAINT??? Osobiście w swoich kontrolkach blokuje komunikat WM_ERASEBKGND - wszystko odbywa się w WM_PAINT.

0

Niestety w W_PAINT jest jeszcze gorzej - przycisków w ogóle nie widać.

LRESULT APIENTRY ToolBProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
   static RECT strect;
   static HDC hdc;
   PAINTSTRUCT  ps;

   switch(uMsg){
      case WM_PAINT:{
         hdc = BeginPaint(hwnd, &ps);
         GetClientRect(hwnd, &strect);
         Graphics graph(hdc); // lub hwnd
         Color kolor = 0xFF000000 | GetSysColor(COLOR_MENU);
         LinearGradientBrush linGrBrush(
            Point(0, 0),
            Point(0, strect.bottom),
            kolor,
            Color(255, 132, 209, 214));
         graph.FillRectangle(&linGrBrush, (int)ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom);

         EndPaint(hwnd, &ps);
      }return 0L;
   }
   return CallWindowProc(oldToolBProc, hwnd, uMsg, wParam, lParam);
}

W sumie to trochę dziwne, bo nawet gdy w WM_PAINT zostawię tylko dwie linijki kodu (BeginPaint i EndPaint) to i tak nie ma przycisków, dopiero jak usunę całkiem WM_PAINTa to są.

0

Przecież ich nie rysujesz, więc ich nie ma! :-D

Przyciski w toolbar nie są oknami - są rysowane przez toolbar w WM_PAINT.

wersja comctl 4.7
TBSTYLE_CUSTOMERASE -> NM_CUSTOMDRAW

0

Ok, wiem jak to zrobić - NM_CUSTOMDRAW itp..

Ale, chcę malować tło Dialogu. Robię to w WM_PAINT. I wszystko jest OK, dzieci mają WS_CLIPCHILDREN, nie są zarysowywane przez tło jak to ma miejsce przy W_ERA...., jest jednak ALE - testowałem czy aby na pewno jest OK i przy poruszaniu innym programem nad tym dialogiem, który ma malowane tło przez GDI+ - pojawiają się niezamalowywane obszary. Robię to takim kodem jak wyżej. No i... ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1