如何固定CMFCPropertyListCtrl的列宽?

时间:2018-10-12 10:06:10

标签: c++ windows visual-c++ mfc resize

我通过覆盖同一类来自定义了列宽CMFCPropertyListCtrl
代码:

class CMyPropertyGridCtrl : public CMFCPropertyGridCtrl
{
public:
    void SetFirstColumnWidth(int width)
    {
        m_nLeftColumnWidth = width;
        AdjustLayout();
    }
};

在将OnSize()声明为数据成员的类的pChannelListCtrl方法中,我调用了此方法。 我想固定第二列的大小为50
代码:

int iWidth = pChannelListCtrl.GetLeftColumnWidth();
pChannelListCtrl.SetFirstColumnWidth(iWidth + (iWidth - 50));

此处,其显示如预期。(第二列,大小为50)。
问题: 我想保持第二列的大小固定。但是,这里可调整大小。

请您指导我如何限制列的大小。

谢谢,
阿卜杜拉

1 个答案:

答案 0 :(得分:0)

覆盖CMFCPropertyGridCtrl::SetLeftColumnWidth

使用CMFCPropertyGridCtrl::GetHeaderCtrl()

访问网格的标题控件

(可选),您可以禁用标头控件以防止调整GetHeaderCtrl().EnableWindow(FALSE);

的大小
class CMyPropertyGridCtrl : public CMFCPropertyGridCtrl
{
public:
    CMyPropertyGridCtrl()
    {
        m_nLeftColumnWidth = 50;
    }

    void make_fixed_header()
    {
        HDITEM hdItem = { 0 };
        hdItem.mask = HDI_FORMAT;
        GetHeaderCtrl().GetItem(0, &hdItem);
        hdItem.fmt |= HDF_FIXEDWIDTH;
        GetHeaderCtrl().SetItem(0, &hdItem);
    }

    void SetLeftColumnWidth(int cx)
    {
        m_nLeftColumnWidth = cx;
        AdjustLayout();
    }

    void OnSize(UINT f, int cx, int cy)
    {
        EndEditItem();
        if (cx > 50)
            m_nLeftColumnWidth = cx - 50; //<- 2nd column will be 50 pixels
        AdjustLayout();
    }

    DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CMyPropertyGridCtrl, CMFCPropertyGridCtrl)
    ON_WM_SIZE()
END_MESSAGE_MAP()

使用HDF_FIXEDWIDTH修复用于标题控制的列。创建控件后,从父窗口调用以下函数:

grid.SetLeftColumnWidth(50);
grid.make_fixed_header();

CMyPropertyGridCtrl::SetLeftColumnWidth将不会检测到用户何时调整列的大小。覆盖CMyPropertyGridCtrl::OnHeaderItemChanged以便检测用户请求的更改。