我通过覆盖同一类来自定义了列宽CMFCPropertyListCtrl
。
代码:
class CMyPropertyGridCtrl : public CMFCPropertyGridCtrl
{
public:
void SetFirstColumnWidth(int width)
{
m_nLeftColumnWidth = width;
AdjustLayout();
}
};
在将OnSize()
声明为数据成员的类的pChannelListCtrl
方法中,我调用了此方法。
我想固定第二列的大小为50
。
代码:
int iWidth = pChannelListCtrl.GetLeftColumnWidth();
pChannelListCtrl.SetFirstColumnWidth(iWidth + (iWidth - 50));
此处,其显示如预期。(第二列,大小为50)。
问题:
我想保持第二列的大小固定。但是,这里可调整大小。
请您指导我如何限制列的大小。
谢谢,
阿卜杜拉
答案 0 :(得分:0)
覆盖CMFCPropertyGridCtrl::SetLeftColumnWidth
。
使用CMFCPropertyGridCtrl::GetHeaderCtrl()
(可选),您可以禁用标头控件以防止调整GetHeaderCtrl().EnableWindow(FALSE);
class CMyPropertyGridCtrl : public CMFCPropertyGridCtrl
{
public:
CMyPropertyGridCtrl()
{
m_nLeftColumnWidth = 50;
}
void make_fixed_header()
{
HDITEM hdItem = { 0 };
hdItem.mask = HDI_FORMAT;
GetHeaderCtrl().GetItem(0, &hdItem);
hdItem.fmt |= HDF_FIXEDWIDTH;
GetHeaderCtrl().SetItem(0, &hdItem);
}
void SetLeftColumnWidth(int cx)
{
m_nLeftColumnWidth = cx;
AdjustLayout();
}
void OnSize(UINT f, int cx, int cy)
{
EndEditItem();
if (cx > 50)
m_nLeftColumnWidth = cx - 50; //<- 2nd column will be 50 pixels
AdjustLayout();
}
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMyPropertyGridCtrl, CMFCPropertyGridCtrl)
ON_WM_SIZE()
END_MESSAGE_MAP()
使用HDF_FIXEDWIDTH
修复用于标题控制的列。创建控件后,从父窗口调用以下函数:
grid.SetLeftColumnWidth(50);
grid.make_fixed_header();
CMyPropertyGridCtrl::SetLeftColumnWidth
将不会检测到用户何时调整列的大小。覆盖CMyPropertyGridCtrl::OnHeaderItemChanged
以便检测用户请求的更改。