CMFCPropertyGridCtrl控件的列宽和行高
列宽
MFC在静态创建CMFCPropertyGridCtrl控件时,Property列的初始宽度很小,而Value列很宽,以至于Property列的文本会被Value列“挡住”,而动态创建该控件时,Property列和Value列宽度却又是等分的。静态创建如何使列也等分呢?
方法一:
HDITEM hdItem;
hdItem.mask = HDI_WIDTH;
hdItem.cxy = m_pgcCtrl.GetListRect().Width()/2; //近似等分的效果,可以设置自己喜欢的宽度
m_pgcCtrl.GetHeaderCtrl().SetItem(0, &hdItem);
直接设置标头0的宽度
方法二:
CRect rect;
m_pgcCtrl.GetClientRect(&rect);
m_pgcCtrl.SendMessage(WM_SIZE, (WPARAM)SIZE_RESTORED, MAKELPARAM(rect.Width(), rect.Height()));
首先得说明一下,MFC控件静态创建过程貌似没有产生WM_SIZE消息,而动态创建则会产生WM_SIZE,就是说静态创建比动态创建少了OnSize()的执行内容,先来看看CMFCPropertyGridCtrl的OnSize()做了什么
void CMFCPropertyGridCtrl::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
EndEditItem();
m_nLeftColumnWidth = cx / 2;
AdjustLayout();
}
m_nLeftColumnWidth 变量保存着左侧列的宽度(Property列),在画列的分割线的时候,CMFCPropertyGridCtrl以这个变量来确定分割线的位置,包括在方法一中,设置标头0的宽度最终也会影响到m_nLeftColumnWidth的值。这里m_nLeftColumnWidth直接被设置成了整个控件宽度的一半。
所以尽管使用方法一自定义了宽度,只要控件产生了WM_SIZE消息,列宽度都会恢复成等分状态。
行高
保存行高的变量是 m_nRowHeight,除了初始化m_nRowHeight = 0,涉及赋值的代码只有这一处:
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
m_nRowHeight = tm.tmHeight + 4;
可见行高只与文本高度有关,直接通过设置字体改变它。
m_fontProperty.CreatePointFont(180, _T("楷体"));
m_pgcCtrl.SetFont(&m_fontProperty);