NM_CUSTOMDRAW Headera z ListView

Odpowiedz Nowy wątek
2006-08-15 19:36
0

Witam,

chcę rysować HEADERa z ListView
Header wysyła NM_CUSTOMDRAW do ListView jak się chce odświeżyć - tak? Więc, subklasowałem LV i do procedury wpisałem kod:

case WM_NOTIFY:{
         if(((HD_NOTIFY*)lParam) -> hdr.hwndFrom == ListView_GetHeader(hwnd)){
            switch(((HD_NOTIFY*)lParam)->hdr.code){
 
               case NM_CUSTOMDRAW:{
                  NMCUSTOMDRAW * nmc = (NMCUSTOMDRAW *)lParam;
 
                  switch(nmc -> dwDrawStage){
                     case CDDS_PREPAINT:{
                        RECT r;
                        GetClientRect(nmc -> hdr.hwndFrom, &r);
                        FillRect(nmc -> hdc, &r, gLBbrON); // bLBbrON - to BRUSH
                     }return CDRF_NOTIFYITEMDRAW;
 
                     case CDDS_ITEMPREPAINT:{
                        //Graphics graph(nmc -> hdc);
                        //LinearGradientBrush linGrBrush(
                        //   Point(0, 0),
                        //   Point(0, nmc -> rc.bottom),
                        //   gClrTlo2,
                        //   gClrTlo1);
                        //graph.FillRectangle(&linGrBrush, 0, 0, nmc -> rc.right, nmc -> rc.bottom);
                        FillRect(nmc -> hdc, &nmc -> rc, gLBbr);
                     }return CDRF_SKIPDEFAULT;
                  }
 
               }break;  // customdraw
             } // switch
         }  // czy z headera
      }break;

Czy to właśnie jest tak, że:

  • najpierw dostaje CDDS_PREPAINT i jak zwrócę CDRF_NOTIFYITEMDRAW to dla każdego malowanego item'a w headerze dostanę..
  • CDDS_ITEMPREPAINT i sobie tu namaluję itema i jak zwrócę CDRF_SKIPDEFAULT to znaczy, że sam go sobie pomalowałem i niech header idzie do następnego item'a.

Dobrze to wyczytałem? Jeśli tak to czemu to nie działa?? Tzn. działa tylko kod PREPAINT, a itemy już nie malują się. Tylko odrysowywana jest ta dziadowska ramka i separatory między itemami :-[

Pozostało 580 znaków

2006-08-16 11:24
0

A próbowałeś obsłużyć jeszcze inne flagi (CDDS_POSTPAINT i CDDS_ITEMPOSTPAINT)???

Pozostało 580 znaków

2006-08-16 11:53
0

No nie, ale jeśli otrzymałem CDDS_ITEMPREPAINT i zwrócę CDRF_SKIPDEFAULT to znaczy, że żadne inne komunikaty mają nie przychodzić, bo sam maluję itemy. W ogóle całe te NM_CUSTOMDRAW bezsensowne jest ;P
Chcę rysować itemy przez ten komunikat, bo niby nowe kontrolki tak się rysuję. Ale na razie mam zrobione to tak, że: subklasowałem jeszcze Headera i w tej procedurze obsługuję WM_ERASEBKGND i WM_PAINT. No i jest OK, ale chciałem wiedzieć czemu przez te NM_C... nie działa.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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