Mfc 将CTaskDialog的宽度设置为屏幕宽度的50%

Mfc 将CTaskDialog的宽度设置为屏幕宽度的50%,mfc,taskdialog,Mfc,Taskdialog,我在设置宽度时遇到问题。这是我的代码: void CWin32FileError::DisplayExceptionMessage() { CString strContent=\u T(“”;//不应出现默认值 如果(!m_strErrorFile1.IsEmpty()&&!m_strErrorFile2.IsEmpty()) { strContent.Format(\u T(“源文件:%s\n目标文件:%s”), (LPCTSTR)m_strErrorFile1,(LPCTSTR)m_str

我在设置宽度时遇到问题。这是我的代码:

void CWin32FileError::DisplayExceptionMessage()
{
CString strContent=\u T(“”;//不应出现默认值
如果(!m_strErrorFile1.IsEmpty()&&!m_strErrorFile2.IsEmpty())
{
strContent.Format(\u T(“源文件:%s\n目标文件:%s”),
(LPCTSTR)m_strErrorFile1,(LPCTSTR)m_strErrorFile2);
}
其他的
{
strContent.Format(_T(“文件:%s”),(LPCTSTR)m_strErrorFile1);
}
CTASKDALOG dlgTaskError(strContent,Description(),_T(“异常”),TDCBF_OK_按钮);
dlgtaskeror.SetWindowTitle(_T(“例外”));
dlgtaskeror.setmain图标(TD_错误_图标);
dlgtaskeror.setfooter图标(TD_信息_图标);
dlgtaskeror.SetFooterText(m_strActionDescription);
//dlgtaskeror.SetDialogWidth(::GetSystemMetrics(SM_CXSCREEN)/2);
dlgtaskeror.SetDialogWidth(300);
dlgtaskeror.DoModal();
}
这是消息框的外观:

上面的屏幕显示使用了值300。最初我试图使用:

dlgTaskError.SetDialogWidth(::GetSystemMetrics(SM_CXSCREEN) / 2);
它不喜欢它,几乎和屏幕一样宽。如果我使用500,那么它看起来几乎占据了屏幕的50%。但我的屏幕宽度不到2000像素


帮助文档说明参数为像素,那么为什么我的代码现在显示屏幕宽度50%的消息框(如果启用我的代码)?

看起来MFC文档是错误的。这是关于
TASKDIALOGCONFIG::cxWidth
的说明:

任务对话框客户端区域的宽度,以对话框单元为单位。如果为0,则为 任务对话框管理器将计算理想宽度


Win32文档适用,因为
CTaskDialog::SetDialogWidth()
有效地设置了
TASKDIALOGCONFIG::cxWidth
成员。

谢谢。那么,如何将对话框的宽度设置为对话框单位屏幕宽度的50%或75%?记住,如果一个人是两个从一个监视器到另一个监视器的监视器,我们只需要任务对话框显示的监视器的宽度?明白了:
DWORD dw=GetDialogBaseUnits();intiwidth=MulDiv(::GetSystemMetrics(SM_CXSCREEN)/2,4,LOWORD(dw));dlgtaskeror.SetDialogWidth(iWidth)
@andrewruckle我很惊讶这是可行的,因为
GetDialogBaseUnits()
应该只适用于“系统字体”,而不是对话框使用的标准字体。如果这两种字体的标准相似,它可能是偶然的。确保使用本地化的Windows(例如安装中文语言包)和不同的DPI因素进行测试。当然,测试不一定要精确。我只是想让对话框更宽,这样看起来更适合我的路径。