|
|
||||
首页
文学作品 网页设计 平面设计 程序设计 考试认证 基础办公 QQ资源 服务器架设 网站运营 网页资源
|
|
|
| 汉南在线 → 程序设计 → VB程序 | |||||||||||
借助API函数CallWindowProc,DragAcceptFiles,DragQueryFile,DragFinish同样可以实现文件从资源管理器EXPLORE到应用程序的拖放,另一种方法是采用OLE拖放,可以参照趣味编程栏目的相关内容。下面我们一起来看看程序编写的过程。 对于每个需要引用的API函数,我们需要先在程序中说明,如果只在某一窗体内声明并使用它,则把它声明为Private,而如果在模块中声明,且需要在整个工程内使用它,则需要把它声明为Public。 Public Declare Function CallWindowProc& Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&) SetWindowLong函数的作用是在窗口结构中为指定的窗口设置属性,利用它我们来改变窗口的属性参数,其中各个参数的意义如下表所示: 参数 意义 在默认状态下WINDOWS操作系统会指定一个窗口函数来接受和处理WINDOWS消息,而通过使用SetWindowLong函数改变窗口函数的地址使它指向我们自己写的一个函数WindowProc,这样WINDOWS消息就会转由WindowProc函数接收和处理。于是我们就能判断文件拖放的消息并进行处理。改变窗口属性的语句如下: procOld = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc) DragAcceptFiles、DragQueryFile、DragFinish三个函数的作用分别是:把某个窗口设置为接收拖放的容器、返回拖放的文件的数量和信息、终止拖放。 为了学习方便,以下提供了源代码: '------------------------------------------- Private Sub Form_Load() Private Sub Form_Unload(Cancel As Integer) '此句关键,把窗口(不是窗体,而是具有句柄的任一控件,这里指Picture1)的属性复原 End Sub Public Sub DropFiles(ByVal hDrop&) Dim sFileName$, IReturn& End Sub
Public Declare Function CallWindowProc& Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&) '拖放操作相关的API函数 Public Declare Sub DragAcceptFiles Lib "shell32.dll" (ByVal hWnd&, ByVal fAccept&) '注意这段代码是不能用DEBUG一步步调试的,否则会造成错误(崩溃) '对消息截获的机制可以按下述理解: ' 这里要仔细理解一下,我们为窗体新指定了窗体函数地址,也就是说操作系统发送给窗体的 '消息将被 WindowProc函数 所截获(而改变前消息是被默认的 窗体函数 所获得并作相应处理的) ' 这样我们在 WindowProc函数 中对所截获的消息进行判断,会有三种情况: '<2>如果是要原来的 窗体函数 来处理则把这个消息传递给原窗体函数(其实是指针指向的改变); '<3>如果不是我们需要的消息,也传递给原 窗体函数 来处理。 '可以参见 改变系统菜单 中的源码注释 'WARNING!!!!----------------------------------------------------------- '回调函数,用来截取消息 什么是子类派生技术 WINDOWS运行的基础是“消息机制”,所谓的“消息”是一个唯一的值,这个值会被一个窗体或操作系统收到,它能告诉什么事件发生了以及需要采用什么样的动作来响应。这与我们人类的神经系统将感知的信息传递给大脑,而大脑发出指令给我们的身体非常相似。于是每一个窗体都具有一个消息句柄,这个机制使得所有发自于WINDOWS操作系统的消息能被接收到需要强调的是每个窗体以及每个控件,包括按钮、文本框、图片框等都具有这样的消息句柄。WINDOWS操作系统会跟踪这些消息句柄,这称为类结构中的一个WindowProc,所谓的类结构是于窗体句柄相关联的。 当我们加入一个新的WindowProc函数而这个WindowProc与原始的窗体函数相符合的话,我们称这个窗被子类化了。换言之,如果WINDOWS操作系统发给你所在的WindowProc一个消息,而你所在的WindowProc正在响应其它的动作,这时你必须将剩余的消息传递给一个默认的WindoProc。 如下所示: 操作系统消息-->你所在WindoProc-->默认的WindoProc而一个窗体是可以被子类化多次的,这样就产生了如下的情况: Windows Message Sender --> Your WindowProc --> Another WindowProc _--> Yet Another WindowProc --> Default WindowProc What is subclassing anyway? 通过窗体子类化,你可以改变响应消息的顺序,也就是说,你可以把消息传递到默认的WindowProc上而不立即响应。举个例子: 如果我们要在接收到WM_PAINT 消息后,在窗体上画出一些东西,可以用下面的语句实现: Public Function WindowProc(Byval hWnd, Byval etc....) Select Case iMsg '筛选出WM_PAINT消息 Case WM_PAINT '如果是WM_PAINT 消息 DoDrawingStuff '进行画图操作 Exit Function
| |||||||||||
| >> 相关文章 | |||||||||||
|
授权使用:汉南在线 http://www.hzwz.net/(2008-2009) Copyright (c) 2002-2007 汉南在线. All Rights Reserved . 经营许可证:陕ICP备05000109号 Powered by:汉南在线 |