'Classes/ActiveBasic/Windows/UI/Application.ab Namespace ActiveBasic Namespace Windows Namespace UI /*! @date 2008/07/13 @brief アプリケーション全体に関わるようなこと……、主にメッセージループを管理するクラス。 @todo メッセージフィルタとマルチスレッド対応 @author Egtra */ Class Application Public /*! @brief メッセージループを回す @date 2008/07/13 @param[in] form メインウィンドウ @author Egtra */ Static Sub Run(form As Form) If IsNothing(form) = False Then form.Show(SW_SHOW) form.Update() form.AddMessageEvent(WM_DESTROY, AddressOf(Application.OnMainFormClosed)) End If Dim m As MSG Do Dim ret = GetMessage(m, 0, 0, 0) If ret = 0 Or ret = -1 Then Exit Do End If TranslateMessage(m) DispatchMessage(m) Loop End Sub /*! @brief メインウィンドウなしでメッセージループを回す @date 2008/07/13 @author Egtra */ Static Sub Run() Run(Nothing) End Sub /*! @brief メッセージループを終わらせる。 @date 2008/07/13 @author Egtra */ Static Sub ExitThread() PostQuitMessage(0) End Sub /*! @brief メッセージキューに溜まったメッセージを処理する。 @date 2008/07/18 @author Egtra ここのコードから改変。 http://www.activebasic.com/forum/viewtopic.php?t=426 */ Static Sub DoEvents() Dim msg As MSG While PeekMessage(msg, 0, 0, 0, PM_REMOVE) <> FALSE Select Case msg.message Case WM_QUIT PostQuitMessage(0) 'Run()で捕まえてくれるようPostしなおす。 Case Else TranslateMessage(msg) DispatchMessage(msg) End Select Wend End Sub #include "ApplicationEvent.sbp" Private Static Sub OnMainFormClosed(sender As Object, e As Args) OnThreadExit(Args.Empty) ExitThread() End Sub End Class End Namespace 'UI End Namespace 'Widnows End Namespace 'ActiveBasic