MFC:如何自定义绘制动态创建的CListCtrl

时间:2015-04-25 12:41:14

标签: mfc clistctrl

我需要自定义CListCtrl的头/行高度。经过一些谷歌搜索,我知道我需要子类CListCtrl,所以我写了自己的列表类,大纲如下:

class CListCtrlCl : public CListCtrl
{
    DECLARE_DYNAMIC(CListCtrlCl)

public:

...

BEGIN_MESSAGE_MAP(CListCtrlCl, CListCtrl)
    ON_WM_MEASUREITEM()
    ON_WM_MEASUREITEM_REFLECT()
END_MESSAGE_MAP()
void CListCtrlCl::PreSubclassWindow()
{
    ModifyStyle(0,LVS_OWNERDRAWFIXED);
    CListCtrl::PreSubclassWindow();
    CHeaderCtrl *pHeader = GetHeaderCtrl();
    m_Header.SubclassWindow(pHeader->GetSafeHwnd());
}
void CListCtrlCl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
    if (m_nRowHeight>0)
    {
        lpMeasureItemStruct->itemHeight = 100;
    }
}

问题是,如果我在对话框模板中拖动CListCtrl控件,但是如果我动态创建此listctrl,则此方法有效,例如:

BOOL CListCtrlTestDlg::OnInitDialog()
{
CRect rect(7,7,300,300);
this->m_ListCtrl.Create(WS_CHILD|WS_VISIBLE|WS_VSCROLL|LVS_REPORT|LVS_ALIGNLEFT|WS_BORDER | WS_TABSTOP, rect, this,IDC_LIST1 + 1);
SetWindowLong(m_ListCtrl.m_hWnd ,GWL_EXSTYLE,WS_EX_CLIENTEDGE);
m_ListCtrl.SetExtendedStyle(LVS_EX_GRIDLINES);                     
::SendMessage(m_ListCtrl.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);

...

然后自定义代码才生效。无论我做了什么,结果listctrl是没有任何自定义的标准。但我需要动态创建这个listctrl,所以有人能告诉我我需要做些什么才能使动态创建的clistctrl可自定义吗?

感谢。

2 个答案:

答案 0 :(得分:0)

创建控件时,您已经为自定义绘图留下了必要的样式。添加LVS_OWNERDRAWFIXED。这应该可以解决你的问题。

答案 1 :(得分:0)

原因是,只有在对控件进行子类化时才会调用PreSubclassWindow。创建控件时,您还可以控制样式。

只需覆盖虚拟的Create函数,只需在PreSubclassWindow函数中添加样式即可。比调用基类。您也可以覆盖PreCreateWindow。

但比使用ownerdraw功能更简单的是cusum draw。