自绘WTL的CListViewCtrl

来源:互联网 发布:田刚丘成桐事件知乎 编辑:程序博客网 时间:2024/05/05 17:16

CListViewCtrl对应MFC中的是CListCtrl,

 CListViewCtrl的自绘本身绘制方法,和其他带有OwnerDraw(我的意思是从COwnerDraw类继承过来的) 的绘制方法基本相同,不过和其他控件相比其中有两个问题还是很棘手的,
1,其中就是ListItem的高度要在MeasureItem的函数中修改,例子代码
void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
  {
  lpMeasureItemStruct->itemHeight  = 26;
  }
但是你如果是在它的父窗口中使用SubclassWindowed,而非Create(Xe)d,你回发现你的MeasureItem函数根本就没执行过,在WM_INITDIALOG消息之前就没有收到过WM_MEASUREITEM消息,所以我们必须通过其他方式(move window)来强迫系统发送WM_MEASUREITEM消息给我们
例子:

void ForceMeasureItemMessage()
 {
  // I just want to nudge it up a little.
  CRect window_rect;
  GetWindowRect(&window_rect);
  CPoint pt = window_rect.TopLeft();
  ::ScreenToClient(GetParent(), &pt);
  window_rect.right = pt.x + window_rect.Width();
  window_rect.left = pt.x;
  window_rect.bottom = pt.y + window_rect.Height();
  window_rect.top = pt.y + 1;
  MoveWindow(window_rect);

  // Alright now move it back.
  window_rect.top = pt.y;
  MoveWindow(window_rect);
 }

这个函数你必须在父窗口的的OnInitDialog函数中调用才能有效.

 

 

还有一个棘手的问题就是在你使用带有header的ClistViewCtrl的时候,还要绘制header,我现在不知道是我自己没弄好还是怎么会事,我自己重载的CHeaderCtrl控件类就是收不到WM_DRAWITEM消息,不过能收到WM_PAINT消息我就在OnPaint函数中把它给我画了出来,反正我也不要这个Header做什么事情,只是一个显示就够了,

还有就是这个Header的高度,我试了好多中方法都没有用,除了改变它的点阵字体的大小了.不过这个字体并不是我们将来显示的字体的大小,整个header都是绘制的,当然显示的字也是你绘制的,在绘制字的时候你可以再次设置dc显示的字体.

哦,对了还有,就是刚知道一个绘制渐变的简单方法,是有api的函数可以使用的

来看一下,可能对你有帮助的哦

 TRIVERTEX tv[] = {
  { rect.left, rect.top,0,0x4600,0xC300},
  { rect.right, rect.bottom, 0x0700,0xb200,0xf800}
 };
 GRADIENT_RECT gr = { 0, 1 };

 dc.GradientFill ( tv, 2, &gr, 1, GRADIENT_FILL_RECT_V );

 

好了来看我绘制的ClistViewCtrl吧

原创粉丝点击