如何设置CMFCPropertyListCtrl的列宽?

时间:2010-08-10 20:40:51

标签: c++ mfc mfc-feature-pack

我正在向CMFCPropertyGridCtrl类型的对象添加属性,如下所示:

myPropertyListCtrl.AddProperty(
    new CMFCPropertyGridProperty(
        _T("Name"),
        foo.GetName())
);

结果是只有第二列可见,但第一列不应该包含“名称”。

  • 我找到CMFCPropertyGridCtrl::GetPropertyColumnWidth(),但似乎没有相应的Set...方法...
  • 我查看了NewControls示例,其中列大小调整似乎是全自动的。但是,我找不到与我的代码相关的差异。

我错过了什么?

4 个答案:

答案 0 :(得分:9)

请注意,m_nLeftColumnWidth最初在CMFCPropertyGridCtrl的ctor中设置为0。设置它的少数几个地方之一是OnSize()方法(参考文献AfxPropertyGridCtrl.cpp,VS2010中的第2783行),它被设置为网格宽度的一半。这可能不是理想的,也不是通过覆盖类来明确设置它来描述的自定义值,但可能已经足够好了。

如果是这样,那么它只是触发具有CMFCPropertyGridCtrl :: OnSize()保护的方法。在可调整大小的窗口(如CDockablePane)中使用时,将自动调用OnSize()。但是在CDialog中,需要明确触发,例如发送WM_SIZE消息:

CRect rect;
myPropGrid.GetWindowRect(&rect);
myPropGrid.PostMessage(WM_SIZE, 0, MAKELONG(rect.Width(),rect.Height()));

答案 1 :(得分:7)

m_nLeftColumnWidth负责保存“名称”列的宽度是protected类的CMFCPropertyGridCtrl成员。创建自己的类,该类派生自CMFCPropertyGridCtrl,您将能够操纵m_nLeftColumnWidth

答案 2 :(得分:3)

class CServerPropertyGridCtrl : public CMFCPropertyGridCtrl
{
public:
    void SetLeftColumnWidth(int cx)
    {
        m_nLeftColumnWidth = cx;
        AdjustLayout();
    }
};

答案 3 :(得分:3)

“set”不存在的原因是因为它留给了标题控件。以下是通过MFC处理与发布窗口消息的方法:

HDITEM hdItem;
hdItem.mask = HDI_WIDTH; // indicating cxy is width
hdItem.cxy = 300; // whatever you want the property name column width to be
PropListCtrl.GetHeaderCtrl().SetItem(0, &hdItem);