實現VB的DoEvents函數(VC++)

在VC++中,碰到了比如等待通訊數據等需要很長時間的循環時,在循環里加入類似VB的DoEvents函數,使畫面一直處於事件響應狀態。實際上,DoEvents函數的內容就是一個窗口消息處理環。

void DoEvents()
{
    MSG msg;
    while(::PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE))
    {
        if (!AfxGetApp()->PumpMessage())
        return;
    }
}

void DoEvents()
{
    MSG msg;
    while (::GetMessage(&msg, NULL, NULL, NULL))
    {
        if (!PreTranslateMessage(&msg))
        {
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
        }
    }
}


注意點:這種方法在長時間的循環処理中能不斷進行畫面操作,可以說這個DoEvents手法還是挺方便的。可是在DoEvents()中,

任何Windows的消息多可能被處理,有時出現了預料不到的結果。所以,儘可能使用下面函數中的wMsgFilterMin和wMsgFilterMax參數,

對處理的消息種類作適當制限,編出更加安全的DoEvents()。

BOOL PeekMessage(	LPMSG lpMsg, // pointer to structure for message
			HWND hWnd, // handle to window
			UINT wMsgFilterMin, // first message
			UINT wMsgFilterMax, // last message
			UINT wRemoveMsg // removal flags
			);

BOOL GetMessage(	LPMSG lpMsg, // address of structure with message
			HWND hWnd, // handle of window
			UINT wMsgFilterMin, // first message
			UINT wMsgFilterMax // last message
			);

最後一句話:如果是長時間循環處理,使用多線程

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章