如何设置CMFCPropertyListCtrl的列宽?

7
我正在像这样为对象CMFCPropertyGridCtrl添加属性:
myPropertyListCtrl.AddProperty(
    new CMFCPropertyGridProperty(
        _T("Name"),
        foo.GetName())
);

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

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

我错过了什么?

4个回答

9
请注意,在CMFCPropertyGridCtrl的构造函数中,m_nLeftColumnWidth最初设置为0。其中少数几个设置该值的地方是在OnSize()方法中(参考AfxPropertyGridCtrl.cpp中的第2783行,使用VS2010),将其设置为网格宽度的一半。这可能不是理想的方式,也不是通过重写类来显式设置自定义值的方式,但可能已经足够。
如果是这样,则只需触发CMFCPropertyGridCtrl :: OnSize()受保护方法即可。当在可调整大小的窗口中使用,例如CDockablePane,则OnSize()将自动被调用。但在CDialog中,需要明确触发它以发送WM_SIZE消息。
CRect rect;
myPropGrid.GetWindowRect(&rect);
myPropGrid.PostMessage(WM_SIZE, 0, MAKELONG(rect.Width(),rect.Height()));

9

m_nLeftColumnWidth 是负责存储“名称”列宽度的 CMFCPropertyGridCtrl 类的 protected 成员。创建一个从 CMFCPropertyGridCtrl 派生的自定义类,就可以操作 m_nLeftColumnWidth


6
"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);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接