• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            旅途

            如果想飛得高,就該把地平線忘掉

            讓一組相同的控制項有相同的行為(SuperClass)

               如果您見過本人的文章"Window簡介(二) 如何攔截ComboBox MouseMove"應(yīng)可以了解SubClass的動作是針對某一個Window來動作,像上面的這個文章就告訴大家如何透過SubClass來讓 ComboBox能偵測到MouseMove,而如果有一群ComboBox全要偵測到MouseMove那不就每一個ComboBox都要來做 SubClass的動作,有沒有一次完成不要如此麻煩的呢?原則上這是使用SuperClass可完成,SuperClass的作法是:

              1.取得原本Class的設(shè)定(如:原本ComboBox的設(shè)定),可用GetClassLong來取得
              2.更動Class的設(shè)定,可用SetClassLong來設(shè)定
              3.依新的設(shè)定Create控制項,而且唯有新Create出的控制項才有作用,舊有的沒有受
                影響。

            再來看一下GetClassLong,SetClassLong的第一個叁數(shù),它是hWnd,想想看,這是更動某一個Class的API,而不是只更動 某個Window的API,怎麼傳入hWnd,沒錯,那是間接的作法,由hWnd可以得知那是屬於哪一種Class的控制項,進而改變/取得 該hWnd所屬Class類別的設(shè)定。那現(xiàn)在就出現(xiàn)一個問題,我們要先Create出一個Window(控制項)而後才能取得其hWnd,之後才下 SetClassLong來更動設(shè)定,而這個Window因為是在更動設(shè)定之前所造出來的,所以新的設(shè)定沒有在這個Window上作用(這是Window 的作法,沒有辦法),所以我們說不得,只好將該Window Kill掉,之後Create的Window才是我們想要的。如果使用的是純Window API的設(shè)計,可能不用如此,而使用以下三個步驟:

               1.取得Class的設(shè)定,使用GetClassInfoEx()取得,并記錄下來
               2.更動原先的記錄,將之變成另外一個Class
               3.注冊該Class,并CreateWindow

            但這樣做,就沒有vb的使用者介面,將Control項放到Form上那麼容易,一切都用API來做,我想沒有人會如此吧?

            所以啦,在VB的話,就只好使用物件陣列的作法,因為透過它,可以做到到動態(tài)新增、移除Control項的功能,不過正因它是事後才產(chǎn)生的,所以我們對之的控制相對的就要付出代價(如:位置的設(shè)定)。

            注釋:以下程式在module1.bas
            Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
              (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _
               ByVal wParam As Long, ByVal lParam As Long) As Long
            Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
            Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

            Public Const GCL_WNDPROC = (-24)
            Public Const WM_MOUSEMOVE = &H200

            Public preWinProc As Long

            Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _
                                     ByVal wParam As Long, ByVal lParam As Long) As Long
            注釋:以下程式會截取mouse move,處理完後,再將之送往原來的Window Procedure

            If Msg = WM_MOUSEMOVE Then
                注釋:請?zhí)幚鞰ouse Move的動作
                Debug.Print "Combol Mouse Move , hwnd="; hwnd
            End If
            注釋:將之送往原來的Window Procedure
            wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
            End Function

            注釋:以下程式在Form1, form1中有一Combo1并事先設(shè)定其Index =1
            Sub Form_Load()
            Dim ret As Long
            Combo1(1).Move 5, 5
            注釋:記錄原本的Window Procedure的位址
            preWinProc = GetClassLong(Combo1(1).hwnd, GCL_WNDPROC)
            注釋:設(shè)定Combo1的window Procedure到wndproc
            ret = SetClassLong(Combo1(1).hwnd, GCL_WNDPROC, AddressOf wndproc)
            注釋:動態(tài)產(chǎn)生兩個Combo,Mouse在這兩個Combo上才會偵測到MouseMove
            Load Combo1(2)
            Combo1(2).Move 5, 400
            Combo1(2).Visible = True
            Load Combo1(3)
            Combo1(3).Move 5, 800
            Combo1(3).Visible = True
            Debug.Print "Combo1(1).Hwnd="; Combo1(1).hwnd
            Debug.Print "Combo1(2).Hwnd="; Combo1(2).hwnd
            Debug.Print "Combo1(3).Hwnd="; Combo1(3).hwnd
            End Sub

            Private Sub Form_Unload(Cancel As Integer)
            Dim ret As Long
            注釋:取消Message的截取,而使之又只送往原來的Window Procedure
            ret = SetClassLong(Combo1(1).hwnd, GCL_WNDPROC, preWinProc)
            End Sub


            posted on 2007-07-18 00:32 旅途 閱讀(162) 評論(0)  編輯 收藏 引用 所屬分類: 深入windows

            国产69精品久久久久777| 久久久久人妻精品一区 | 国产L精品国产亚洲区久久| 97r久久精品国产99国产精| 99久久国产主播综合精品| 国内精品久久久久久久亚洲| 久久久久久国产a免费观看不卡| 日韩亚洲国产综合久久久| 久久精品久久久久观看99水蜜桃| 亚洲午夜久久久久妓女影院| 91精品国产综合久久婷婷| 人人狠狠综合久久亚洲| 久久天天躁狠狠躁夜夜96流白浆| 亚洲午夜久久久精品影院| 精品多毛少妇人妻AV免费久久| 浪潮AV色综合久久天堂| 久久99精品久久久久久野外 | 麻豆av久久av盛宴av| 狠狠色婷婷久久一区二区三区| 国产高清美女一级a毛片久久w | 日产久久强奸免费的看| 久久精品日日躁夜夜躁欧美| 久久久91人妻无码精品蜜桃HD | 国产综合免费精品久久久| 久久久噜噜噜久久中文字幕色伊伊 | 国内精品久久久久久99| 国产精品久久久久免费a∨| 青青青国产成人久久111网站| 亚洲欧美日韩久久精品第一区| 久久久精品人妻无码专区不卡| 精品国产一区二区三区久久| 亚洲色大成网站WWW久久九九| 久久久黄色大片| 久久夜色撩人精品国产| 久久精品国产亚洲精品| 精品久久久久久国产牛牛app | 久久精品国产一区二区三区不卡| 国产精品久久久亚洲| 久久99精品久久久久久久久久| 人人狠狠综合久久88成人| 99久久精品国产一区二区|