VB的一些小知识——重载Wndproc

来源:互联网 发布:我的妻子是网络主播 编辑:程序博客网 时间:2024/04/30 08:56

废话不说!大神直接飘过、

直接简介;

代码语言:Visual Basic

代码作用:本代码直接采用重载Wndproc的方式构造一个可以吸附在屏幕顶部的窗口

'模块代码==========================================================

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"   (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA"  (ByVal hwnd As Long, ByVal nIndex As Long) As Long
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 Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (   lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Public Const GWL_WNDPROC = (-4)
Public Const WM_WINDOWPOSCHANGING = &H46
Type WINDOWPOS
        hwnd As Long
        hWndInsertAfter As Long
        x As Long
        y As Long
        cx As Long
        cy As Long
        flags As Long
End Type

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
  Dim lwd As Long, hwd As Long
  If Msg = WM_WINDOWPOSCHANGING Then
     Dim WPOS As WINDOWPOS
     CopyMemory WPOS, ByVal lParam, Len(WPOS)
        If WPOS.y < 20 Then WPOS.y = 0
      CopyMemory ByVal lParam, WPOS, Len(WPOS)
  End If
   wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function

'窗口代码===========================================================

Private Sub Form_Load()
  Dim ret As Long
  preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
  ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Dim ret As Long
  ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
End Sub

‘==================================================================

相信很多人看到代码都是一个想法,直接贴到程序里,这里我还是希望大家注意代码的理解;

这样你可以做到的不仅仅是代码能够实现的功能,你可以常识这改代码,然后写属于自己的代码,来实现更多的功能!

对于以上代码不做解释;可以修改If WPOS.y < 20 Then WPOS.y = 0
这个判断条件来实现更多的功能,相信经过一番尝试就会懂的!提示注意消息WM_WINDOWPOSCHANGING 的结构;

可以查查各个参数的含义,当然猜也猜得到!