[WinAPI] Trackbar NM_CUSTOMDRAW

0

Witam,

jak w temacie. Rysuję trackbar'a. Kod:

case WM_NOTIFY:{
         switch(((NMHDR*)lParam)->code){
            case NM_CUSTOMDRAW:{
               NMCUSTOMDRAW * nmc = (NMCUSTOMDRAW *)lParam;
               if(nmc -> hdr.hwndFrom){
                  switch(nmc -> dwDrawStage){
                    // case CDDS_PREERASE:
                     case CDDS_PREPAINT:{
                        RECT r;
                        GetClientRect(GetDlgItem(hwnd, IDC_TRANSP), &r);
                        Graphics graph(nmc -> hdc);
                        LinearGradientBrush linGrBrush(
                           Point(0, 0),
                           Point(0, r.bottom),
                           gClrTlo2,
                           gClrTlo1);
                        graph.FillRectangle(&linGrBrush, 0, 0, r.right, r.bottom);
                        SetWindowLong(hwnd, DWL_MSGRESULT, (LONG)CDRF_NOTIFYITEMDRAW);
                     }return CDRF_NOTIFYITEMDRAW;

                     case CDDS_ITEMPREPAINT:{
                        switch(nmc -> dwItemSpec){
                           case TBCD_CHANNEL:{
                              FillRect(nmc -> hdc, &(nmc -> rc), gbETlo);
                           }break;

                           case TBCD_THUMB:{
                              Rectangle(nmc -> hdc, nmc -> rc.left, nmc -> rc.top, nmc -> rc.right, nmc -> rc.bottom);
                           }break;
                        }
                        SetWindowLong(hwnd, DWL_MSGRESULT, (LONG)CDRF_SKIPDEFAULT);
                     }return CDRF_SKIPDEFAULT;

                     default:
                        SetWindowLong(hwnd, DWL_MSGRESULT, (LONG)CDRF_SKIPDEFAULT);
                     return CDRF_SKIPDEFAULT;
                  }
               }
            }break;  // customdraw
         }
      }return 0;

Pytania: dlaczego bez SetWindowLong(... nie działa?
I podczas odswieżania okna rodzica zamalowywany jest SUWAK i PASEK. Muszę kliknąć i ruszyć, żeby się pokazał. Gdzie powinno byc malowanie tła Trackbara? W PREPAINTcie nie może? Nie powinno?

Hmm, problem - zamalowywanie po odświeżaniu - wystepuje dlatego, że okno ma ustawioną przezroczystość przez SetLayeredWindowsAttributes. Gdy usunę ustawianie przezroczystości problem znika. Czy ktoś z Was się spotkał z tym problemem?

0

DWL_MSGRESULT musisz ustawić tylko jeśli chcesz zwrócić coś konkretnego z bazowej klasy okna #32770, czyli z dialogboxa (potwierdzasz to przez return true).
W zwykłym oknie wystarczy return x. DWL_MSGRESULT ma kilka wyjątków gdzie wartość zwraca się wprost poprzez return, np. WM_CTLCOLOR*

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