6

我正在向这样的类型的对象添加属性CMFCPropertyGridCtrl

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

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

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

我错过了什么?

4

4 回答 4

9

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

于 2010-08-12T12:10:48.710 回答
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()));
于 2012-11-20T23:22:20.127 回答
5

“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);
于 2015-08-14T16:45:35.847 回答
4
class CServerPropertyGridCtrl : public CMFCPropertyGridCtrl
{
public:
    void SetLeftColumnWidth(int cx)
    {
        m_nLeftColumnWidth = cx;
        AdjustLayout();
    }
};
于 2011-06-16T22:11:46.963 回答