> > While( PeekMessage( wndMsg, NULL, 0, 0, PM_NOREMOVE ) )
> > Result = GetMessage( wndMsg, NULL, 0, 0 )
> 単にWhile PeekMessage(wndMsg, NULL, 0, 0, PM_REMOVE)でいいと思いますよ。
> そのときはその代わりに次のIfを次のようにする必要があります。
> If wndMsg.message = WM_QUIT Then
>
> まあWM_QUITが来たらそのままExitProcessを呼んでも良いと思いますが。
そもそもDoEvents関数はC++のようにマルチスレッドが扱えなかった頃のVBの苦肉の策といった代物です。
DoEvents関数を呼び出す時点でパフォーマンスが低下するので、本来使用は極力避けるべきものだと私は思っていますが、人によって便利といえば便利なんでしょうね。
P.S.1 私は出来る限りイベントプロシージャがCPUを占有することがないようにプロシージャ内のプログラムは短くしたりFor文を避けるようにしています。
P.S.2 メッセージイベント実行中に別のメッセージを動かすというのは
グローバル変数が絡んでくると誤動作の原因になりそうな気もしますね
てふろん様とイグラトス様のご意見を参考にすると以下のようになります。
コード: 全て選択
Function DoEvents() As Long
Dim msg As MSG
While PeekMessage(msg,NULL,0,0,PM_REMOVE)=TRUE
Select Case msg.message
Case WM_QUIT
ExitProcess(0)
Case Else
TranslateMessage(msg)
DispatchMessage(msg)
End Select
Sleep(0)/*←不要かもね(別のスレッドに迷惑かけないように。。。)*/
Wend
End Function
古いVBではDoEvents関数の戻り値はコントロールの数になっているようですが最近のVBでは常に0が返るようです。