在对话框显示出来后立即执行一段代码

2014-11-23 23:39:53 · 作者: · 浏览: 11

最近在做一个项目,在创建一个子对话框的时候,由于在OnInitDialog()初始化所要执行的代码量比较大,导致初始化很慢,要2秒左右对话框才能显示出来...所以想把部分代码在对话框显示出来之后再执行,在网上找了很多资料,总结了下面两种办法,一种是在OnInitDilalog()中设定一个定时器,还有一种是再OnInitDialog()中PostMessage()在添加一个自定义的消息在消息队列中等待对话框初始化之后从消息队列中读取消息执行代码。、、、、

1.在OnInitDialog返回之前创建一个只报时一次的定时器,在OnTimer里执行代码

BOOLMyAppDlg::OnInitDialog()

{

…………………………

// TODO: Add extra initialization here

SetTimer(m_nTimerID, 100, NULL);

returnTRUE; // return TRUE unless you set the focus to a control

}

voidMyAppDlg::OnTimer(UINT_PTRnIDEvent)

{

if(nIDEvent == m_nTimerID)

{

// 只执行一次,所以一报时就Kill掉了

KillTimer(m_nTimerID);

m_nTimerID = 0;

AfxMessageBox(_T("Hello MFC"));

return;

}

CDialog::OnTimer(nIDEvent);

}

2.在OnInitDialog返回之前post一个自定义的消息,在消息的相应函数里执行代码

#define WM_MY_PRIVATE WM_USER + 1551

BOOLMyAppDlg::OnInitDialog()

{

…………………………

// TODO: Add extra initialization here

PostMessage(WM_MY_PRIVATE);

returnTRUE; // return TRUE unless you set the focus to a control

}

// 当然,消息映射表里得加上一项

// ON_MESSAGE(WM_MY_PRIVATE, &CdummyDlg::OnPrivateMessage)

LRESULTMyAppDlg::OnPrivateMessage(WPARAM,LPARAM)

{

AfxMessageBox(_T("Hello MFC"));

return0;

}