【发布时间】:2020-12-26 12:08:44
【问题描述】:
我正在用 C++ 在 Visual Studio 2017 上编写一个基于对话框的 MFC 应用程序。
我为用户添加了最大化\最小化窗口的选项。当用户调整对话框大小时,我想调整控件的大小。在应用程序中有一个如下图所示的列表控件,它可以调整到新的窗口大小。
最大化窗口前-每列的宽度调整为列表宽度:
最大化窗口后:
我的问题是我无法将其列调整为新大小。我看过一些关于这个主题的帖子,但不幸的是我仍然无法解决问题。我希望列的大小大致相同并填满整个窗口。
我尝试过的:
1.方法 1 - 问题是最后一列比其他列大得多
void CEditableListControlDlg::OnSize(UINT nType, int cx, int cy) {
if (m_bUseWMSize) {
// adjust column width to window
for (int i = 0; i < m_EditableList.GetHeaderCtrl()->GetItemCount(); ++i) {
m_EditableList.SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER);
}
}
m_bUseWMSize = true;
}
变量m_bUseWMSize 可以忽略——它只是一个标志,所以我不会在创建对话框时执行代码。我还尝试将 SetColumnWidth 中的标志 LVSCW_AUTOSIZE_USEHEADER 切换为 LVSCW_AUTOSIZE,但也没有帮助。
使用方法 1 后,最大化对话框后的列表如下所示:
2。方法 2 - 问题是列宽不受影响。我认为这是因为width 变量的值为2147483647,即使我将它除以11(列数)它仍然太大
void CEditableListControlDlg::OnSize(UINT nType, int cx, int cy) {
if (m_bUseWMSize) {
RECT rect;
m_EditableList.GetViewRect(&rect);
int width = abs(rect.left - rect.right);
int nCol = 11;
// adjust column width to window
for (int i = 0; i < m_EditableList.GetHeaderCtrl()->GetItemCount(); ++i) {
m_EditableList.SetColumnWidth(i, width/nCol);
}
}
m_bUseWMSize = true;
}
3.方法 3 - 我试图检索列表的宽度(以像素为单位)并将其除以列数。问题是列宽太小,因为size.cx 的值是512
void CEditableListControlDlg::OnSize(UINT nType, int cx, int cy) {
if (m_bUseWMSize) {
CSize cz;
CSize size = m_EditableList.ApproximateViewRect(cz, -1);
int nCol = 11;
// adjust column width to window
for (int i = 0; i < m_EditableList.GetHeaderCtrl()->GetItemCount(); ++i) {
m_EditableList.SetColumnWidth(i, size.cx/11);
}
}
m_bUseWMSize = true;
}
相关文件:
谢谢。
【问题讨论】:
标签: c++ visual-studio mfc dialog