【问题标题】:MFC: How to custom draw a dynamically created CListCtrlMFC:如何自定义绘制动态创建的 CListCtrl
【发布时间】:2023-04-02 19:15:01
【问题描述】:

我需要自定义 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 可定制?

谢谢。

【问题讨论】:

    标签: mfc clistctrl


    【解决方案1】:

    在创建控件时,您已经放弃了自定义绘图所需的样式。添加LVS_OWNERDRAWFIXED。这应该可以解决您的问题。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-10
        相关资源
        最近更新 更多