对话框1秒后自动关闭。

youjianwanlei 2010-02-24 04:06:33

void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime )
{
::PostMessage(NULL,WM_CLOSE,0,0);
}

UINT WaitDlgProc( LPVOID pParam )
{

CWaitDlg WaitDlg;
::SetTimer(WaitDlg.m_hWnd,1,1000,TimerProc);
WaitDlg.DoModal();
return 0;
}


错哪了?
如何实现对话框1秒后自动关闭。?
...全文
451 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
许文君 2010-02-25
  • 打赏
  • 举报
回复
这东西没报错???
直接调用onok即可
red-fly 2010-02-25
  • 打赏
  • 举报
回复
应该2楼的方法最好,简单实用
magic7004 2010-02-25
  • 打赏
  • 举报
回复
 CWaitDlg WaitDlg;
::SetTimer(WaitDlg.m_hWnd,1,1000,TimerProc);
WaitDlg.DoModal();


(1)楼主你在调用::SetTimer()的时候对话框还没有被创建,m_hWnd应该是NULL。
因为CWaitDlg WaitDlg;这行只会创建CWaitDlg类的一个实例,而不会创建对话框本身。CWaitDlg类的实例WaitDlg被创建时只包含一个值为NULL的HWND类型的指针m_hWnd。需要调用CWaitDlg::Create() or CWaitDlg::DoModal()之类的函数才会创建对话框本身,并把对话框的句柄赋值给m_hWnd。
ps:对话框类CWaitDlg是C++类,而对话框是Windows系统资源,这是不同的概念。


(2)要实现楼主想要的效果,应该把SetTimer写在CWaitDlg类的OnInitDialog()中,然后在WaitDlg的WM_TIMER事件中关闭对话框。代码如下:
UINT  WaitDlgProc( LPVOID pParam ) 
{

CWaitDlg WaitDlg;
WaitDlg.DoModal(); //显示对话框
return 0;
}

BOOL CWaitDlg::OnInitDialog() //CWaitDlg类WM_INITDIALOG消息处理函数
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
SetTimer(1,1000,NULL); //Set Timer
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

void CWaitDlg::OnTimer(UINT nIDEvent) //CWaitDlg的WM_TIMER消息处理函数
{
// TODO: Add your message handler code here and/or call default
OnOK(); //需要WaitDlg.DoModal()返回IDOK则调用这个。
//OnCancel(); //要返回IDCALCEL调用这个
//EndDialog(15); //也可以调用EndDialog(int Value);来返回任意Value值。

//CDialog::OnTimer(nIDEvent);
}
fishion 2010-02-25
  • 打赏
  • 举报
回复
你应该在CWaitDlg 的OnInitDialog添加SetTimer(1,1000,TimerProc);
sksgod 2010-02-25
  • 打赏
  • 举报
回复
引用 11 楼 magic7004 的回复:
C/C++ code CWaitDlg WaitDlg;
::SetTimer(WaitDlg.m_hWnd,1,1000,TimerProc);
WaitDlg.DoModal();

(1)楼主你在调用::SetTimer()的时候对话框还没有被创建,m_hWnd应该是NULL。
    因为CWaitDlg WaitDlg;这行只会创建CWaitDlg类的一个实例,而不会创建对话框本身。CWaitDlg类的实例WaitDlg被创建时只包含一个值为NULL的HWND类型的指针m_hWnd。需要调用CWaitDlg::Create() or CWaitDlg::DoModal()之类的函数才会创建对话框本身,并把对话框的句柄赋值给m_hWnd。
    ps:对话框类CWaitDlg是C++类,而对话框是Windows系统资源,这是不同的概念。


(2)要实现楼主想要的效果,应该把SetTimer写在CWaitDlg类的OnInitDialog()中,然后在WaitDlg的WM_TIMER事件中关闭对话框。代码如下:
C/C++ codeUINT WaitDlgProc( LPVOID pParam )
{

CWaitDlg WaitDlg;
WaitDlg.DoModal();//显示对话框return0;
}

BOOL CWaitDlg::OnInitDialog()//CWaitDlg类WM_INITDIALOG消息处理函数{
CDialog::OnInitDialog();// TODO: Add extra initialization here SetTimer(1,1000,NULL);//Set Timerreturn TRUE;// return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE}void CWaitDlg::OnTimer(UINT nIDEvent)//CWaitDlg的WM_TIMER消息处理函数{// TODO: Add your message handler code here and/or call default OnOK();//需要WaitDlg.DoModal()返回IDOK则调用这个。//OnCancel();//要返回IDCALCEL调用这个//EndDialog(15);//也可以调用EndDialog(int Value);来返回任意Value值。//CDialog::OnTimer(nIDEvent);}

............
lmxmx 2010-02-25
  • 打赏
  • 举报
回复
引用 2 楼 owlcity 的回复:
先在CMyDlg中的OnInitDialog中 
  SetTimer(1,5000,NULL); 
  在CMyDlg::OnTimer(UINT  nIDEvent)  中 
  调用OnOk()函数,就可以了


这锅好……
youjianwanlei 2010-02-25
  • 打赏
  • 举报
回复
后来,还是在CDIalog里用定时器解决了。
youjianwanlei 2010-02-25
  • 打赏
  • 举报
回复
引用 9 楼 xuddk727 的回复:
这东西没报错???
直接调用onok即可


我也有试过,在这里不管onok还是onocamcle,反正就是会报错,说是CDialog的保护成员,不能用,。。。
youjianwanlei 2010-02-25
  • 打赏
  • 举报
回复
引用 1 楼 visualeleven 的回复:
::PostMessage(NULL,WM_CLOSE,0,0);
窗口句柄错了吧


我有试过,可也没用,我看msdn里里的POstMessage的第一个参数规定2个里面选一个, 一个是顶层的窗口,一个是NULL,所以我就选了NULL。难道有好几种postmessage的用法么,,。。。
在那个callback里的参数不是有mhwnd句柄吗, 是别人调用它,,它应该知道是哪个窗口吧。。
tht228 2010-02-24
  • 打赏
  • 举报
回复
在对话框的初始化中打开一个计时器。
计时器中设定一秒后CDialog::OnOK();就行。
如果对话框不是自己写的,就HWND hWnd=FindWindow(NULL,_T("你要关闭的窗口名"));
if ( hWnd ==NULL )
return ;
::PostMessage(hWnd,WM_CLOSE,0,0);
踏实每一步 2010-02-24
  • 打赏
  • 举报
回复
void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime )
{
HWND hWnd=FindWindow(NULL,_T("你要关闭的窗口名"));
if ( hWnd ==NULL )
return ;
::PostMessage(hWnd,WM_CLOSE,0,0);
}

UINT WaitDlgProc( LPVOID pParam )
{

CWaitDlg WaitDlg;
::SetTimer(WaitDlg.m_hWnd,1,1000,TimerProc);
WaitDlg.DoModal();
return 0;
}
starytx 2010-02-24
  • 打赏
  • 举报
回复
初始化时开启一个间隔1秒的定时器 SetTimer(1,1000,NULL);
在定时器处理中CDialog::OnOK();即可
超gogo 2010-02-24
  • 打赏
  • 举报
回复
::PostMessage(NULL,WM_CLOSE,0,0);
这是要关闭对话框的,应该传递对话框的m_hWnd
还有
WaitDlg.DoModal();
是不是应该放在settimer前面吧

如果还是不行,你试试在对话框中加一个timer函数,然后在WaitDlg.DoModal();
后调用,建议你可以将时间设置的长一点,这样可以看出效果,1s有时看不出效果

一点想法。仅供参考
WizardK 2010-02-24
  • 打赏
  • 举报
回复
最简单的方法就是窗口自己定时,调用父类的关闭方法,例如,如果CWaitDlg的父类是CDialog,调用CDialog::OnCancel()
WizardK 2010-02-24
  • 打赏
  • 举报
回复
第一个参数怎么能为空呢,往哪POST啊
owlcity 2010-02-24
  • 打赏
  • 举报
回复
先在CMyDlg中的OnInitDialog中
SetTimer(1,5000,NULL);
在CMyDlg::OnTimer(UINT nIDEvent) 中
调用OnOk()函数,就可以了
Eleven 2010-02-24
  • 打赏
  • 举报
回复
::PostMessage(NULL,WM_CLOSE,0,0);
窗口句柄错了吧

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧