投稿日 | : 2005/06/07(Tue) 10:00 |
投稿者 | : ダンボ |
URL | : |
タイトル | : 【解決】コントロールの保存・リストア |
魔界の仮面弁士さん、どうもありがとうございました。
Declareまで例示されているのを見て一瞬親切すぎると思いましたが、それがポイントだったんですね。
外部APIをどうVBコンパイラに説明するかの宣言がDeclareの目的であると。
動作確認もできましたので、今の最終コード(主要部のみ)と勝手な寸評を付けて終わりにします。
(1)Collectionオブジェクト
最初の1回目だけオブジェクトの準備をしなければならない特異性がちょっと嫌。
hWndを文字列にしてキーとすれば検索性が良い(バイナリはキーにできないのかな?)
(2)SetWindowLong
シンプルで良い。hWndにつき1つしか格納できないので、複数データを保存したいとなるとMalloc等で
メモリ取って構造体にしてと複雑になりそう。
(3)SetProp
キーの文字列比較で遅くなりそうだが、気兼ねなく複数データを保存できる。
(4)Redim動的なコントロール配列
リエントラント性を考慮すると厭らしくなりそう。
Private Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal hWnd As Long, ByVal
lpString As String, ByVal hData As Control) As Long
Private Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal hWnd As Long, ByVal
lpString As String) As Control
Private Declare Function RemoveProp Lib "user32" Alias "RemovePropA" (ByVal hWnd As Long,
ByVal lpString As String) As Long
Public Function WheelOpen(usrCNT As Control) As Long
If GetWindowLong(usrCNT.hWnd, GWL_USERDATA) <> 0 Then Exit Function
rc = SetWindowLong(usrCNT.hWnd, GWL_USERDATA, SetWindowLong(usrCNT.hWnd, GWL_WNDPROC,
AddressOf SubClassProc))
rc = SetProp(usrCNT.hWnd, "CNT", usrCNT)
End Function
Public Function WheelClose(usrCNT As Control) As Long
If GetWindowLong(usrCNT.hWnd, GWL_USERDATA) = 0 Then Exit Function
rc = RemoveProp(usrCNT.hWnd, "CNT")
rc = SetWindowLong(usrCNT.hWnd, GWL_WNDPROC, SetWindowLong(usrCNT.hWnd, GWL_USERDATA, 0))
End Function
Private Function SubClassProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long,
ByVal lParam As Long) As Long
Dim C As Control
Select Case uMsg
Case WM_MOUSEWHEEL
Set C = GetProp(hWnd, "CNT")