ab.com コミュニティ https://www.activebasic.com/forum/ |
|
システムメニューをいじくる https://www.activebasic.com/forum/viewtopic.php?t=751 |
ページ 1 / 1 |
作成者: | みどるべあ [ 2006年2月19日(日) 02:22 ] |
記事の件名: | システムメニューをいじくる |
タイトルバーなどを右クリックすると出てくるメニューに追加できます。 実行してすぐに結果がわかるサンプル [ここをクリックすると内容が表示されます]
コード: #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実行して、左上を右クリックするとメニューが追加されています。 実用する場合のサンプル [ここをクリックすると内容が表示されます]
プロンプトウィンドウに追加してもどうやってメッセージを拾うのかがわからないorz
コード: 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 FunctionWM_SYSCOMMANDを拾う |
作成者: | 高信期 [ 2006年2月20日(月) 01:46 ] |
記事の件名: | |
>プロンプトウィンドウに追加してもどうやってメッセージを拾うのかがわからない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)))とすれば、追加したシステムメニューに合わせたイベントが追加できます。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |