如何解决在 MFC 中使用 TaskDialogIndirect 时出现异常
const HICON hQuestionIcon = AfxGetApp()->LoadStandardIcon(IDI_QUESTION);
CString strTitle = CString();
CString strMainInstruction = CString();
CString strContent = CString();
CString sTradditional = CString();
CString strFooter = CString();
CString strExpand = CString();
CString strCollapse = CString();
ENSURE(strTitle.LoadString(AFX_IDS_APP_TITLE));
ENSURE(strMainInstruction.LoadString(IDS_STR_SUBMIT_STATS_MAIN_TEXT));
ENSURE(strContent.LoadString(IDS_STR_SUBMIT_STATS_CONTENT_TEXT));
ENSURE(sTradditional.LoadString(IDS_STR_SUBMIT_STATS_ADDITIONAL_TEXT));
ENSURE(strFooter.LoadString(IDS_STR_TASK_DIALOG_FOOTER));
ENSURE(strExpand.LoadString(IDS_STR_FIND_OUT_MORE));
ENSURE(strCollapse.LoadString(IDS_STR_COLLAPSE));
TASKDIALOGCONfig sConfig = { 0 };
sConfig.cbSize = sizeof(TASKDIALOGCONfig);
sConfig.hInstance = AfxGetResourceHandle();
sConfig.dwCommonButtons = TDCBF_YES_BUTTON | TDCBF_NO_BUTTON;
sConfig.hMainIcon = hQuestionIcon;
sConfig.pszMainInstruction = strMainInstruction.GetString();
sConfig.pszContent = strContent.GetString();
sConfig.pszExpandedControlText = sTradditional.GetString();
sConfig.pszFooter = strFooter.GetString();
sConfig.pszCollapsedControlText = strExpand.GetString();
sConfig.pszExpandedControlText = strCollapse.GetString();
sConfig.pszFooterIcon = TD_informatION_ICON;
sConfig.pszVerificationText = _T("Stop displaying this message");
sConfig.cxWidth = cmeetingScheduleAssistantApp::DetectMessageBoxWidth();
int iButtonpressed = IDNO; // Default
BOOL bStopdisplayingMessage = FALSE;
TaskDialogIndirect(&sConfig,&iButtonpressed,NULL,&bStopdisplayingMessage);
if (bStopdisplayingMessage)
{
CChristianLifeMinistryUtils::HidePromptToSubmitWorkbookDownloadStats();
}
return iButtonpressed;
但我得到了一个例外:
我可以改为执行常规的 CTaskDialog
(不带复选框),这很好。
解决方法
虽然我在问题中向您展示的代码存在其他问题,但解决异常的方法是设置父级:
sConfig.hwndParent = GetSafeHwnd();
没有讨论或提及here。我是通过查看源码发现的。 TASKDIALOGCONFIG
主题说它可以是 NULL
。
无论如何,现在不会发生异常。
完整代码
const HICON hQuestionIcon = AfxGetApp()->LoadStandardIcon(IDI_QUESTION);
CString strTitle;
CString strMainInstruction;
CString strContent;
CString strAdditional;
CString strFooter;
CString strExpand;
CString strCollapse;
ENSURE(strTitle.LoadString(AFX_IDS_APP_TITLE));
ENSURE(strMainInstruction.LoadString(IDS_STR_SUBMIT_STATS_MAIN_TEXT));
ENSURE(strContent.LoadString(IDS_STR_SUBMIT_STATS_CONTENT_TEXT));
ENSURE(strAdditional.LoadString(IDS_STR_SUBMIT_STATS_ADDITIONAL_TEXT));
ENSURE(strFooter.LoadString(IDS_STR_TASK_DIALOG_FOOTER));
ENSURE(strExpand.LoadString(IDS_STR_FIND_OUT_MORE));
ENSURE(strCollapse.LoadString(IDS_STR_COLLAPSE));
TASKDIALOGCONFIG sConfig = { 0 };
sConfig.hwndParent = GetSafeHwnd();
sConfig.cbSize = sizeof(TASKDIALOGCONFIG);
sConfig.dwFlags = TDF_ENABLE_HYPERLINKS | TDF_USE_HICON_MAIN;
sConfig.hInstance = AfxGetResourceHandle();
sConfig.dwCommonButtons = TDCBF_YES_BUTTON | TDCBF_NO_BUTTON;
sConfig.hMainIcon = hQuestionIcon;
sConfig.pszMainInstruction = strMainInstruction.GetString();
sConfig.pszContent = strContent.GetString();
sConfig.pszExpandedInformation = strAdditional.GetString();
sConfig.pszFooter = strFooter.GetString();
sConfig.pszCollapsedControlText = strExpand.GetString();
sConfig.pszExpandedControlText = strCollapse.GetString();
sConfig.pszFooterIcon = TD_INFORMATION_ICON;
sConfig.pszVerificationText = _T("Stop displaying this message");
sConfig.cxWidth = CMeetingScheduleAssistantApp::DetectMessageBoxWidth();
int iButtonPressed = IDNO; // Default
BOOL bStopDisplayingMessage = FALSE;
HRESULT hResult = TaskDialogIndirect(&sConfig,&iButtonPressed,NULL,&bStopDisplayingMessage);
if (hResult == S_OK)
{
if (bStopDisplayingMessage)
{
CChristianLifeMinistryUtils::HidePromptToSubmitWorkbookDownloadStats();
}
}
return iButtonPressed;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。