2010-08-10 38 views
4

我添加属性CMFCPropertyGridCtrl类型的对象是这样的:如何设置CMFCPropertyListCtrl的列宽?

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

的结果是,只有第二栏是可见的,但不是第一个应该包含“姓名”。

  • 我发现CMFCPropertyGridCtrl::GetPropertyColumnWidth()但似乎没有对应Set...方法...
  • 我看着NewControls样品,其中,所述柱的大小似乎是全自动的。但是,我找不到与我的代码有关的差异。

我错过了什么?

回答

7

m_nLeftColumnWidth负责持有“名称”列的宽度是CMFCPropertyGridCtrl类的protected成员。创建自己的课程,该课程源自CMFCPropertyGridCtrl,您将可以操纵m_nLeftColumnWidth

3
class CServerPropertyGridCtrl : public CMFCPropertyGridCtrl 
{ 
public: 
    void SetLeftColumnWidth(int cx) 
    { 
     m_nLeftColumnWidth = cx; 
     AdjustLayout(); 
    } 
}; 
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())); 
3

“设置”是不是有一种,因为它留下来的头控制的原因。以下是通过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);