mfc自定义listctrl 怎么绑定
1个回答
展开全部
(1) 实现自定义行高。
我们都知道,mfc 自带的 listctrl 控件的行高是固定的,不能够自定义的进行改变。如果设置一个比较大位图,或者简单的设置比较大号的字体,这些方法虽然能够改变行高,但是没有接触到问题的实质。我们使用消息反射机制来实现自定义行高。有关消息反射机制,请参见 msdn 。实现自定义行高的 listctrl 基于以下事实:当我们给 listctrl 发送 WM_WINDOWPOSCHANGED消息时,也就是告诉 listdctrl 控件大小、位置等发生变化,这时候 listctrl 控件就会触发 WM_MEARSURITEM 消息,当然这个是反射消息。通过映射这个消息,我们就可以改变 listctrl 控件的行高。当然还要设置 listctrl 的 Owen Draw Fixed 风格, WM_MEARSURITEM 只有在 Owen Draw Fixed 风格才有效。
总结一下,如果要创建自定义行高的listctrl ,大概要以下步骤:
(1) 定义新类,继承listctrl ,设置 Owen Draw Fixed 风格,并且手动映射 ON_WM_MEASUREITEM_REFLECT 消息。
(2) 增加设置行高的接口,通过设置发送WM_WINDOWPOSCHANGED 消息引发 ON_WM_MEASUREITEM_REFLECT 消息,例如:
void CListEx::SetItemHeight(UINT nHeight)
{
m_nItemHeight = nHeight;
CRect rcWin;
GetWindowRect(&rcWin);
WINDOWPOS wp;
wp.hwnd = m_hWnd;
wp.cx = rcWin.Width();
wp.cy = rcWin.Height();
wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;
SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp);
}
(2) 映射 ON_WM_MEASUREITEM_REFLECT 反射消息,在反射消息里设置行高, 例如:
void CListEx ::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemHeight = m_nItemHeight;
}
(3) 完成控件自绘函数,CListEx::DrawItem 。自此,自定义设置行高功能已经实现。
三、 增加编辑功能
增加编辑功能一般的思路,就是在单击或双击的时候,创建一个CEDIT 编辑框,然后把编辑框覆盖当前的 subitem 上,并且使编辑框获取焦点。当编辑框失去焦点时,把编辑框里的文字,显示到 listctrl 控件上,就可以了。为了能够使控件知道何时显示编辑框中的文字,所以还有重写编辑框,当编辑框失去焦点时,通过消息通知 listctrl 控件。
我们都知道,mfc 自带的 listctrl 控件的行高是固定的,不能够自定义的进行改变。如果设置一个比较大位图,或者简单的设置比较大号的字体,这些方法虽然能够改变行高,但是没有接触到问题的实质。我们使用消息反射机制来实现自定义行高。有关消息反射机制,请参见 msdn 。实现自定义行高的 listctrl 基于以下事实:当我们给 listctrl 发送 WM_WINDOWPOSCHANGED消息时,也就是告诉 listdctrl 控件大小、位置等发生变化,这时候 listctrl 控件就会触发 WM_MEARSURITEM 消息,当然这个是反射消息。通过映射这个消息,我们就可以改变 listctrl 控件的行高。当然还要设置 listctrl 的 Owen Draw Fixed 风格, WM_MEARSURITEM 只有在 Owen Draw Fixed 风格才有效。
总结一下,如果要创建自定义行高的listctrl ,大概要以下步骤:
(1) 定义新类,继承listctrl ,设置 Owen Draw Fixed 风格,并且手动映射 ON_WM_MEASUREITEM_REFLECT 消息。
(2) 增加设置行高的接口,通过设置发送WM_WINDOWPOSCHANGED 消息引发 ON_WM_MEASUREITEM_REFLECT 消息,例如:
void CListEx::SetItemHeight(UINT nHeight)
{
m_nItemHeight = nHeight;
CRect rcWin;
GetWindowRect(&rcWin);
WINDOWPOS wp;
wp.hwnd = m_hWnd;
wp.cx = rcWin.Width();
wp.cy = rcWin.Height();
wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;
SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp);
}
(2) 映射 ON_WM_MEASUREITEM_REFLECT 反射消息,在反射消息里设置行高, 例如:
void CListEx ::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemHeight = m_nItemHeight;
}
(3) 完成控件自绘函数,CListEx::DrawItem 。自此,自定义设置行高功能已经实现。
三、 增加编辑功能
增加编辑功能一般的思路,就是在单击或双击的时候,创建一个CEDIT 编辑框,然后把编辑框覆盖当前的 subitem 上,并且使编辑框获取焦点。当编辑框失去焦点时,把编辑框里的文字,显示到 listctrl 控件上,就可以了。为了能够使控件知道何时显示编辑框中的文字,所以还有重写编辑框,当编辑框失去焦点时,通过消息通知 listctrl 控件。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询