实现自定义注解,实现自定义指令
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控件会收到一条消息通知。