如何设置CMFCPropertyListCtrl的列宽?

for*_*idt 4 c++ mfc mfc-feature-pack

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

myPropertyListCtrl.AddProperty(
    new CMFCPropertyGridProperty(
        _T("Name"),
        foo.GetName())
);
Run Code Online (Sandbox Code Playgroud)

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

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

我错过了什么?

Dav*_*arr 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()));
Run Code Online (Sandbox Code Playgroud)


Aoi*_*asu 7

m_nLeftColumnWidth负责持有"名称"列的宽度是该类的protected成员CMFCPropertyGridCtrl.创建自己的类,源自CMFCPropertyGridCtrl,您将能够操纵m_nLeftColumnWidth.


小智 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);
Run Code Online (Sandbox Code Playgroud)