新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 C/C++编程思想 』 → Win32 API讲座 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 16099 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: Win32 API讲座 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     一分之千 帅哥哟,离线,有人找我吗?射手座1984-11-30
      
      
      威望:1
      等级:研一(随老板参加了WWW大会还和Tim Berners-Lee合了影^_^)
      文章:632
      积分:4379
      门派:XML.ORG.CN
      注册:2006/12/31

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给一分之千发送一个短消息 把一分之千加入好友 查看一分之千的个人资料 搜索一分之千在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看一分之千的博客楼主
    发贴心情 

    第二课∶句柄、矩形和画点函数
    一、句柄
    今天开始,我向大家讲有关API的是实质性内容。我们就从句柄开始。 只要你来到了API的世界,经常碰到的问题之一就是句柄。那么究竟什么是句柄呢 如果你从来都没有听说过句柄这个词,可能首先觉得句柄当中有很多内容。其实不然,所谓句柄实际上是一个数据,是一个Long (整长型)的数据。在API中,它经常是以一个参数的形式传递给各种API函数。如 Public Declare Function GetWindow& Lib user32 (ByVal hwnd As Long, ByVal wCmd As Long)

    其中,hwnd就是句柄。在VB里,句柄是一种属性,您打开VB中的对象游览器看一看Form 窗体或者PictureBox控件等究竟有没有hwnd属性。是有的。VB中的解释是这样的∶ Microsoft Windows 运行环境,通过给应用程序中的每个窗体和控件分配一个句柄(或 hWnd)来标识它们。hWnd 属性用于Windows API调用。许多 Windows 运行环境函数需要活动窗口的 hWnd 作为参数。

    如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢

    为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows 内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。句柄地址(稳定)→记载着对象在内存中的地址────→对象在内存中的地址(不稳定)→ 实际对象

    但是,必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。 在VB中获得一个对象的句柄十分简单,如要获取Form1窗体的句柄,就可以这样写∶ Form1.Hwnd

    对象的句柄还可以通过API函数来获得,如∶

    GetActiveWindow 返回位于最顶部的具有输入焦点的窗口句柄 GetFocus 获得当前线程里补获鼠标输入的窗口句柄 GetForegroundWindow 从位于前台的线程里返回活动窗口的句柄 GetCursor 取得当前指针的句柄 GetDesktopWindow 获取整个桌面的句柄 GetWindow 获得一个窗口的句柄,该窗口与某源窗口有特定的关系《以上函数说明均可在WinAPI.hlp文件中找到。》

    注意以下几点∶ 1,线程内与线程外。(VB不支持多线程)。其他应用程序对此程序来说都是线程外。 2,在windows95操作系统下,各个窗体(包括一些控件,如文本框,图片框等, MICROSORT对它们均统称为窗体)拥有各自的鼠标指针。这和win16下各应用程序使用同样一个指针是截然不同的。

    3,每次从新启动,各窗体的句柄都有所变化。Text5 的装载和卸载过程中,句柄始终是在变化着的。这说明了上面提的影院售门票中存在的现象是真实的。 获得对象句柄的函数还有很多,以后碰到它们时再介绍给大家。

    二、驾驶句柄

    只要弄清了什么是句柄,尤其是窗口句柄,那么操纵一个对象就变得自如一多了。比如,可以通过GetWindowText API函数,我们可以轻松地获得某特定窗口的标题。 GetWindowText 在VB中的声明如下 Private Declare Function GetWindowText& Lib user32 Alias GetWindowTextA (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) 于是,我们可以通过以下一段代码来获得Form1的窗口标题。(新建一个项目,添加一个命令按钮,把以下的代码拷贝过去,还有上面的函数声明。你就可以运行了)

    Private Sub Command1_Click() Dim dl As Long Dim FormCaption As String FormCaption = Space(128) dl& = GetWindowText(Form1.hwnd, FormCaption, 128) Print FormCaption End Sub 注∶其中128是指字符串变量FormCaption的长度(又称缓冲区大小)

    这有必要吗为了获得Form1窗体的标题,何必写这么多代码呢难道这就是API。是的,的确在VB中用 Print Form1.Caption 一行代码就可以抵挡住以上代码了。但是,假如我们启动我们设计的应用程序后,想要在用鼠标点一下别的应用程序的时候,让我们的应用程序显示出那个窗体的标题,那又该怎么办呢比方说,我们另外启动的是Micorsoft Word, 用鼠标点击Word时让程序显示出您选择了Microsoft Word字样。显然只靠VB是办不到的,还得靠API这老手。

    当然,您已经具备了这种能力,可以办到这件事情。让我们一起来。 关键的问题是如何获得Word程序的句柄。首先要认清的是,对VB的应用程序来说,Word 是属于进程外应用程序。正和您已经想到的那样,我们可以使用前一个示范程序用到过的 GetForegroundWindow API函数获取它的句柄。因为,当我们用鼠标点击Word时,Word 将成为前台活动窗体。接着呢当然是 GetWindowText函数显示它的标题就可以了。我们可以采用Timer控件来完成这一切。剩下的事情就不用我多说了。本教程附带的 Program2.vbp程序是,为那些懒得由自己动手写这几行代码的人准备的,但愿您不是。如果你还没有写过API应用程序,可以说这是一个好的机会,还是动一动你的手吧,会有好处的。

    程序正常运行了没有哈,这下感觉到API的魅力了吧 还想不想继续学下去呀!

    三、矩形和点

    关于矩形和点,我们在上一个课堂中简单提了一下。在这里,就做一下详细的介绍。 先从简单点(Point)结构的开始。点的结构如下∶ Type POINTAPI x as Long y as Long End Type 在英语里,点叫Point,那么为什么不叫POINT,而叫POINTAPI呢原来,VB中有Point 方法,这只是为了不必要的冲突或重名。Point用于描述一个位置,当然是一个点的位置了。在屏幕坐标中,x指的是从屏幕左边界到指定点的距离,y指的是从屏幕顶边界到指定点的距离。初次之外,没有太多的学问了,还是那句老话──牢记按引用传递。

    矩形的结构和点结构差不到哪儿去,只不过是用两个点来描述的。它的结构定义如下 Public Type RECT

    Left As Long Top As Long Right As Long Bottom As Long End Type 以下图描述了RECT结构各字段的含义。 可以看出,一个矩形区域是通过矩形的左上角的一个点和右下角的一个点,共两个点来描述的。其中,left和top字段描述了巨型的第一个角的位置,right和bottom字段描述了矩形的第二个角即右下角的位置。 在VB中,描述一个窗体或控件所处的矩形位置时,经常用Left,top以及Width,height来描述的。其中,Width是一个巨型区域的宽度,Height是高度。在此,您应当看到,RECT结构中并不是这样。如,想要获得宽度,必须从right中减掉left。

    API中有若干个函数用来处理矩形数据结构,如,下表所列∶

    函 数 功 能 EquaRect 判断两个矩形是否相同,如果相同则返回True(非0) InflateRect 增加或减少矩形的尺寸 InterSectRect 获得两个矩形相重叠的部分,即一个新的矩形 IsRectEmpty 如矩形为空,则返回TRUE OffsetRect 按规定的偏移量移动一个矩形的位置 ptInRect 判断一个指定点是否位于给出的矩形的内部 SetRect 设置巨型的参数字段值 SetRectEmpty 将所有字段都设为0,从而将矩形置空 SubtractRect 将一个矩形从另一个巨型里减去。即切掉 UnionRect 获得同时包含两个矩形区域的最小矩形。 CopyRect 将一个矩形的内容复制给另一个 这几个函数,都是很好理解和实际应用的。

    ----------------------------------------------
    越学越无知

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/9/6 9:01:00
     
     GoogleAdSense射手座1984-11-30
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/6/3 17:33:33

    本主题贴数7,分页: [1]

     *树形目录 (最近20个回帖) 顶端 
    主题:  Win32 API讲座(10236字) - 一分之千,2007年9月6日
        回复:  第七课∶位图 一、概述在Windows中每屏是一个图形图像,灵巧的Windows制作系统,面..(45460字) - 一分之千,2007年9月6日
        回复:  第六课∶绘图函数 一、位操作前几天,在很远很远又是那么远的地方,有位网友来信问一些有关位操作..(24365字) - 一分之千,2007年9月6日
        回复:  第五课∶设备场景 一、什么是设备场景关于设备场景,叫法颇多,有些书上说为设备环境、显示场景,..(18801字) - 一分之千,2007年9月6日
        回复:  第四课:鼠标、插入符及系统函数 一、指针剪切什么是指针呢我想大家都知道,没必要我多讲。只是概..(11741字) - 一分之千,2007年9月6日
        回复:  第三课∶窗口函数 一、 关于窗口函数在上一堂课里,我们已经提出了句柄的概念,并为此进行了较深..(11134字) - 一分之千,2007年9月6日
        回复:  第二课∶句柄、矩形和画点函数 一、句柄 今天开始,我向大家讲有关API的是实质性内容。我们就从..(6429字) - 一分之千,2007年9月6日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    93.750ms