用VC创建程序启动画面
最近由于項目需要,要在VC環境下做一個啟動界面。當時拿到這個任務我想的是直接AfxBeginThread一下就行了,后來發現沒這么簡單。要解決這個問題首先需要了解以下知識點。
???????一?MFC將線程分為工作線程和用戶界面線程。聽名字就應該知道他們的區別在于用途不同,用戶界面是用來創建界面并負責和用戶交互的而工作線程則是負責處理后臺的計算。從技術上講,用戶界面線程具有消息循環能處理消息,而工作線程則不行。
???????二?線程直接的信息交互可以通過PostThreadMessage來解決。
???????那么如何創建用戶界面線程呢?
???????1?首先創建你自己的對話框類。
???????2?創建用戶界面線程類,注意這個類必須繼承自CWinThread類,同時以對話框類為成員變量。
???????3?用以下語句創建線程:
CWinThread *pThread = AfxBeginThread(RUNTIME_CLASS(用戶界面線程類名));
???????4?重寫函數InitInstance,在里面創建對話框類。
BOOL CSplashThread::InitInstance()
{
??????????????// TODO:??perform and per-thread initialization here
??????????????m_splashDlg.Create(IDD_SPLASHDLG_DIALOG);
??????????????m_splashDlg.ShowWindow(SW_SHOW);
??????????????m_pMainWnd = &m_splashDlg;
??????????????return TRUE;
}
???????5?用以下語句發送消息給用戶界面線程。
???????::PostThreadMessage(pThread->m_nThreadID,WM_SPLASH_NOTIFY,0,0);
???????其聲明如下:
BOOL ? PostThreadMessage
( ??? ??
?? ? ? ? DWORD ? idThread, // ? thread ? identifier
?? ? ? ? UINT ? Msg, // ? message ? to ? post??
WPARAM ?wParam, // ? first ? message ? parameter ??
LPARAM ? lParam ? // ? second ? message ? parameter ?
);
????6?在用戶界面線程類中重載PreTranslateMessage函數:
????BOOL用戶界面線程類名::PreTranslateMessage(MSG* pMsg)
{
????????// TODO: Add your specialized code here and/or call the base class
????????if(pMsg->message == WM_SPLASH_NOTIFY)
????????{
???????????在這里處理消息
????????}
????return CWinThread::PreTranslateMessage(pMsg);
}
以上便是用戶界面線程的創建的整個過程。
轉載于:https://www.cnblogs.com/HappyAngel/archive/2010/04/10/1708718.html
總結
以上是生活随笔為你收集整理的用VC创建程序启动画面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: API hook 单步调试
- 下一篇: JS如何获取URL