摘要载入中…    请稍等…












内容载入中…    请稍等…

如长时间看不到内容,请关闭浏览器,重新打开此页!

芯友首页 应用软件 编程开发 网络硬件 资源下载 动漫音乐 精美图库 芯友论坛 视频教程 电脑技术QQ群:72845454
 ★★photoshop学友-史上最强播放器★★
 位置:编程开发>VB>VB-API文章
◎→ 本类最新
Win95系统API函数大揭秘
WIN32 API的分类介绍--
WIN32 API的分类介绍--
WIN32 API的分类介绍--
WIN32 API
VB中用API函数实现文件夹列表
VB中利用API函数实现特殊窗体的两
◎→相关资源
C语言入门视频教程
C#编程WinForm入门视频
Asp.net入门视频教程下载
VC++编程视频教程下载
VB窗体文章
HTML入门教程
VB基础视频教程
VB窗体文章
VB文件文章
VB数据库文章
VB-API文章
VB控制文章
◎→ 热门资源
ListBox项的控制
HitTest的妙用
HitTest的妙用
B对低层硬件访问控制
《 VB5中注册控件三法 》
指定文件夹
怎样在DELPHI中使用API函数

在VB中使用API函数 (之五)


日期:2008-10-20 17:48:41    来源:互联网
   
 ·《 VB5中注册控件三法 》 ·怎样在DELPHI中使用API函数

在VB中使用API函数 (之五) 
   
  
子类处理 
当你一最大限度利用了VB所给你的并且还想知道更多的东西,或只是想更多地了解你自己的窗口,你将会发现子类处理的优势.

子类处理是指用一个新的窗口函数来取代当前活动窗口函数.这个用户自定义函数能处理任何需要的消息,并能调用原来的窗口函数,它将在原来的窗口函数之前收到各种消息.但原来的那个窗口处理函数依然存在,并没有消失.如果你不想处理某条消息,你应该让原来的窗口函数去处理它.

子类处理是通过调用SetWindowLong函数实现的,该函数将改变指定窗口的特殊属性.下面是它的声明:

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"(ByVal hwnd As Long, ByVal nIndex As Long,ByVal dwNewLong As Long) As Long

第一个参数代表要进行子类处理的窗口,第二个参数应该是GWL_WNDPROC(-4),第三个参数是新的窗口函数的地址.参见回调和窗口函数一节.

此函数将在窗口取得焦点,发生事件,或其他情况下(如其他进程改变了系统的某些参数)被随时调用.

如果发生错误SetWindowLong函数将返回0,否则将返回原来的窗口函数的地址.这个地址特别重要,你应该把它保存在一个变量中或其他地方.当你不处理某些消息时(实际上,你可能只处理不到1%的消息,其他的都将由原窗口函数处理),调用原来的窗口函数就需要该地址.

调用原窗口函数将由CallWindowProc来完成.这里是它的声明:

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

第一个参数是原窗口函数的地址,其他的同你接收到的四个参数一样.你可以改变其中的值来控制对消息的处理.例如,当你收到了一条WM_MOUSEMOVE消息时,你从lParam中得到鼠标所在位置的坐标并将其改成了其他的坐标.那么原窗口函数就会认为鼠标位于其他的位置从而做出一些有趣的事如显示其他控件的Tooltip.

你指定的返回值也是有意义的,它依赖于发送的消息.

在结束你的程序时将控制权交回给原窗口函数是很重要的,通常在Form_Unload中完成如下:

Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProcAddress)

如果你在VB中启动程序时忘掉了这一行,结果将是VB崩溃并会丢失尚未保存的数据.千万要小心.

这里是子类处理的一个简单示例:

Dim oldWndProc As Long

Private Sub Form_Load()

oldWndProc = SetWindowLong(Me.Hwnd, GWL_WNDPROC, AddressOf MyWndProc)

End Sub

Private Sub Form_Unload()

Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProc)

End Sub

Function MyWndProc(ByVal Hwnd As Long,ByVal wMsg as Long,ByVal wParam As Long,ByVal lParam As Long)

Debug.Print wMsg & " " & wParam & " " & lParam

Ret& = CallWindowProc(oldWndProc, Hwnd, wMsg, wParam, lParam)

End Function

处理参数

有时函数并不以你所需的方式返回信息.一个典型的例子是将两个代表鼠标位置的整形(2 byte)数合并为一个4 Byte的数.还有一个例子是判断一个数的某位是否为1.你还可能得到一个代表一个结构地址的Long型数.

合并和分离一个数并不需要过多的描述.你能在我们的网站(www.geocities.com/SiliconValley/Lab/1632/)上找到APIMacro.bas,它包含了你需要的多种函数.

可以用一下方法检查一个数的第N位是否为1:

If Value and (2^N) then ...

置1

Value = Value Or 2^N

置0

Value = Value And Not 2^N

如果你想设定或取得预先知道的某位的信息,用1024代替2^10要快的多.因为这样VB无需自己进行计算(VB憎恨 "^" ?).

如果你接收到一个类型的指针,你要做的工作将稍多一点.你可以使用CopyMem函数来取得信息.下面是它的声明:

Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)

如果你接收到了一个指向RECT 类型的指针并存在Long型变量Addr 中,可以这样处理:

Dim Info As Rect

Call CopyMem(Info, ByVal Addr, len(Info))

注意ByVal关键字.现在,如果你想把信息写回,使用:

Call CopyMem(ByVal Addr, Info, Len(Info))

 [1]

在VB中用API实现多媒体

在VB中使用API函数 (之一)

--->MPlayer V1.0┊播放AVI、RMVB、MP3、MP4、3GP、WMA
--->Rmvb-Play 视频播放器 V2.84 新春版 Build 0519
--->VB学习 V6.9
--->VB游戏编程学习系统 2.1
--->VB7究极快打 V1.0
Tags:  VB API函数

芯友网版权所有 1999-2006 | 著作权与商标声明 | 法律声明 | 服务条款 | 隐私声明 | 联系我们