实现自定义注解,实现自定义指令

  实现自定义注解,实现自定义指令

  Mfc内置的listctrl虽然可以完成一些常见的操作,但是对于一些特定的应用却无能为力。这时候就需要拓展空间来实现满足特定需求的功能。

  阐述了如何实现自定义行高的listctrl控件,可以选择和编辑。

  二。实现

  (1)实现自定义行高。

  众所周知,mfc自带的listctrl控件的行高是固定的,不能由用户自定义更改。如果设置更大的位图或者只是简单的设置更大的字体,这些方法可以改变行高,但是并没有触及问题的本质。我们使用消息反射机制来实现自定义行高。有关消息反射机制,请参见msdn。自定义行高listctrl的实现是基于我们在给listctrl发送WM_WINDOWPOSCHANGED消息的时候,也就是说告诉list ctrl控件的大小和位置发生了变化。这时listctrl控件会触发WM_MEARSURITEM消息,当然是反射消息。通过映射此消息,我们可以更改listctrl控件的行高。当然,你也应该设置Owen Draw Fixed style的固定样式。WM_MEARSURITEM只在Owen Draw Fixed style中有效。

  总而言之,如果您想创建一个具有自定义行高的listctrl,您可能应该采取以下步骤:

  (1)定义一个新类,继承listctrl,设置Owen Draw Fixed style,手动映射ON_WM_MEASUREITEM_REFLECT消息。

  (2)增加设置行高的接口,发送WM_WINDOWPOSCHANGED消息触发ON_WM_MEASUREITEM_REFLECT消息,例如:

  void CListEx:SetItemHeight(UINT n height)

  {

  m _ nItemHeight=nHeight

  CRect rcWin

  GetWindowRect(RC win);

  WINDOWPOS wp

  wp.hwnd=m _ hWnd

  wp.cx=rcWin。width();

  wp.cy=rcWin。height();

  WP . flags=SWP _诺activate SWP _诺莫夫 SWP _诺沃纳佐德 SWP _诺佐德;

  SendMessage(WM _ WINDOWPOSCHANGED,0,(LPARAM)WP);

  }

  (3)映射ON_WM_MEASUREITEM_REFLECT消息,设置反射消息中的行高,例如:

  voidCListEx:measure item(LPMEASUREITEMSTRUCT LPMEASUREITEMSTRUCT)

  {

  lpMeasureItemStruct-item height=m _ nitem height;

  }

  (4)完成控件自绘功能,CListEx:DrawItem。从此实现了自定义设置行高的功能。

  第三,增加编辑功能。

  添加编辑功能的总体思路是在点击或双击时创建一个CEDIT编辑框,然后将编辑框叠加在当前子项上,使编辑框获得焦点。当编辑框失去焦点时,在listctrl控件上显示编辑框中的文本,就可以做到了。为了让控件知道什么时候在编辑框中显示文本,还有重写编辑框。当编辑框失去焦点时,listctrl控件会收到一条消息通知。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: