我正在向CMFCPropertyGridCtrl
类型的对象添加属性,如下所示:
myPropertyListCtrl.AddProperty(
new CMFCPropertyGridProperty(
_T("Name"),
foo.GetName())
);
结果是只有第二列可见,但第一列不应该包含“名称”。
CMFCPropertyGridCtrl::GetPropertyColumnWidth()
,但似乎没有相应的Set...
方法... NewControls
示例,其中列大小调整似乎是全自动的。但是,我找不到与我的代码相关的差异。我错过了什么?
答案 0 :(得分: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()));
答案 1 :(得分:7)
m_nLeftColumnWidth
负责保存“名称”列的宽度是protected
类的CMFCPropertyGridCtrl
成员。创建自己的类,该类派生自CMFCPropertyGridCtrl
,您将能够操纵m_nLeftColumnWidth
。
答案 2 :(得分:3)
class CServerPropertyGridCtrl : public CMFCPropertyGridCtrl
{
public:
void SetLeftColumnWidth(int cx)
{
m_nLeftColumnWidth = cx;
AdjustLayout();
}
};
答案 3 :(得分:3)
“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);