ページ 1 / 1
メッセージボックスをアクティブにする
Posted: 2006年6月29日(木) 23:25
by jacoby
メッセージボックスについて。
下のような、スレッドから単純にメッセージボックスを
表示するだけのプログラムがあるとします。
(スレッドそのものは質問と関係ないかもしれません)
コード: 全て選択
'
'●スレッド1
'
Function MainOperation(dwDummy As DWord)
MessageBox(hMainWnd,"MeesageBoxのテストです","Message",MB_OK)
End Function
これを実行するとメインのウインドウに重なって
小さなメッセージボックスが表示されるのですが
そこで一旦、デスクトップの他の場所をクリックするなどして
メッセージボックスを非アクティブにします。
それから再びこのメッセージボックスをアクティブに
したいとき、よく他のアプリケーションソフトなどでは
わざわざその小さなメッセージボックスそのものを
クリックせずとも、「そのメッセージボックスを所有するウィンドウ」
(ここでは"hMainWnd"のウインドウ)をクリックしても
メッセージボックスをアクティブに出来たりする動作が
見られます。
ただし、上のソースで実行した場合それは出来ず、
アクティブに戻すには小さなメッセージボックスそのものを
クリックしなければなりません。
「メッセージボックスを所有するウィンドウをクリックしても
メッセージボックスをアクティブにする」にはどうすれば良いでしょうか。
メッセージボックスをアクティブにする
Posted: 2006年7月01日(土) 00:37
by jacoby
メッセージボックスをモードレスダイアログボックスで
自作して、思う動作をさせようと下のようにプログラムを
書いてみたのですが、
(プログラムの流れは)
1,モードレスダイアログでメッセージボックスを作成、表示
2,ダイアログボックスが表示されているかどうかのフラグをセット
3,メインウインドウのActivateイベントで、もしダイアログボックスが表示されているなら
強制的にそれをアクティブにする
コード: 全て選択
'
'●メインウインドウ・クリエイト
'
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
'↓モードレスダイアログでメッセージボックスを自作
hModeLess1=CreateDialog(hMainWnd,"ModeLess1")
ShowWindow(hModeLess1,SW_SHOW)
'↓ダイアログボックスが表示されているかどうかのフラグ(TRUE=表示)
DialogExistingFlag=TRUE
End Sub
'
'●メインウインドウ・アクティブ/非アクティブ・イベント
'
Sub MainWnd_Activate(state As Integer, minimized As Integer)
'↓もしダイアログボックスが表示されているなら強制的にそれをアクティブにする
If state<>WA_INACTIVE AND DialogExistingFlag=TRUE Then
SetForegroundWindow(hModeLess1)
End If
End Sub
一応、それらしい動作はしてくれるのですがやっぱりこの方法だと
一瞬メインのウインドウがアクティブになるのでちらつきが起こります。
(メインウインドウのタイトルバーのダブルクリックで最大化などもされてしまいますし)。
このやり方ではメッセージボックス(モーダルダイアログボックス)のようなしっかりした
「モーダル」な動き、を実現するのは難しいのかなと思います。
他で良い方法があれば是非教えてください。
Posted: 2006年7月01日(土) 21:37
by ar
これはMessageWBox()関数の動作形態フラグであるMB_APPLMODALを指定すればよいのでは?
詳しくはヘルプを見ていただくとして、下記はプログラムでどうでしょう?
コード: 全て選択
#N88BASIC
MessageBox(_PromptSys_hWnd,"MeesageBoxのテストです","Message",MB_OK Or MB_APPLMODAL)
[/code]
Re: メッセージボックスをアクティブにする
Posted: 2006年7月02日(日) 00:15
by Tomorrow
> これを実行するとメインのウインドウに重なって
> 小さなメッセージボックスが表示されるのですが
> そこで一旦、デスクトップの他の場所をクリックするなどして
> メッセージボックスを非アクティブにします。
>
> それから再びこのメッセージボックスをアクティブに
> したいとき、よく他のアプリケーションソフトなどでは
> わざわざその小さなメッセージボックスそのものを
> クリックせずとも、「そのメッセージボックスを所有するウィンドウ」
> (ここでは"hMainWnd"のウインドウ)をクリックしても
> メッセージボックスをアクティブに出来たりする動作が
> 見られます。
> ただし、上のソースで実行した場合それは出来ず、
> アクティブに戻すには小さなメッセージボックスそのものを
> クリックしなければなりません。
当方でも試してみましたけど、MainWndをクリックすれば自動的にメッセージボックスがアクティブになりましたよ。(その際MainWndは非アクティブです。)
試したソース [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
ActiveBasic Ver 4.24で検証。
コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Dim ID_Thread1 As DWord
Dim hThread As HANDLE
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
If hThread<>0 Then CloseHandle(hThread)
test_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_CommandButton1_Click()
If hThread<>0 Then CloseHandle(hThread)
hThread=CreateThread(ByVal 0, 0, AddressOf(MainOperation), 0, 0, VarPtr(ID_Thread1))
End Sub
Function MainOperation(dwDummy As DWord)
MessageBox(hMainWnd,"MeesageBoxのテストです","Message",MB_OK)
End Function
レスありがとうございます。
Posted: 2006年7月02日(日) 22:50
by jacoby
arさん、Tomorrowさん、レスありがとうございます。
"MB_APPLMODAL"、指定してみたんですけど、こちらではダメみたいです。
(動きは変わりませんでした)
それからTomorrowさんの付けてくれたプログラム、
MainWnd_CommandButton1_Click() というサブは
マウスの左クリックのイベントでしょうか?
コピペで試してみたんですがこちらの環境ではどうもこのサブを通ってない
ようで、とりあえず
MainWnd_LButtonUp(flags As Long, x As Integer, y As Integer)
と勝手に変えて実行してみたんですが、メッセージボックスの動きは
変わらず。。。
で思ったんですが、こちらはABのver4.04で実行しています。(書くのが
遅れてすみません。)
もしかしたらバージョンにも拠るのかな、と。
これからver4.24をインストールして実行してみたいと思います。
Posted: 2006年7月02日(日) 23:28
by jacoby
Tomorrowさんの付けてくれたプログラム、
MainWnd_CommandButton1_Click() というサブは
メインウインドウに貼り付けたボタンコントロールですね。(失礼しました。
どっかで見たことがあるようなと思いつつ。。)
ver4.24に変えてRADツールでメインウインドウにボタンを
一つ貼り付けて、Tomorrowさんのプログラムをコピペして
ボタンをクリックすると、メッセージボックスが表示されました。
・・・ただ、なぜかメッセージボックスの動きはこちらでは以前の
ままです。何故なんでしょう。
メインウィンドウをクリックしても、メッセージボックスは、
(もちろんメインウインドウも)アクティブにならないままです。
MB_APPLMODALを付けてみても変わらず。。
もう少し考えてみます。
(バージョン)AB ver4.24
(OS)WinMe
Posted: 2006年7月03日(月) 00:28
by jacoby
スレッドを無くしてやってみると、
(ここにソースが表示されます) [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Dim ID_Thread1 As DWord
Dim hThread As HANDLE
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
MessageBoxTest424_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_CommandButton1_Click()
MessageBox(hMainWnd,"MeesageBoxのテストです","Message",MB_OK)
End Sub
・・・メッセージボックスの動作はうまくいきました。
ただし、元々スレッドの中で起こることのメッセージ表示に
使いたいので、このままではダメです・・
(それに原因がスレッドにあるのかどうかもまだよく
分かりません。)
Posted: 2006年7月03日(月) 16:19
by Tomorrow
> スレッドを無くしてやってみると、
> ・・・メッセージボックスの動作はうまくいきました。
>
> (それに原因がスレッドにあるのかどうかもまだよく
> 分かりません。)
スレッドを外してうまくいくなら、スレッドが原因かもしれません。
(バージョン)AB ver4.24
(OS)WinMe
OSのバージョン違いで動作が違うのかも?
こちらはWin 2kとWin XP Homeで確認しました。
レスありがとうございます。
Posted: 2006年7月04日(火) 22:32
by jacoby
レスありがとうございます。
そうですか、OSの違い。。
もし、スレッドの中からメッセージボックスなどのダイアログボックスを
呼び出すこと自体が何かの違反でなければ、そのまま使おうかとも
思っています。ただ、、 ちょっとまだ足を取られてます(笑)
どなたかWin98系でチェックされた方が他におられたら
ハッキリしますね。それを望みつつ。
動作確認、それからプログラム、ありがとうございました。
またよろしくお願いします。