by hira » 2006年10月07日(土) 23:27
RADツールでウィンドウにエディットボックスを2個(EditBox1・EditBox2)配置し、
コード: 全て選択
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
の下に
コード: 全て選択
Dim lpOldWndProc[1] As VoidPtr
を記述。
MainWnd_Createイベントを下のように変更。
コード: 全て選択
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
lpOldWndProc[0]=SetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,AddressOf(MainWndProc) As LONG_PTR) As VoidPtr
lpOldWndProc[1]=SetWindowLong(GetDlgItem(hMainWnd,EditBox2),GWL_WNDPROC,AddressOf(MainWndProc) As LONG_PTR) As VoidPtr
End Sub
MainWnd_Destroyイベントを下のように変更。
コード: 全て選択
Sub MainWnd_Destroy()
SetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,lpOldWndProc[0] As LONG_PTR)
SetWindowLong(GetDlgItem(hMainWnd,EditBox2),GWL_WNDPROC,lpOldWndProc[1] As LONG_PTR)
xxx_DestroyObjects() 'xxxにはプロジェクト名が入る
PostQuitMessage(0)
End Sub
そしてMainWndProcを下のように変更。
コード: 全て選択
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
Select Case hWnd
Case GetDlgItem(hMainWnd,EditBox1)
If dwMsg=WM_KEYDOWN And wParam=VK_RETURN Then
SetFocus(GetDlgItem(hMainWnd,EditBox2))
End If
MainWndProc=CallWindowProc(lpOldWndProc[0],hWnd,dwMsg,wParam,lParam)
Case GetDlgItem(hMainWnd,EditBox2)
If dwMsg=WM_KEYDOWN And (wParam=VK_LEFT Or wParam=VK_UP) Then
SetFocus(GetDlgItem(hMainWnd,EditBox1))
End If
MainWndProc=CallWindowProc(lpOldWndProc[1],hWnd,dwMsg,wParam,lParam)
Case Else
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Select
End Function
何でこれでうまく動くのかは考えてみて下さい(コールバック関数なので難しいかもしれませんが)。
RADツールでウィンドウにエディットボックスを2個(EditBox1・EditBox2)配置し、
[code]' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。[/code]
の下に
[code]Dim lpOldWndProc[1] As VoidPtr[/code]
を記述。
MainWnd_Createイベントを下のように変更。
[code]Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
lpOldWndProc[0]=SetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,AddressOf(MainWndProc) As LONG_PTR) As VoidPtr
lpOldWndProc[1]=SetWindowLong(GetDlgItem(hMainWnd,EditBox2),GWL_WNDPROC,AddressOf(MainWndProc) As LONG_PTR) As VoidPtr
End Sub[/code]
MainWnd_Destroyイベントを下のように変更。
[code]Sub MainWnd_Destroy()
SetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,lpOldWndProc[0] As LONG_PTR)
SetWindowLong(GetDlgItem(hMainWnd,EditBox2),GWL_WNDPROC,lpOldWndProc[1] As LONG_PTR)
xxx_DestroyObjects() 'xxxにはプロジェクト名が入る
PostQuitMessage(0)
End Sub[/code]
そしてMainWndProcを下のように変更。
[code]Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
Select Case hWnd
Case GetDlgItem(hMainWnd,EditBox1)
If dwMsg=WM_KEYDOWN And wParam=VK_RETURN Then
SetFocus(GetDlgItem(hMainWnd,EditBox2))
End If
MainWndProc=CallWindowProc(lpOldWndProc[0],hWnd,dwMsg,wParam,lParam)
Case GetDlgItem(hMainWnd,EditBox2)
If dwMsg=WM_KEYDOWN And (wParam=VK_LEFT Or wParam=VK_UP) Then
SetFocus(GetDlgItem(hMainWnd,EditBox1))
End If
MainWndProc=CallWindowProc(lpOldWndProc[1],hWnd,dwMsg,wParam,lParam)
Case Else
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Select
End Function[/code]
何でこれでうまく動くのかは考えてみて下さい(コールバック関数なので難しいかもしれませんが)。