将 CTaskDialog 的宽度设置为屏幕宽度的 50%
Posted
技术标签:
【中文标题】将 CTaskDialog 的宽度设置为屏幕宽度的 50%【英文标题】:Setting width of CTaskDialog to 50% of screen width 【发布时间】:2019-04-21 16:47:33 【问题描述】:我在设置宽度时遇到问题。这是我的代码:
void CWin32FileError::DisplayExceptionMessage()
CString strContent = _T(""); // Default shouldn't happen
if (!m_strErrorFile1.IsEmpty() && !m_strErrorFile2.IsEmpty())
strContent.Format(_T("Source file: %s\nTarget file: %s"),
(LPCTSTR)m_strErrorFile1, (LPCTSTR)m_strErrorFile2);
else
strContent.Format(_T("File: %s"), (LPCTSTR)m_strErrorFile1);
CTaskDialog dlgTaskError(strContent, Description(), _T("Exception"), TDCBF_OK_BUTTON);
dlgTaskError.SetWindowTitle(_T("Exception"));
dlgTaskError.SetMainIcon(TD_ERROR_ICON);
dlgTaskError.SetFooterIcon(TD_INFORMATION_ICON);
dlgTaskError.SetFooterText(m_strActionDescription);
//dlgTaskError.SetDialogWidth(::GetSystemMetrics(SM_CXSCREEN) / 2);
dlgTaskError.SetDialogWidth(300);
dlgTaskError.DoModal();
这是消息框的样子:
上面的屏幕显示使用的值是 300。最初我试图使用:
dlgTaskError.SetDialogWidth(::GetSystemMetrics(SM_CXSCREEN) / 2);
它不喜欢它,几乎和屏幕一样宽。如果我使用 500,那么它看起来几乎占屏幕的 50%。然而,我的屏幕只有不到 2000 像素宽。
帮助文档说明参数是像素,那么为什么我的代码现在以 50% 的屏幕宽度显示消息框(如果我启用了我的代码)?
【问题讨论】:
【参考方案1】:看起来 MFC 文档有误。这就是Win32 documentation 对TASKDIALOGCONFIG::cxWidth
所说的:
任务对话框客户区的宽度,以对话框单位。如果为 0,则 任务对话框管理器会计算出理想的宽度。
适用 Win32 文档,因为 CTaskDialog::SetDialogWidth()
实际上只是设置了 TASKDIALOGCONFIG::cxWidth
成员。
【讨论】:
谢谢。那么如何将对话框的宽度设置为对话框单元中屏幕宽度的 50% 或 75%?请记住,如果一个人是两台显示器,从一台显示器跨越到另一台显示器,我们只需要显示任务对话框的显示器宽度? 知道了:DWORD dw = GetDialogBaseUnits(); int iWidth = MulDiv(::GetSystemMetrics(SM_CXSCREEN) / 2, 4, LOWORD(dw)); dlgTaskError.SetDialogWidth(iWidth);
@AndrewTruckle 我很惊讶这能行得通,因为GetDialogBaseUnits()
应该只适用于“系统字体”,它不是对话框使用的标准字体盒子。如果两种字体的指标相似,它可能会偶然起作用。确保使用本地化的 Windows(例如通过安装中文语言包)和不同的 DPI 因素进行测试。
嗯,它不必是精确的。我只是希望对话框更宽,以便它看起来更适合恕我直言的路径。以上是关于将 CTaskDialog 的宽度设置为屏幕宽度的 50%的主要内容,如果未能解决你的问题,请参考以下文章
将relativelayout的宽度设置为屏幕宽度的1/3?