代码之家  ›  专栏  ›  技术社区  ›  foraidt

如何设置CMFCPropertyListCtrl的列宽?

  •  4
  • foraidt  · 技术社区  · 14 年前

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

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

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

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

    我错过了什么?

    4 回复  |  直到 14 年前
        1
  •  9
  •   Aoi Karasu    14 年前

    m_nLeftColumnWidth 负责保持“Name”列的宽度是 protected CMFCPropertyGridCtrl 班级。创建自己的类,该类派生自 CMFCPropertyGridCtrl 左列宽度 .

        2
  •  9
  •   David Carr    12 年前

    请注意,在CMFCPropertyGridCtrl的ctor中,m\u nLeftColumnWidth最初设置为0。在OnSize()方法中(参考。AfxPropertyGridCtrl.cpp,VS2010中的第2783行),将其设置为栅格宽度的一半。这可能不理想,也不是通过重写类来显式设置它所描述的自定义值,但可能已经足够好了。

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

    CRect rect;
    myPropGrid.GetWindowRect(&rect);
    myPropGrid.PostMessage(WM_SIZE, 0, MAKELONG(rect.Width(),rect.Height()));
    
        3
  •  5
  •   Bill    9 年前

    “set”之所以不存在,是因为它被留给了header控件。以下是通过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
  •  4
  •   Karim    14 年前
    class CServerPropertyGridCtrl : public CMFCPropertyGridCtrl
    {
    public:
        void SetLeftColumnWidth(int cx)
        {
            m_nLeftColumnWidth = cx;
            AdjustLayout();
        }
    };