【问题标题】:How to fixed CMFCPropertyListCtrl's column width?如何修复 CMFCPropertyListCtrl 的列宽?
【发布时间】:2018-10-12 10:06:09
【问题描述】:

我通过覆盖同一个类自定义了列宽CMFCPropertyListCtrl
代码:

class CMyPropertyGridCtrl : public CMFCPropertyGridCtrl
{
public:
    void SetFirstColumnWidth(int width)
    {
        m_nLeftColumnWidth = width;
        AdjustLayout();
    }
};

pChannelListCtrl被声明为数据成员的类的OnSize()方法中,我调用了这个方法。 我想修复大小为 50 的第二列。
代码:

int iWidth = pChannelListCtrl.GetLeftColumnWidth();
pChannelListCtrl.SetFirstColumnWidth(iWidth + (iWidth - 50));

在这里,它按预期显示。(第二列大小为 50)。
问题: 我想保持第二列的大小固定。但是,这里是可调整大小的。

你能指导我,如何限制列调整大小。

谢谢,
阿卜杜拉

【问题讨论】:

标签: c++ windows visual-c++ mfc resize


【解决方案1】:

覆盖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 以检测用户请求的更改。

【讨论】:

  • GetHeaderCtrl().EnableWindow(FALSE); 无法阻止调整大小。我想固定 第二列 而不是第一列的大小。
  • 我想我误解了这个问题。见编辑。添加ON_WM_SIZE 消息,覆盖CMFCPropertyGridCtrl::OnSize,如图所示,以在调整整个控件大小时更改列。
  • 调整整个控件大小时没有问题。第二列的宽度保持不变,我打电话给SetFirstColumnWidth()。我想隐藏/禁用更改第一列和第二列宽度的拆分器。
  • 如果我覆盖CMFCPropertyGridCtrlOnSize 方法,第二列就会消失。即使我尝试了不同的宽度。
  • 您正在更改问题。见第三次编辑。 make_fixed_header 将阻止标题调整大小,如果这是你想要的。 OnSize 应该按预期运行,除非宽度小于 50,或者除非进行了其他更改。
猜你喜欢
  • 2011-03-28
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 2017-10-08
  • 2013-08-11
相关资源
最近更新 更多