作者:zevbin_187 | 来源:互联网 | 2022-12-06 19:25
我需要添加到现有的MFC应用程序,一个自定义消息框,如果用户没有按"确定",它将在几秒后消失.
怎么做?
我基本熟悉MFC,但是熟悉c ++.
1> zett42..:
这可以在不必使用编写自定义对话框的情况下完成TaskDialogIndirect()
.
基本步骤
设置TDF_CALLBACK_TIMER
位TASKDIALOGCONFIG::dwFlags
.这将大约每200毫秒调用一次回调(如果指定).
指定一个回调函数来TASKDIALOGCONFIG::pfCallback
.
使用TDN_TIMER
通知代码调用回调时,将传递给回调的经过时间wParam
与所需的超时值进行比较.要关闭对话框,请向其发送TDM_CLICK_BUTTON
消息.
您可以想象并显示进度条(TDF_SHOW_PROGRESS_BAR
)或只显示您在计时器回调中更新的倒计时文本.请参阅任务对话框消息.
例
以下是使用普通Windows API的示例.MFC有这个CTaskDialog
类,但我认为如果它不依赖于MFC,这个答案会更有用.对于非MFC的用户中,只有分配到tc.hInstance
和tc.hwndParent
需要改变.
TASKDIALOGCONFIG tc{ sizeof(tc) };
tc.hInstance = AfxGetInstanceHandle();
tc.hwndParent = GetSafeHwnd(); // assuming you call this from a dialog member function
tc.dwFlags = TDF_CALLBACK_TIMER | TDF_SIZE_TO_CONTENT;
tc.dwCommOnButtons= TDCBF_OK_BUTTON;
tc.pszWindowTitle = L"Task dialog with timeout";
tc.pszCOntent= L"This dialog will close after 5 seconds!";
DWORD timeout = 5000; // milliseconds
tc.lpCallbackData = reinterpret_cast( &timeout );
// Assign a lambda function as callback.
tc.pfCallback = []( HWND hwnd, UINT uNotification, WPARAM wParam, LPARAM lParam, LONG_PTR dwRefData )
{
if( uNotification == TDN_TIMER )
{
DWORD* pTimeout = reinterpret_cast( dwRefData ); // = tc.lpCallbackData
DWORD timeElapsed = static_cast( wParam );
if( *pTimeout && timeElapsed >= *pTimeout )
{
*pTimeout = 0; // Make sure we don't send the button message multiple times.
SendMessage( hwnd, TDM_CLICK_BUTTON, IDOK, 0 );
}
}
return S_OK;
};
::TaskDialogIndirect( &tc, nullptr, nullptr, nullptr );
@RbMm由于它没有文档,可以在将来的任何时候删除它.过时,因为Task Dialog API更强大.