VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 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")


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -