作成者 |
メッセージ |
|
|
>プロンプトウィンドウに追加してもどうやってメッセージを拾うのかがわからないorz
サブクラス化するのが手っ取り早いでしょうね。
グローバル変数ではなくウィンドウのGWL_USERDATAを使ったサブクラス化のサンプルにしてみました。
#promptディレクティブを呼び出す前あたりに
コード: '元のウィンドウ関数アドレスの取得
Const GetOldProcAddr(hWnd) = GetWindowLong(hWnd, GWL_USERDATA)
'CallWindowProc関数を使って元のウィンドウ関数を呼び出す
Const CallOldWindowProc(hWnd, Msg, wParam, lParam) = _
CallWindowProc(GetOldProcAddr(hWnd), hWnd, dwMsg, wParam, lParam)
Function SubClassProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
SubClassProc = 0
Select Case dwMsg
Case WM_SYSCOMMAND
Select Case LOWORD(wParam)
Case IDM_MENU1
MsgBox hWnd, "メニュー1が選択されました"
Case IDM_MENU2
MsgBox hWnd, "メニュー2が選択されました"
Case IDM_MENU3
MsgBox hWnd, "メニュー3が選択されました"
Case Else
SubClassProc = CallOldWindowProc(hWnd, dwMsg, wParam, lParam)
End Select
Case WM_DESTROY
'サブクラス化解除
SetWindowLong(hWnd, GWL_WNDPROC, GetOldProcAddr(hWnd))
Case Else
SubClassProc = CallOldWindowProc(hWnd, dwMsg, wParam, lParam)
End Select
End Function
とコードを追加して、さらにシステムメニューを追加した後に
コード: 'サブクラス化開始
SetWindowLong(_PromptSys_hWnd, GWL_USERDATA, SetWindowLong(_PromptSys_hWnd, _
GWL_WNDPROC, AddressOf(SubClassProc)))
とすれば、追加したシステムメニューに合わせたイベントが追加できます。
>プロンプトウィンドウに追加してもどうやってメッセージを拾うのかがわからないorz
サブクラス化するのが手っ取り早いでしょうね。 グローバル変数ではなくウィンドウのGWL_USERDATAを使ったサブクラス化のサンプルにしてみました。
#promptディレクティブを呼び出す前あたりに [code]'元のウィンドウ関数アドレスの取得 Const GetOldProcAddr(hWnd) = GetWindowLong(hWnd, GWL_USERDATA) 'CallWindowProc関数を使って元のウィンドウ関数を呼び出す Const CallOldWindowProc(hWnd, Msg, wParam, lParam) = _ CallWindowProc(GetOldProcAddr(hWnd), hWnd, dwMsg, wParam, lParam) Function SubClassProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT SubClassProc = 0 Select Case dwMsg Case WM_SYSCOMMAND Select Case LOWORD(wParam) Case IDM_MENU1 MsgBox hWnd, "メニュー1が選択されました" Case IDM_MENU2 MsgBox hWnd, "メニュー2が選択されました" Case IDM_MENU3 MsgBox hWnd, "メニュー3が選択されました" Case Else SubClassProc = CallOldWindowProc(hWnd, dwMsg, wParam, lParam) End Select Case WM_DESTROY 'サブクラス化解除 SetWindowLong(hWnd, GWL_WNDPROC, GetOldProcAddr(hWnd)) Case Else SubClassProc = CallOldWindowProc(hWnd, dwMsg, wParam, lParam) End Select End Function [/code] とコードを追加して、さらにシステムメニューを追加した後に [code]'サブクラス化開始 SetWindowLong(_PromptSys_hWnd, GWL_USERDATA, SetWindowLong(_PromptSys_hWnd, _ GWL_WNDPROC, AddressOf(SubClassProc)))[/code] とすれば、追加したシステムメニューに合わせたイベントが追加できます。
|
|
|
投稿記事 |
Posted: 2006年2月20日(月) 01:46 |
|
|
|
|
|
タイトルバーなどを右クリックすると出てくるメニューに追加できます。
実行してすぐに結果がわかるサンプル [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: #prompt
Const IDM_MENU1=1001
Const IDM_MENU2=1002
Const IDM_MENU3=1003
Dim hSysMenu As HMENU
hSysMenu=GetSystemMenu(_PromptSys_hWnd,0)
InsMenu hSysMenu,0,MF_BYPOSITION
InsMenu hSysMenu,0,MF_BYPOSITION,Ex"メニュー1",IDM_MENU1,0,0
InsMenu hSysMenu,0,MF_BYPOSITION,Ex"メニュー2",IDM_MENU2,0,0
InsMenu hSysMenu,0,MF_BYPOSITION,Ex"メニュー3",IDM_MENU3,0,0
実行して、左上を右クリックするとメニューが追加されています。
実用する場合のサンプル [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: Const IDM_MENU1=1001
Const IDM_MENU2=1002
Const IDM_MENU3=1003
コードの最初の方でメニューIDを指定しておく
コード: Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim hSysMenu As HMENU
hSysMenu=GetSystemMenu(hMainWnd,0)
InsMenu hSysMenu,0,MF_BYPOSITION
InsMenu hSysMenu,0,MF_BYPOSITION,Ex"メニュー1",IDM_MENU1,0,0
InsMenu hSysMenu,0,MF_BYPOSITION,Ex"メニュー2",IDM_MENU2,0,0
InsMenu hSysMenu,0,MF_BYPOSITION,Ex"メニュー3",IDM_MENU3,0,0
End Sub
クリエイトイベントでメニューを追加
コード: ' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
If dwMsg=WM_SYSCOMMAND Then
Select Case LOWORD(wParam)
Case IDM_MENU1
'・・・
Case IDM_MENU2
'・・・
Case IDM_MENU2
'・・・
Case Else
MainWndProc=DefWindowProc(hWnd,dwMsg,wParam,lParam)
ExitFunction
End Select
End If
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
WM_SYSCOMMANDを拾う
プロンプトウィンドウに追加してもどうやってメッセージを拾うのかがわからないorz
タイトルバーなどを右クリックすると出てくるメニューに追加できます。
[hide=実行してすぐに結果がわかるサンプル][code]#prompt Const IDM_MENU1=1001 Const IDM_MENU2=1002 Const IDM_MENU3=1003
Dim hSysMenu As HMENU hSysMenu=GetSystemMenu(_PromptSys_hWnd,0) InsMenu hSysMenu,0,MF_BYPOSITION InsMenu hSysMenu,0,MF_BYPOSITION,Ex"メニュー1",IDM_MENU1,0,0 InsMenu hSysMenu,0,MF_BYPOSITION,Ex"メニュー2",IDM_MENU2,0,0 InsMenu hSysMenu,0,MF_BYPOSITION,Ex"メニュー3",IDM_MENU3,0,0[/code] 実行して、左上を右クリックするとメニューが追加されています。 [/hide]
[hide=実用する場合のサンプル] [code]Const IDM_MENU1=1001 Const IDM_MENU2=1002 Const IDM_MENU3=1003[/code] コードの最初の方でメニューIDを指定しておく
[code]Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) Dim hSysMenu As HMENU hSysMenu=GetSystemMenu(hMainWnd,0) InsMenu hSysMenu,0,MF_BYPOSITION InsMenu hSysMenu,0,MF_BYPOSITION,Ex"メニュー1",IDM_MENU1,0,0 InsMenu hSysMenu,0,MF_BYPOSITION,Ex"メニュー2",IDM_MENU2,0,0 InsMenu hSysMenu,0,MF_BYPOSITION,Ex"メニュー3",IDM_MENU3,0,0 End Sub[/code] クリエイトイベントでメニューを追加
[code]' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord ' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。 If dwMsg=WM_SYSCOMMAND Then Select Case LOWORD(wParam) Case IDM_MENU1 '・・・ Case IDM_MENU2 '・・・ Case IDM_MENU2 '・・・ Case Else MainWndProc=DefWindowProc(hWnd,dwMsg,wParam,lParam) ExitFunction End Select End If ' イベントプロシージャの呼び出しを行います。 MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam) End Function[/code] WM_SYSCOMMANDを拾う [/hide]
プロンプトウィンドウに追加してもどうやってメッセージを拾うのかがわからないorz
|
|
|
投稿記事 |
Posted: 2006年2月19日(日) 02:22 |
|
|
|
|