精华内容
下载资源
问答
  • 最近工作中关于UI开发方面的东西多了些,碰到问题的时候查阅了很多资料,对Windows窗口的一些概念的理解也慢慢深入了很多。在这篇中把一些比较容易混淆和相关资料比较少的概念做一个总结,可能你用到这些概念的几率...

    最近工作中关于UI开发方面的东西多了些,碰到问题的时候查阅了很多资料,对Windows窗口的一些概念的理解也慢慢深入了很多。在这篇中把一些比较容易混淆和相关资料比较少的概念做一个总结,可能你用到这些概念的几率不大,但是一旦你遇到相关问题,解决起来还真是要费一番功夫。

     

        一、窗口的分类
        Windows定义了3种窗口类型:
        #define WS_OVERLAPPED       0x00000000L
        #define WS_POPUP            0x80000000L
        #define WS_CHILD            0x40000000L
        顾名思义,CHILD是从属于其他窗口的子窗口;POPUP是弹出窗口;OVERLAPPED为重叠式窗口,MSDN中并没有给出该窗口的确切定义,只提到该类型的窗口一般都有标题栏和边框。其实从WS_OVERLAPPEDWINDOW宏的定义我们可以知道,OVERLAPPED窗口通常拥有标题栏、边框、客户区、图标、可调整尺寸边框、最小化和最大化按钮。
        看上去这3种类型的窗口我们已经解释清楚了,但是其实还有很多概念需要阐述,下一节我们再仔细研究。
        现在考虑一个问题:一个窗口能不能具有多个类型?这个问题在这篇文章里作者做了探讨http://blog.csdn.net/guogangj/archive/2008/12/06/3460267.aspx),不过好像最后并没有明确的答案,这里总结一些比较确切的结论:
        1、OVERLAPPED类型窗口适合作为应用程序的主窗口,或者POPUP类型也可以,如基于对话框的应用程序;
        2、OVERLAPPED类型和POPUP类型比较类似,但是OVERLAPPED类型默认具有标题栏等元素,而且即使你显示去掉WS_CAPTION和WS_BORDER这些风格,Windows还是会加上标题栏和边框,POPUP类型没有这个特点;另外在CreateWindow函数中对于CW_USEDEFAULT默认值的取值是不同的;
        3、OVERLAPPED类型不能和CHILD类型同时设置,原因后面说明;
        4、事实上这3种类型的窗口不应该混合应用,虽然Windows会对他们的混合做处理,但是并没有官方的说明,我们无从确切的知道这样的行为的结果。

     

        二、窗口的parent和owner
        上一节只是大概介绍了窗口的3种类型,还有很多概念需要我们仔细弄个明白。
        1、Desktop窗口
        简单的说就是桌面窗口。desktop窗口是Windows产生的第一个窗口,上面的图画就是壁纸。desktop窗口是一个特殊的窗口,不属于上面3种窗口类型中的任何一种。你可以把Windows的所有窗口想象成一个树结构,而这棵树的根就是desktop窗口。
        2、Top-Level窗口
        top-level窗口是指没有WS_CHILD属性的窗口,它们的parent通常为desktop窗口或者为NULL。top-level窗口是desktop窗口的下一级。
        3、子窗口(child window)
        具有WS_CHILD属性的窗口为子窗口,它们必须有父窗口(parent),同时子窗口可以拥有自己的子窗口。子窗口只能出现在父窗口的客户区之内,子窗口不能成为活动窗口,也不能显示在任务栏上。建立子窗口时的区域坐标是以父窗口客户区左上角为原点的,而非子窗口是屏幕坐标。子窗口显示在父窗口显示之后,隐藏在父窗口隐藏之前,销毁在父窗口销毁之前。
        4、重叠式窗口(overlapped)
        具有WS_OVERLAPPED属性的窗口为重叠式窗口。重叠式窗口一定是top-level窗口,因此它们不能再具有WS_CHILD属性。
        5、弹出窗口(popup)
        具有WS_POPUP属性的窗口为弹出窗口,弹出窗口也是top-level窗口,它和重叠式窗口都可以显示在桌面的任何地方。
        6、parent和owner
        这两个概念是本节需要重点阐述的。Windows中上下级窗口的关系有两种:parent-child和owner-owned,一个窗口在有parent窗口的情况下还可能有owner窗口。这两种关系有什么联系和区别呢?
        这篇文章中写得比较清楚http://blog.vckbase.com/iwaswzq/archive/2006/09/12/22380.html),截取其中一段:

     

        如果一个窗口数据的owner域非NULL,则它和该窗口建立了owner-owned 关系,拥有关系决定了:
        (1)被拥有的窗口永远显示在拥有它的那个窗口的前面;
        (2)当所有者窗口最小化的时候,它所拥有的窗口都会被隐藏;
        (3)当所有者窗口被销毁的时候,它所拥有的窗口都会被销毁。
        需要注意的是,隐藏所有者窗口并不会影响它所拥有的窗口的可见状态。比如:如果窗口 A 拥有窗口B,窗口B拥有窗口C,则当窗口A最小化的时候,窗口B被隐藏,但是窗口 C还是可见。

        如果一个窗口的parent域非NULL,则它和该窗口之间就建立了parent-child关系。父子决定了:
        (1)窗口在屏幕上面的显示位置。父窗口提供了用来定位子窗口的坐标系统,一个子窗口只能显示在它的父窗口的客户区中,之外的部分将被裁减。这个裁减法则决定了如果父窗口不可见,则子窗口肯定不可见。如果父窗口移动到了屏幕之外,子窗口也一样。
        (2)当父窗口被隐藏时,它的所有子窗口也被隐藏。
        (3)父窗口被销毁的时候,它所拥有的子窗口都会被销毁。
         注意!最小化父窗口不会影响子窗口的可见状态,子窗口会随着父窗口被最小化,但是它的WS_VISIBLE属性不会变。

     

        另外,parent-child关系是双向的,一个窗口知道自己的parent和child;owner-owned关系是单向的,窗口只知道自己的owner。
        下面我们总结一下窗口类型与parent、owner窗口之间的关系特点。
        1、子窗口一定有parent,且parent即相当于owner,子窗口的父窗口可以为top-level窗口或者其他子窗口;
        2、只有overlapped窗口和popup窗口可以是owner窗口,子窗口不能是owner窗口;
        3、overlapped窗口和popup窗口的parent一般都是desktop窗口,由于overlapped窗口多用于作为应用程序的主窗口,其owner一般为desktop窗口;而popup窗口的owner是在CreateWindow函数中通过设置hWndParent参数给定的,如果hWndParent为非子窗口,则这个窗口即为popup窗口的owner;如果hWndParent为子窗口,系统从hWndParent的父窗口向上找,直到找到第一个非子窗口,把它作为该popup窗口的owner;
        
        Windows的API函数GetParent可以获取窗口的parent或owner,如果是子窗口则返回parent;如果overlapped窗口返回NULL;如果是popup窗口返回其owner。用API函数GetWindow(GW_OWNER)可以获取窗口的owner,或者用MFC CWnd类的成员函数GetOwner也可以。

     

        三、窗口WS_CLIPSIBLING和WS_CLIPCHILDREN风格
        首先简单的解释一下这两个风格的意义。
        WS_CLIPSIBLING 风格用于同一级的子窗口之间,表示当某设置了该风格的子窗口需要重绘时,被其他窗口遮挡的部分(按照Z-order)将被裁减,也就是被遮挡区域不进行重绘。
        WS_CLIPCHILDREN 风格则用于父窗口和子窗口之间,表示当某设置了该风格的父窗口需要重绘时,被子窗口遮挡的部分将被裁剪,即被遮挡的区域不进行重绘。
       
        在Windows系统的窗口中,凡是overlapped窗口和popup窗口都肯定具有WS_CLIPSIBLING风格,即使你写代码将这个风格去掉,Windows还是会自动加上。
        为什么呢?仔细想想就清楚了,我们可以认为overlapped窗口和popup窗口都是desktop窗口的同一级“子窗口”,他们之间要想在互相重叠的时候正确显示,就必须具有这个风格。为什么同一级子窗口重叠时都要有WS_CLIPSIBLING风格呢?比如现在有一个父窗口P,它有两个重叠的子窗口A和B,A的Z-order在B之前,那么正常显示的话A应该把B中重合的区域遮挡住。Windows在判断一个窗口区域是否需要重绘的时候,一般是看这个区域是否被其他窗口遮挡。因为此时系统认为A始终在B的上面,并未被遮挡,所以当你移动A窗口的时候,A的窗口内部区域是不会被通知重绘的。此时B被遮挡的部分肯定会被通知重绘,于是你会发现B重绘的时候却把与A重合的区域画乱了。但是如果我们把A和B都指定了WS_CLIPSIBLING风格以后,B被遮挡的部分的重绘就被裁剪掉了,这样它就不会捣乱了。
        当然,对于我们平时在对话框上用的最多的控件子窗口,虽然它们都没有WS_CLIPSIBLING风格,但是由于它们基本不重叠,因此不会彼此影响。
        如果你只为一部分子窗口设置了WS_CLIPSIBLING风格,就要保证其他窗口的所有重绘都发生在设置风格的子窗口之前,否则也会出现问题。对于对话框的控件来说,可以通过控制Tab-order来控制绘制顺序;对于其他子窗口,可以通过控制Z-order控制。

        对于WS_CLIPCHILDREN风格也是相同的问题,如果你不想父窗口的重绘影响到子窗口的绘制,那么最好给父窗口加上WS_CLIPCHILDREN风格。

     

        关于窗口的一些概念就先写这些吧,如果你对这些概念比较模糊的话,相信读完这篇文章会有很多收获。对于其中某些描述,我尽量做到严谨,但是可能会有错误的地方,请大家指正。另外有很多概念微软根本没有明确的定义和解释,所以还需要大家多摸索,在实践中探索规律性的东西。

    展开全文
  • 最近工作中关于UI开发方面的东西多了些,碰到问题的时候查阅了很多资料,对Windows窗口的一些概念的理解也慢慢深入了很多。在这篇中把一些比较容易混淆和相关资料比较少的概念做一个总结,可能你用到这些概念的几率...

    最近工作中关于UI开发方面的东西多了些,碰到问题的时候查阅了很多资料,对Windows窗口的一些概念的理解也慢慢深入了很多。在这篇中把一些比较容易混淆和相关资料比较少的概念做一个总结,可能你用到这些概念的几率不大,但是一旦你遇到相关问题,解决起来还真是要费一番功夫。

     

        一、窗口的分类
        Windows定义了3种窗口类型:
        #define WS_OVERLAPPED       0x00000000L
        #define WS_POPUP            0x80000000L
        #define WS_CHILD            0x40000000L
        顾名思义,CHILD是从属于其他窗口的子窗口;POPUP是弹出窗口;OVERLAPPED为重叠式窗口,MSDN中并没有给出该窗口的确切定义,只提到该类型的窗口一般都有标题栏和边框。其实从WS_OVERLAPPEDWINDOW宏的定义我们可以知道,OVERLAPPED窗口通常拥有标题栏、边框、客户区、图标、可调整尺寸边框、最小化和最大化按钮。
        看上去这3种类型的窗口我们已经解释清楚了,但是其实还有很多概念需要阐述,下一节我们再仔细研究。
        现在考虑一个问题:一个窗口能不能具有多个类型?这个问题在这篇文章里作者做了探讨http://blog.csdn.net/guogangj/archive/2008/12/06/3460267.aspx),不过好像最后并没有明确的答案,这里总结一些比较确切的结论:
        1、OVERLAPPED类型窗口适合作为应用程序的主窗口,或者POPUP类型也可以,如基于对话框的应用程序;
        2、OVERLAPPED类型和POPUP类型比较类似,但是OVERLAPPED类型默认具有标题栏等元素,而且即使你显示去掉WS_CAPTION和WS_BORDER这些风格,Windows还是会加上标题栏和边框,POPUP类型没有这个特点;另外在CreateWindow函数中对于CW_USEDEFAULT默认值的取值是不同的;
        3、OVERLAPPED类型不能和CHILD类型同时设置,原因后面说明;
        4、事实上这3种类型的窗口不应该混合应用,虽然Windows会对他们的混合做处理,但是并没有官方的说明,我们无从确切的知道这样的行为的结果。

     

        二、窗口的parent和owner
        上一节只是大概介绍了窗口的3种类型,还有很多概念需要我们仔细弄个明白。
        1、Desktop窗口
        简单的说就是桌面窗口。desktop窗口是Windows产生的第一个窗口,上面的图画就是壁纸。desktop窗口是一个特殊的窗口,不属于上面3种窗口类型中的任何一种。你可以把Windows的所有窗口想象成一个树结构,而这棵树的根就是desktop窗口。
        2、Top-Level窗口
        top-level窗口是指没有WS_CHILD属性的窗口,它们的parent通常为desktop窗口或者为NULL。top-level窗口是desktop窗口的下一级。
        3、子窗口(child window)
        具有WS_CHILD属性的窗口为子窗口,它们必须有父窗口(parent),同时子窗口可以拥有自己的子窗口。子窗口只能出现在父窗口的客户区之内,子窗口不能成为活动窗口,也不能显示在任务栏上。建立子窗口时的区域坐标是以父窗口客户区左上角为原点的,而非子窗口是屏幕坐标。子窗口显示在父窗口显示之后,隐藏在父窗口隐藏之前,销毁在父窗口销毁之前。
        4、重叠式窗口(overlapped)
        具有WS_OVERLAPPED属性的窗口为重叠式窗口。重叠式窗口一定是top-level窗口,因此它们不能再具有WS_CHILD属性。
        5、弹出窗口(popup)
        具有WS_POPUP属性的窗口为弹出窗口,弹出窗口也是top-level窗口,它和重叠式窗口都可以显示在桌面的任何地方。
        6、parent和owner
        这两个概念是本节需要重点阐述的。Windows中上下级窗口的关系有两种:parent-child和owner-owned,一个窗口在有parent窗口的情况下还可能有owner窗口。这两种关系有什么联系和区别呢?
        这篇文章中写得比较清楚http://blog.vckbase.com/iwaswzq/archive/2006/09/12/22380.html),截取其中一段:

     

        如果一个窗口数据的owner域非NULL,则它和该窗口建立了owner-owned 关系,拥有关系决定了:
        (1)被拥有的窗口永远显示在拥有它的那个窗口的前面;
        (2)当所有者窗口最小化的时候,它所拥有的窗口都会被隐藏;
        (3)当所有者窗口被销毁的时候,它所拥有的窗口都会被销毁。
        需要注意的是,隐藏所有者窗口并不会影响它所拥有的窗口的可见状态。比如:如果窗口 A 拥有窗口B,窗口B拥有窗口C,则当窗口A最小化的时候,窗口B被隐藏,但是窗口 C还是可见。

        如果一个窗口的parent域非NULL,则它和该窗口之间就建立了parent-child关系。父子决定了:
        (1)窗口在屏幕上面的显示位置。父窗口提供了用来定位子窗口的坐标系统,一个子窗口只能显示在它的父窗口的客户区中,之外的部分将被裁减。这个裁减法则决定了如果父窗口不可见,则子窗口肯定不可见。如果父窗口移动到了屏幕之外,子窗口也一样。
        (2)当父窗口被隐藏时,它的所有子窗口也被隐藏。
        (3)父窗口被销毁的时候,它所拥有的子窗口都会被销毁。
         注意!最小化父窗口不会影响子窗口的可见状态,子窗口会随着父窗口被最小化,但是它的WS_VISIBLE属性不会变。

     

        另外,parent-child关系是双向的,一个窗口知道自己的parent和child;owner-owned关系是单向的,窗口只知道自己的owner。
        下面我们总结一下窗口类型与parent、owner窗口之间的关系特点。
        1、子窗口一定有parent,且parent即相当于owner,子窗口的父窗口可以为top-level窗口或者其他子窗口;
        2、只有overlapped窗口和popup窗口可以是owner窗口,子窗口不能是owner窗口;
        3、overlapped窗口和popup窗口的parent一般都是desktop窗口,由于overlapped窗口多用于作为应用程序的主窗口,其owner一般为desktop窗口;而popup窗口的owner是在CreateWindow函数中通过设置hWndParent参数给定的,如果hWndParent为非子窗口,则这个窗口即为popup窗口的owner;如果hWndParent为子窗口,系统从hWndParent的父窗口向上找,直到找到第一个非子窗口,把它作为该popup窗口的owner;
        
        Windows的API函数GetParent可以获取窗口的parent或owner,如果是子窗口则返回parent;如果overlapped窗口返回NULL;如果是popup窗口返回其owner。用API函数GetWindow(GW_OWNER)可以获取窗口的owner,或者用MFC CWnd类的成员函数GetOwner也可以。

     

        三、窗口WS_CLIPSIBLING和WS_CLIPCHILDREN风格
        首先简单的解释一下这两个风格的意义。
        WS_CLIPSIBLING 风格用于同一级的子窗口之间,表示当某设置了该风格的子窗口需要重绘时,被其他窗口遮挡的部分(按照Z-order)将被裁减,也就是被遮挡区域不进行重绘。
        WS_CLIPCHILDREN 风格则用于父窗口和子窗口之间,表示当某设置了该风格的父窗口需要重绘时,被子窗口遮挡的部分将被裁剪,即被遮挡的区域不进行重绘。
       
        在Windows系统的窗口中,凡是overlapped窗口和popup窗口都肯定具有WS_CLIPSIBLING风格,即使你写代码将这个风格去掉,Windows还是会自动加上。
        为什么呢?仔细想想就清楚了,我们可以认为overlapped窗口和popup窗口都是desktop窗口的同一级“子窗口”,他们之间要想在互相重叠的时候正确显示,就必须具有这个风格。为什么同一级子窗口重叠时都要有WS_CLIPSIBLING风格呢?比如现在有一个父窗口P,它有两个重叠的子窗口A和B,A的Z-order在B之前,那么正常显示的话A应该把B中重合的区域遮挡住。Windows在判断一个窗口区域是否需要重绘的时候,一般是看这个区域是否被其他窗口遮挡。因为此时系统认为A始终在B的上面,并未被遮挡,所以当你移动A窗口的时候,A的窗口内部区域是不会被通知重绘的。此时B被遮挡的部分肯定会被通知重绘,于是你会发现B重绘的时候却把与A重合的区域画乱了。但是如果我们把A和B都指定了WS_CLIPSIBLING风格以后,B被遮挡的部分的重绘就被裁剪掉了,这样它就不会捣乱了。
        当然,对于我们平时在对话框上用的最多的控件子窗口,虽然它们都没有WS_CLIPSIBLING风格,但是由于它们基本不重叠,因此不会彼此影响。
        如果你只为一部分子窗口设置了WS_CLIPSIBLING风格,就要保证其他窗口的所有重绘都发生在设置风格的子窗口之前,否则也会出现问题。对于对话框的控件来说,可以通过控制Tab-order来控制绘制顺序;对于其他子窗口,可以通过控制Z-order控制。

        对于WS_CLIPCHILDREN风格也是相同的问题,如果你不想父窗口的重绘影响到子窗口的绘制,那么最好给父窗口加上WS_CLIPCHILDREN风格。

     

        关于窗口的一些概念就先写这些吧,如果你对这些概念比较模糊的话,相信读完这篇文章会有很多收获。对于其中某些描述,我尽量做到严谨,但是可能会有错误的地方,请大家指正。另外有很多概念微软根本没有明确的定义和解释,所以还需要大家多摸索,在实践中探索规律性的东西。

    展开全文
  • 这个结构体存储是一些关于窗口类信息结构, 成员如下: typedef struct tagWNDCLASSA { UINT style;//窗口类型 WNDPROC lpfnWndProc;//窗口处理函数(回调函数) int cbClsExtra;//窗口扩展(一般为0) int...

    一、窗口结构体WNCLASS

    这个结构体存储的是一些关于窗口类信息的结构,

    成员如下:

    typedef struct tagWNDCLASSA {
      UINT      style;//窗口类型
      WNDPROC   lpfnWndProc;//窗口处理函数(回调函数)
      int       cbClsExtra;//窗口扩展(一般为0)
      int       cbWndExtra;//窗口实例扩展(一般为0)
      HINSTANCE hInstance;//实例句柄
      HICON     hIcon;//窗口的最小化图标
      HCURSOR   hCursor;//窗口鼠标光标
      HBRUSH    hbrBackground;//窗口背景颜色
      LPCSTR    lpszMenuName;//窗口菜单
      LPCSTR    lpszClassName;//窗口类名
    } WNDCLASSA, *PWNDCLASSA, *NPWNDCLASSA, *LPWNDCLASSA;
    窗口类型可选值
    类风格 含义
    CS_VREDRAW 移动或者调整窗口的高度(垂直方向)时,重绘整个窗口
    CS_HREDRAW 移动或者调整窗口的宽度(水平方向)时,重绘整个窗口
    CS_DBLCLKS 当用户光标在窗口内双击时,允许发送双击消息给窗口过程
    CS_OWNDC 给予每个窗口实例分配一个唯一的 DC(注意,尽管这样是很方便,但它必须慎重使用,因为每个 DC 大约要占 800 个字节的内存)
    CS_CLASSDC 该窗口类的所有窗口实例都共享一个窗口类 DC
    CS_PARENTDC 1. 将子窗口的裁剪区域设置到父窗口的 DC 中去,这样子窗口便可以在父窗口上绘制自身。(注意,这是子窗口还是从系统缓存中获取 DC,而不是使用父窗口的 DC。)
    2. 指定该风格可以提高系统性能
    CS_NOCLOSE 禁止系统菜单的关闭选项
    CS_SAVEBITS 1. 以位图形式保存被该窗口遮挡的屏幕部分,这样当给窗口移动以后,系统便可以用该保存的位图恢复屏幕移动的相应部分,从而系统不用向被该窗口遮挡的窗口发送 WM_PAINT 消息
    2. 该特性对于菜单类型的窗口比较合适,因为它通常是简短的显示一下之后便消失
    3. 设置该特性将增加显示该窗口的时间,因为它通常要先分配保存位图的内存
    CS_BYTEALIGNCLIENT 在字节边界上(在 x 方向上)定位窗口的用户区域的位置
    CS_BYTEALIGNWINDOW 在字节边界上(在 x 方向上)定位窗口的位置
    CS_GLOBALCLASS 1. 当调用 CreateWindow 或 CreateWindowEx 函数来创建窗口时允许它的 hInstance 参数和注册窗口类时传递给 RegisterClass 的 hInstance 参数不同
    2. 如果不指定该风格,则这两个 hInstance 必须相同

    下面是我自己在程序中对窗口类信息结构体的填充,可以当做参考:

    	// WNDCCASS :窗口类,用来处理窗口的某一类信息
    	WNDCLASS wc;
    
    	wc.style = CS_HREDRAW | CS_VREDRAW;
    	// 回调函数
    	wc.lpfnWndProc = (WNDPROC)d3d::WndProc;
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	// 函数传进来的窗口的句柄
    	wc.hInstance = hInstance;
    	wc.hIcon = LoadIcon(0, IDI_APPLICATION);
    	wc.hCursor = LoadCursor(0, IDC_ARROW);
    	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    	wc.lpszMenuName = 0;
    	wc.lpszClassName = "DX9App";

    二、对相关窗口进行注册

    我们使用RegidsterClass函数对我们刚才填充的窗口结构进行注

    	// 将窗口的信息填充完成之后,使用该函数,对窗口进行注册
    	if (!RegisterClass(&wc))
    	{
    		::MessageBox(0, "RegisterClass() - FAILED", 0, 0);
    		return false;
    	}

    三、注册完成之后,我们就要开始利用现有的属性进行窗口的创建,使用函数:CreateWindow

    函数原型:

    HWND CreateWindow(
    LPCTSTR lpClassName,//窗口类的名称
    LPCTSTR lpWindowName,//窗口的标题 
    DWORD dwStyle,//窗口风格
    int x,//初始x坐标
    int y,//初始y坐标
    int nWidth,//初始x方向的尺寸
    int nHeight,//初始y方向的尺寸
    HWND hWndParent,//父窗口句柄
    HMENU hMenu,//窗口菜单句柄
    HANDLE hlnstance,//程序实例句柄
    LPVOID lpParam//创建参数
    )

    参数

    含义

    lpClassName

    1. 窗口类名称,可以是一个指向 NULL 结束的字符串或一个整型数值
    2. 如果是字符串,它指定了窗口的类名。这个类名可以是任何用函数 RegisterClass 注册的类名,或是任何预定义的控制类名
    3. 如是一个整型量,它是由此前调用 theGlobalAddAtom 函数产生的全局量。这个小于 0xC000 的 16 位数必须是 lpClassName 参数字的低 16 位,该参数的高位必须是 0

    lpWindowName

    1. 窗口标题,一个指向 NULL 结束的字符串指针
    2. 如果窗口风格指定了标题条,由 lpWindowName 指向的窗口标题将显示在标题条上
    3. 当使用 Createwindow 函数来创建控制例如按钮,选择框和静态控制时,可使用 lpWindowName 来指定控制文本

    dwStyle

    指定创建窗口的风格(可选值见下一个表格)

    x

    1. 指定窗口的初始水平位置(x 坐标)
    2. 对一个层叠或弹出式窗口,x 参数是屏幕坐标系的窗口的左上角的初始 x 坐标
    3. 对于子窗口,x 是子窗口左上角相对父窗口客户区左上角的初始 x 坐标
    4. 如果该参数被设为 CW_USEDEFAULT 则系统为窗口选择缺省的左上角坐标并忽略 y 参数,CW_USEDEFAULT 只对层叠窗口有效,如果为弹出式窗口或子窗口设定,则 x 和 y 参数被设为零。

    y

    1. 指定窗口的初始垂直位置(y 坐标)
    2. 对一个层叠或弹出式窗口,y 参数是屏幕坐标系的窗口的左上角的初始 y 坐标
    3. 对于子窗口,y 是子窗口左上角相对父窗口客户区左上角的初始 y 坐标
    4. 对于列表框,y 是列表框客户区左上角相对父窗口客户区左上角的初始 y 坐标
    5. 如果层叠窗口是使用 WS_VISIBLE 风格位创建的并且 x 参数被设为 CW_USEDEFAULT,则系统将忽略 y 参数

    nWidth

    1. 以设备单元指明窗口的宽度
    2. 对于层叠窗口,nWidth 的值或是屏幕坐标的窗口宽度或是 CW_USEDEFAULT
    3. 若 nWidth 是 CW_USEDEFAULT,则系统为窗口选择一个默认的高度和宽度(默认宽度为从初始 x 坐标开始到屏幕的右边界,缺省高度为从初始 y 坐标开始到目标区域的顶部。),CW_USEDEFAULT 只对层叠窗口有效,如果为弹出式窗口和子窗口设定 CW_USEDEFAULT 标志则 nWidth 和 nHeight 被设为零

    nHeight

    1. 以设备单元指明窗口的高度
    2. 对于层叠窗口,nHeight 是屏幕坐标的窗口宽度
    3. 若 nWidth 被设为 CW_USEDEFAULT,则系统忽略 nHeight 参数,自动为 nWidth 和 nHeight 设置默认参数

    hWndParent

    1. 指向被创建窗口的父窗口或所有者窗口的句柄
    2. 若要创建一个子窗口或一个从属窗口,需提供一个有效的窗口句柄
    3. 创建一个单纯的消息窗口,可以提供 HWND_MESSAGE 或提供一个己存在的消息窗口的句柄

    hMenu

    1. 指向窗口菜单句柄,或依据窗口风格指明一个子窗口标识
    2. 对于层叠或弹出式窗口,hMenu 指定窗口使用的菜单:如果使用了菜单类,则 hMenu 可以为 NULL
    3. 对于子窗口,hMenu 指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类。应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的

    hInstance

    与窗口相关联的模块实例的句柄

    lpParam

    1. 指向一个值的指针,该值传递给窗口 WM_CREATE 消息。该值通过在 IParam 参数中的 CREATESTRUCT 结构传递
    2. 如果应用程序调用 CreateWindow 创建一个 MDI 客户窗口,则 lpParam 必须指向一个 CLIENTCREATESTRUCT 结构

    dwStyle可选值:

    窗口风格

    含义

    WS_BORDER

    创建一个带边框的窗口

    WS_CAPTION

    创建一个有标题框的窗口(包含了 WS_BODER 风格)

    WS_CHILD

    创建一个子窗口,这个风格的窗口不能拥有菜单也不能与 WS_POPUP 风格合用

    WS_CHILDWINDOW

    与 WS_CHILD 相同

    WS_CLIPCHILDREN

    当在父窗口内绘图时,排除子窗口区域,在创建父窗口时使用这个风格

    WS_CLIPSIBLINGS

    1. 排除子窗口之间的相对区域,也就是,当一个特定的窗口接收到 WM_PAINT 消息时,WS_CLIPSIBLINGS 风格将所有层叠窗口排除在绘图之外,只重绘指定的子窗口
    2. 如果未指定该风格,并且子窗口是层叠的,则在重绘子窗口的客户区时,就会重绘邻近的子窗口

    WS_DISABLED

    1. 创建一个初始状态为禁止的子窗口,一个禁止状态的窗口不能接受来自用户的输入信息
    2. 在窗口创建之后,可以调用 EnableWindow 函数来启用该窗口

    WS_DLGFRAME

    创建一个带对话框边框风格的窗口,这种风格的窗口不能带标题条

    WS_GROUP

    1. 指定一组“控制窗口”的第一个“控制窗口”
    2. 这个“控制窗口”组由第一个“控制窗口”和随后定义的“控制窗口”组成,自第二个“控制窗口”开始每个“控制窗口”具有 WS_GROUP 风格
    3. 每个组的第一个“控制窗口”带有 WS_TABSTOP 风格,从而使用户可以在组间移动
    4. 用户随后可以使用光标在组内的控制间改变键盘焦点

    WS_HSCROLL

    创建一个有水平滚动条的窗口

    WS_ICONIC

    创建一个初始状态为最小化状态的窗口,与 WS_MINIMIZE 风格相同

    WS_MAXIMIZE

    创建一个初始状态为最大化状态的窗口

    WS_MAXIMIZEBOX

    创建一个具有最大化按钮的窗口,该风格不能与 WS_EX_CONTEXTHELP 风格同时出现,同时必须指定 WS_SYSMENU 风格

    WS_MINIMIZE

    创建一个初始状态为最小化状态的窗口,与 WS_ICONIC 风格相同

    WS_MINIMIZEBOX

    创建一个具有最小化按钮的窗口,该风格不能与 WS_EX_CONTEXTHELP 风格同时出现,同时必须指定 WS_SYSMENU 风格

    WS_OVERLAPPED

    产生一个层叠的窗口,一个层叠的窗口有一个标题条和一个边框,与 WS_TILED 风格相同

    WS_OVERLAPPEDWINDOW

    相当于(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX),与 WS_TILEDWINDOW 风格相同

    WS_POPUP

    创建一个弹出式窗口,该风格不能与 WS_CHILD 风格同时使用。

    WS_POPUPWINDOW

    相当于(WS_POPUP | WS_BORDER | WS_SYSMENU),但 WS_CAPTION 和 WS_POPUPWINDOW 必须同时设定才能使窗口某单可见

    WS_SIZEBOX

    创建一个可调边框的窗口,与 WS_THICKFRAME 风格相同

    WS_SYSMENU

    创建一个在标题条上带有窗口菜单的窗口,必须同时设定 WS_CAPTION 风格

    WS_TABSTOP

    1. 创建一个“控制窗口”,在用户按下 Tab 键时可以获得键盘焦点。
    2. 按下 Tab 键后使键盘焦点转移到下一具有 WS_TABSTOP 风格的“控制窗口”

    WS_THICKFRAME

    创建一个具有可调边框的窗口,与 WS_SIZEBOX 风格相同

    WS_TILED

    产生一个层叠的窗口,一个层叠的窗口有一个标题和一个边框,与 WS_OVERLAPPED 风格相同

    WS_TILEDWINDOW

    相当于(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX),与 WS_OVERLAPPEDWINDOW 风格相同

    WS_VISIBLE

    创建一个初始状态为可见的窗口

    WS_VSCROLL

    创建一个有垂直滚动条的窗口

    该函数成功则返回新的窗口句柄,失败,则返回空。

    实例:

    hwnd = ::CreateWindow("DX9App", "DX9App",
    		WS_EX_TOPMOST,
    		0, 0, width, height,
    		0 /*parent hwnd*/, 0 /* menu */, hInstance, 0 /*extra*/);
    
    // 判断一下这个创建是不是成功
    	if (!hwnd)
    	{
    		::MessageBox(0, "CreateWindow() - FAILED", 0, 0);
    		return false;
    	}

    四、创建完成之后,就开始展示窗口,使用函数:ShowWindow

    函数声明如下:

    BOOL ShowWindow(HWND hWnd, int nCmdShow);

    第一个参数是窗口的句柄,第二个参数是窗口展示的类型,可选值如下:

    含义
    SW_FORCEMINIMIZE 强制窗口最小化,主要使用在非窗口主线程的其它线程来操作
    SW_HIDE 显示窗口为隐藏状态
    SW_MAXIMIZE 显示窗口为最大化
    SW_MINIMIZE 显示窗口为最小化
    SW_RESTORE 从任务里恢复窗口显示
    SW_SHOW 激活窗口为当前窗口,并且显示为当前的大小和位置
    SW_SHOWDEFAULT 创建进程时显示窗口的值
    SW_SHOWMAXIMIZED 激活窗口为当前窗口,并且显示最大化
    SW_SHOWMINIMIZED 激活窗口为当前窗口,并且显示最小化
    SW_SHOWMINNOACTIVE 显示窗口为最小化,但不激活它作为当前窗口v
    SW_SHOWNA 显示为当前的大小和位置,但不激活它作为当前窗口显示为当前的大小和位置,但不激活它作为当前窗口
    SW_SHOWNOACTIVATE 显示当前窗口,但不激活它作为当前窗口
    SW_SHOWNORMAL 显示当前窗口,但窗口是最小化或最大化时会恢复窗口为原来的大小和位

    五、UpdateWindow函数,更新窗口

    函数原型:

    BOOL UpdateWindow(HWND hWnd // 窗口的句柄);

    一般在创建窗口之后,调用ShowWindow,然后就会使用该函数进行窗口的更新。

    PS:但是在我自己的程序中使用与否感觉差别不大,估计是没有搞清楚这个函数的实现机制到底是什么~

    六、MSG结构体

    typedef struct tagMSG{
        HWND hwnd;  //窗口句柄
        UINT message;  //消息类型
        WPARAM wParam;  //附加消息1
        LPARAM lParam;  //附加消息2
        DWORD time;  //消息被传递时候的时间
        POINT  pt;  //消息被传递时光标在屏幕上的位置
    } MSG;

    1) 最后两个字段 time 和 pt 一般由系统使用,我们很少用到。

    2) message 为消息类型,也就是以 WM 开头的消息(WM 是 Window Message 的缩写 ),例如 WM_CREATE、WM_PAINT、WM_DESTROY、WM_COMMAND 等。

    3)至于wParam和lParam,MSDN上给的解释,两个参数是完全一样的

    查了一些资料,我的理解是如果是自己定义的message的类型,那么怎么填写wParam和lParam就怎么取message,如果使用的是系统message类型,那么每一个系统的message类型都会有自己对应的wParam和lParam,此时找出来,填充即可,不过我感觉大多数系统的message类型的已经够用。

    七、PeekMessage、TranslateMessage、DispatchMessage

    BOOL PeekMessage(      
    
        LPMSG lpMsg,//
    
        HWND hWnd,//
    
        UINT wMsgFilterMin,//
    
        UINT wMsgFilterMax,//
    
        UINT wRemoveMsg//
    
    );

    参数说明:

    lpMsg:指向一个MSG结构的指针,该结构中保存着从线程消息队列中取得的消息信息。

    hWnd:被测试消息的相关窗口句柄。该窗口必须属于正在调用的线程。

    如果hWnd值为NULL:PeekMessage检索任何属于调用线程窗口的消息。如果hWnd的值为INVALID_HANDLE_VALUE,PeekMessage会检索那些hWnd值为NULL的消息,并作为由PostThreadMessage投递的消息来对待。

    wMsgFilterMin:指定被检索的最小消息值的整数。使用WM_KEYFIRST指定第一个键盘消息或WM_MOUSEFIRST指定第一个鼠标消息。

    wMsgFilterMax:指定被检索的最大消息值的整数。使用WM_KEYLAST指定最后的键盘消息或WM_MOUSEFIRST指定最后的鼠标消息。

    wRemoveMsg:指定消息的处理方式。该参数的值可以为下列的值之一。

    含义
    PM_NOREMOVE 消息经PeekMessage处理后并不从消息队列中移除。
    PM_REMOVE 消息经PeekMessage处理后从消息队列中移除
    PM_QS_INPUT Windows 98/Me,Windows 2000/XP: 处理鼠标和键盘消息。
    PM_QS_PAINT Windows 98/Me,Windows 2000/XP:处理绘图消息。
    PM_QS_POSTMESSAGE Windows 98/Me,Windows 2000/XP:处理所有投递消息,包括定时器和热键消息
    PM_QS_SENDMESSAGE Windows 98/Me,Windows 2000/XP: 处理所有发送消息。

    返回值:

    如果有可用的消息,则返回值为非0;

    如果没有可用的消息,则返回值为0;

    BOOL TranslateMessage( CONST MSG*lpMsg );

    参数:lpMsg是检查需要转换的消息。

    返回值:

    如果消息被转换(即,字符消息被送到线程的消息队列中),返回非零值。

    如果消息是 WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, 或 WM_SYSKEYUP,返回非零值,不考虑转换。

    如果消息没有转换(即,字符消息没被送到线程的消息队列中),返回值是零。

    TranslateMessage是用来把虚拟键消息转换为字符消息。

    由于Windows对所有键盘编码都是采用虚拟键的定义,这样当按键按下时,并不得字符消息,需要键盘映射转换为字符的消息。

    LONG DispatchMessage(CONST MSG*lpmsg);

    参数:lpmsg:指向含有消息的MSG结构的指针。

    返回值:返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略。

    总结:TranslateMessage函数将键盘消息转化,DispatchMessage函数将消息传给窗体函数去处理.

    处理代码像下面这样子:

    		if (::PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
    		{
    			::TranslateMessage(&msg);
    			::DispatchMessage(&msg);
    		}

    八、PostQuitMessage

    当你点击窗口右上角的关闭时,Windows就会把窗口从系统里删除,这时就会发出消息WM_DESTROY给窗口消息处理函数WindowProc,WindowProc收到这条消息后,最需要做的一件事情就是调用PostQuitMessage发出退出消息,让消息循环结束。

    函数PostQuitMessage声明如下:

    VOID PostQuitMessage( int nExitCode); 

    nExitCode是退出标识码,它被放到WM_QUIT消息的参数wParam里。

    九、DestroyWindow

    调用DestroyWindow函数后,操作系统就会进行一系列的删除动作,先发送WM_DESTROY消息,接着发送WM_NCDESTROY消息。如果这个窗口还有子窗口或者是其它窗口的所有者,就需要给所有子窗口发送删除消息。

    函数DestroyWindow声明如下:

    BOOL DestroyWindow( HWND hWnd);

    hWnd是要删除的窗口句柄。

    十、DefWindowProc

    在Windows操作系统里,当窗口显示之后,它就可以接收到系统源源不断地发过来的消息,然后窗口就需要处理这些消息,因此就需要一个函数来处理这些消息。在API里定义了一个函数为回调函数,当系统需要向窗口发送消息时,就会调用窗口给出的回调函数WindowProc,如果WindowProc函数不处理这个消息,就可以把它转向DefWindowProc函数来处理,这是系统的默认消息处理函数。当你按下菜单,或者点击窗口时,窗口需要运行这个消息处理函数。

    函数DefWindowProc声明如下:

    LRESULT DefWindowProc(         

        HWND hWnd,

        UINT Msg,

        WPARAM wParam,

        LPARAM lParam

    );

    hwnd是当前窗口的句柄。

    uMsg是系统发过来的消息。

    wParam是消息参数。

    lParam是消息参数。

     

    以上就是创建窗口涉及到的一些函数和概念,以后有在接触到,还会在这里补充~

    展开全文
  • 从属窗口在z次序中总是在它的属主窗口的上面。 windows系统在销毁属主窗口时自动地销毁从属窗口。 从属窗门在其属主窗口最小化时是被隐藏 只有覆盖或弹出窗口可以是一个属主窗口,子窗口则不能。 应用程序创建一...

    从属窗口在z次序中总是在它的属主窗口的上面。

    windows系统在销毁属主窗口时自动地销毁从属窗口。

    从属窗门在其属主窗口最小化时是被隐藏

    只有覆盖或弹出窗口可以是一个属主窗口,子窗口则不能。

    应用程序创建一个从属窗口是通过在创建具有WS_OVERLAPPEDWS_POPUP风格的窗口时,把函数CreateWindowEx的参数hwndParent设置成属主窗门的句柄;参数hwndParent必须标识一个覆盖或弹出窗口。如果hwndParent标识的是一个子窗口,windows系统就会把所属关系赋给这个子窗口的顶层父窗口。创建了从属窗口之后,应用程序就不能再把窗口的

    所属关系传给别的窗口。

    对话框和消息框一般是从属窗口,因此应用程序在调用一个函数创建对话框或消息时要指定的属主窗口

    程序可以通过设置GW_OWNER标志来调用GetWindow函数来检索属主窗口的句柄。

    被禁止的窗口

    窗口是可以被禁止的,被禁止的窗口不再接收键盘或鼠标输入,们它能接收来自其它窗口,或是来自其它应用程序以及windows系统的消息。应用程序禁止一个窗口是防止用户使用这个窗口,例如,应用程序可能会禁止对话框中的一个按钮防止用户对它的选择。应用程序可在任何时候再允许一个被禁止的窗口,允许一个窗口也就恢复了正常的输入。缺省情况下,一个窗口在刚被创建时是被允许的,但程序能够通过设置WS_DISABLED风格来禁止一个新窗口。应用程序通过函数EnableWindow允许或禁止一个存在的窗口,windows系统在窗口的允许状态将要改变时向它发送一条WM_ENABLE消息.应用程序使用函数IsWindowEnabled以确定—个窗口是否被允许。如果一个于窗口被禁止,windows系统就会把这个子窗口的鼠标输入传给其父窗口,父窗口通过这条消息确定是否需要允许这个子窗口。

    在同一时间只有一个窗口能够接收键盘输入,也就是说这个窗口拥有键盘焦点。如果应用程序用函数EnableWindow来禁止一个拥有焦点的窗口.这个窗口在被禁止的同时也失去了键盘焦点,EnableWindow把键盘焦点设置成NULL,意思是说没有窗口具有焦点。如果一个子窗口或其它的子孙窗口有了键盘焦点、子孙窗口也会在父窗口被禁止时失去键盘焦点。

    前台窗口和后台窗口

    每一个进程可运行多个线程,每个线程部能创建窗口。创建正在使用窗口的线程称之为前台线程,这个窗口就称之为前台窗口。所有其它的线程都是后台线程.由后台线程所创建的窗门叫后台窗口.

    每一个线程都有一个优先等级,它决定了该线程占有cpu的时间。尽管应用程序能够设留它的线程的优先等级,但通常前台线程具有比后台线程稍高的优先等级.正因为如此,前台线程所占cpu时间比后台线程要长。通常,前台线程具有的优先级是9,而后台线程是7。

    用户是通过单击一个窗口、使用alt+tab或alt+esc组合键来设置前台窗口,应用程序则用函数SetForegroundWindow设置前台窗口如果新的前台窗口是一个顶层窗口,那么windows系统就激活它,换句话说,windows系统激活相应的顶层窗口。应

    用程序通过函数GetForegroundWindow来检取前台窗口的句柄。

    显示状态

    在任何时候,窗口可以是活动的或是被禁止的;隐藏的或是可见的;最小化、最大化或是被恢复,这些统称为窗口的显示状态。

    活动窗口

    活动窗口是应用程序的顶层窗口,也就是当前使用的窗口,为了使用户能很容易地识别活动窗口,windows系统把它放在z次序的顶部,并把标题栏和边框的颜色设置成系统定义的活动窗口的颜色。只有个顶层窗口可以是活动窗口.如果用户使用的是一个子窗口,windows系统就激活与这个子窗口相应的顶层窗口。

    任何时候系统中只能有一个项层窗口是活动的。用户是通过单击窗口(或其中的一个子窗口)、使用alt+esc或alt+tab组合键来激活一个顶层窗口,应用程序则调用函数SetActiveWindow来激活一个顶层窗口,还有另外一些函数windows系统用来激活不同的顶层窗口包括:SetWindowPos, DeferWindowPos, SetWindowPlacement,DestroyWindow.。尽管一个应用程序也能在任何时候激活一个不同的顶层窗口,但为避免困惑用户,应该只根据用户的要求做出响应。应用程序通过函数GetActiveWindow来检取活动窗口的句柄。

    如果活动状态从—个应用程序的某个顶层窗口改变到另一个应用程序的顶层窗口,windows系统就要向两个应用程序发送wM AcrIvATEAl)P消息来通知它们。如果是在同一个应用程序的不同顶层窗门之间改变活动特性,windows系统就向两个窗口发送WM_ACTIVATE消息。

    可见性

    窗口既可以是可见的,也可以被隐藏。windows系统只在屏幕上显示一个可见的窗口,对隐藏的窗口只是不画它罢了。如果一个窗口是可见的,用户可通过窗口进行输入以及查看窗口的输出。如果窗口是被隐藏着的,则相当于被有效地禁止了。隐藏的窗口可处理来自windows系统或其它窗口的消息,但它不能处理用户的输入或是显示输出。应用程序在创建某项口时就设置了它的可见状态,后面应用程序还可以改变其可见状态。

    如果为窗口设置了WS_VISIBLE风格,则窗口是可见的。通常,除非应用程序设置了WS_VISIBLE风格.否则函数CreateWindowEx只是创建了一个隐藏的窗口。应用程序一般是在创建了一个窗口之后设置WS_VISIBLE风格,主要是不让用户看到创建过程的细节。例如,应用程序在定制窗口的外观时,新窗口是被隐藏的。如果在函数CreateWindowEx中指定了WS_VISIBLE风格,windows系统就会在创建了窗口之后,在显示该窗口之前向它发送WM_SHOWWINDOW消息.

    应用程序可通过函数IsWindowVisible确认一个窗口是否可见,应用程序通过函数ShowWindow, SetWindowPos, DeferWindowPos, or SetWindowPlacement显示(使可见)或隐藏一个窗口,这些函数是通过设置或删除窗口的WS_VISIBLE风格来显示或隐藏窗口的,它们也在显示或隐藏窗口之前向其发送WM_SHOWWINDOW消息。

    如果一个属主窗口被最小化了,windows系统会自动隐藏相应的从属窗口。同样,在一个属主窗口被恢复时,windows系统也会自动地显示相应的从属窗口。这两种情况下.windows系统都要在隐藏或显示拥有窗口之前,向其发送WM_SHOWWINDOW消息。偶尔,应用程序也有可能在不最小化或隐藏属主窗口情况下需要隐藏从属窗口.那么应用程序就使用函数ShowOwnedPopups,这个函数设置或删除所有从属窗口的WS_VISIBLE风格,并在隐藏或显示拥有窗口之前向它们发送WM_SHOWWINDOW消息.隐藏一个属主窗口并不影响其拥有窗口的显示状态。

    如果一个父窗口是可见的,则与之相应的子窗口也是可见的。同样,在父窗口被隐藏时,子窗口也被隐藏。最小化父窗口也不影响子窗口的可见状态.这就是说,子窗口也随着父窗口被最小化,但其WS_VISIBLE风格依然没有改变.

    尽管某一个窗口具有WS_VISIBLE风格,用户也有可能在屏幕上看不到这个窗口,因为其它的窗口可能会完全盖住了它,或是由于移动而超出了屏幕的边沿。一个可见的子窗口也是遵循由父子关系所建立的裁剪规则的.如果窗口的父窗口是不可见的,那么它也是不可见的。因为子窗口是相对于其父窗口的左上角,如果父窗口的移动超出了屏幕的边沿,子窗口也有可能这样。例如,尽管子窗口及其父窗口都具有WS_VISIBLE风格,但如果用户把父窗口移动到远远超出了屏幕的边沿,用户就不能看到子窗口。

    最小最大化和恢复窗口

    最大化窗口是具有WS_MAXIMIZE风格的窗口,通常,windows系统会把最大化窗口放大到填满整个屏幕,如果是子窗口,则可填满父窗口的客户区。尽管窗口的尺寸可被设置成与最大化窗口一样大,但最大化窗口还是稍有不同的,windows系统会自动地把窗口的标题栏移到屏幕或父窗口客户区的顶部,wmdows系统还要禁止窗口的改变大小边框和标题栏的窗口定位能力(这样,用户就不能通过拖动标题栏来移动窗口)。

    最小化窗口是具有WS_MINIMIZE风格的窗口,通常,windows系统把窗口的尺寸减少到一个图符的尺寸,并把它移到屏幕或父窗口客户区的底部,屏幕或父窗口客户区的底部有时叫做图符区。如果应用程序不设定位置.windows系统则把最小化窗口移到图符区中第一个可用的位置。恢复窗口是恢复到原来的最小或最大尺寸相位置的窗口。

    如果应用程序在函数CreateWindowEx中指定WS_MAXIMIZE or WS_MINIMIZE风格,那么窗口一开始就是最大化的或是最小化的。在创建了窗口之后,应用程序可通过函数CloseWindow最小化这个窗口,函数ArrangeIconicWindows用来把最小化的顶层窗口排列在屏幕的底部,或是把父窗口的最小化的子窗口排列在父窗口客户区的底部。

    函数ShowWindow可以最小化、最大化或恢复一个窗口.同时还能设定窗口的可见性和激活状态,函数SetWindowPlacementShowWindow有相同的功能,但它还能屏蔽窗口默认的最小、最大和被恢复的位置。

    函数IsZoomed用来确定一个窗口是否是最大,函数IsIconic确定—个窗口是否是最小化的。函数GetWindowPlacement检取窗门的最小、最大和被恢复的位置,也能用来确定窗口的显示状态。

    如果windows系统接收到一条最大或恢复最小窗 口的命令,windows系统就向这个窗口发送一条WM_QUERYOPEN消息,如果窗口过程返回FALSE,windows系统就会忽略这条最大化或恢复命令。

    windows系统自动把最大窗口的尺寸和位置设置成系统定义的最大窗口的默认值,应用程序能够通过函数SetWindowPlacement,或是处理windows系统在将要最大化窗口时窗口接收到的WM_GETMINMAXINFO消息来屏蔽默认值.这条消息含有MINMAXINFO结构的指针.结构中含有windows系统用来设置最大尺少和位置的值,重置这些值也就改变了默认设置。

    尺寸和位置

    窗口的尺寸和位置是由一个限定矩形来表示的,它给出了相对于屏幕或父窗口的坐标。这个坐标是顶层窗口相对于屏幕左上角,或是子窗口相对于父窗口的左上角的坐标.应用程序在创建窗口时指定窗口的初始尺寸和位置,也可随时改变窗口的尺寸和位置。

    窗口的尺寸(宽和高)是以象素为单位的,一个窗口的高度和宽度都可以为o,如果程序把某个窗口的高度和宽度都置成0,windows系统就把尺寸置成默认的最小窗口尺寸。应用程序是通过带有SM_CXMINSM_CYMIN标志的函数GetSystemMetrics来获取最小窗口的默认尺寸的。

    应用程序可能要创建具有一定尺寸的客户区的窗口,函数AdjustWindowRectAdjustWindowRectEx可根据所设计的客户区尺寸来计算所需窗口的尺寸,应用程序再把计算结果传给函数CreateWindowEx

    应用程序可把窗口的尺寸改变得很大,但最好不要超过屏幕的大小。在设置窗口的尺寸之前,应用程序应该用带有SM_CXSCREEN and SM_CYSCREEN标志的函数GetSystemMetrics来检查屏幕的宽度和高度。

    窗口的位置是由它左上角的坐标决定的,这些坐标有时叫做窗口坐标,总是相对于屏幕的左上角,对于子窗口来说,则是相对于其父窗口客户区的左上角。例如,某个顶层窗口的坐标是(10,10),那么它就被定位在屏幕左上角向右10个象素,向下10个象素的位置。如果—个子窗口的坐标是(10,10).那么它就被定位在其父窗口客户区定上角向右10个象素.向下10个象素的位置。

    函数WindowFromPoint用来检取占取屏幕上某一点的窗口的句柄,函数ChildWindowFromPointChildWindowFromPointEx则用来检取占取父窗口客户区中某一点的子窗口的句柄。

    默认的尺寸和位置

    应用程序可让windows系统计算一个顶层窗口的初始尺寸相位置,这是通过在函数CreateWindowEx.中指定CW_USEDEFAULT常量。如果应用程序把窗口的坐标置成CW_USEDEFAULT,而且应用程序还没有创建别的顶层窗口,windows系统就把新窗口的位置设置在相对于屏幕左上角的位置上,否则windows系统就把窗口的位置设置在相对于应用程序最近创建的顶层窗口的位置。同样,如果宽度和高度都设置成CW_USEDEFAULT.windows系统就会计算新窗口的尺寸,如果应用程序已创建了其它的顶层窗口,windows系统就根据应用程序最近创建的顶层窗口的尺寸来计算新窗口的尺寸。如果在创建子窗口或弹出窗口时设置CW_USEDEFAULT风格,那么windows系统就把窗口的尺寸设置成默认的最小窗口的尺寸.

    跟踪尺寸

    windows系统管理具有WS_THICKFRAME风格的窗口的最小和最大跟踪尺寸,具有这种风格的窗口有一个改变大小边框。最小跟踪尺寸是用户通过拖动窗口大小边框所能达到的最小窗口尺寸。同样,最大跟踪尺寸是用户通过拖动窗口大小边框所能达到的最大窗口尺寸。

    窗门的最小和最大跟踪尺寸是在windows系统创建窗口时设置的系统定义的默认值。应用程序可通过处理WM_GETMINMAXINFO消息来获取或改变这些默认值。

    系统命令

    如果应用程序有一个带有系统菜单的窗口,就可以通过发送系统命令改变窗口的大小相位置,系统命令是在用户从系统菜单中选择命令时产生的,应用程序可通过向窗口发送WM_SYSCOMMAND消息来模拟用户的活动。下表列出的系统命令影响窗口的人小和位置:

    命令 描述

    SC_CLOSE关闭窗口,这条命令向窗口发送一条WM_CLOSE消息,窗口完成消除和销毁所要做的每步工作

    SC_MAXIMIZE最大化窗口

    SC_MINIMIZE最小化窗口

    SC_RESTORE恢复最小或最大窗口到原来的大小和位置

    SC_SIZE启动一个改变大小命令,用户可以使用鼠标或键盘改变一个窗口的大小。

    改变和位置大小的函数

    创建了窗口之后,应用程序可调用下列函数来设置窗口的大小和位置,这些函数是SetWindowPlacement, MoveWindow, SetWindowPos,and DeferWindowPosSetWindowPlacement设置窗口的最小化位置,最大化位置,恢复大小和位置和显示状态。MoveWindowSetWindowPos函数很相似,都用来设置单个应用程序窗口的大小和位置,函数SetWindowPos则含有一系列影响窗口显示状态的标志,函数MoveWindow则不包含这些标志。使用函数BeginDeferWindowPos, DeferWindowPos,EndDeferWindowPos一起起用来同时设置一些窗口的大小、位置、Z次序中的位置和显示状态。

    应用程序使用函数GetWindowRect检取窗口限定矩形的坐标.GetWindowRect用窗口的左上角和右下角填充RECT结构,这些坐标是相对于屏幕左上角的,对于窗口也一样。函数ScreenToClientMapWindowPoints把子窗口限定矩形的屏幕坐标映射成相对于父窗口客户区的坐标。

    函数GetClientRect用于检取窗口客户区的坐标,GetClientRect用客户区左上角和右下角坐标填充RECT结构,但这里的坐标是相对于客户区本身的。这就是说.客户区左上角的坐标总是(o,o),右下角的坐标是客户区的宽度和高度。

    函数CascadeWindows该函数层叠排列指定父窗口的各指定子窗口。TileWindows该函数并到显示指定父窗口的各指定子窗口。

    尺寸和位置消息

    windows系统要向将要改变大小和位置的窗口发送WM_GETMINMAXINFO消息,例如,用户从系统菜单上选中MoveSize命令或单击了大小边框或是标题栏,或者应用程序调用函数SetWindowPos移动或改变窗口大小时.发送WM_GETMINMAXINFO消息。WM_GETMINMAXINFO消息含有一个MINMAXINFO结构的指针,这个结构是窗口的默认的最大尺寸和位置,以及窗口的最小和最大跟踪尺寸。应用程序可以通过处理WM_GETMINMAXINFO消息并给MINMAXINFO结构的成员适当的设置来改变这些默认值。接收WM_GETMINMAXINFO消息的窗口必须具有WS_THICKFRAMEWS_CAPTION风格,具有WS_THICKFRAME风格的窗口在窗口创建过程中,或是在移动或改变大小时会接收到这条稍息。

    windows系统还会向一个将要改变大小、位置、在z中的次序及显示状态时的窗口发送一条WM_WINDOWPOSCHANGING消息,这条消息含有一个WINDOWPOS结构的指针,这个结构指定了窗口新的尺寸、位置、z次序中的位置及显示状态。设置WM_WINDOWPOSCHANGED消息的WINDOWPOS结构成员对窗口并没有影响,一个必须处理WM_SIZEWM_MOVE消息的窗口必须把WM_WINDOWPOSCHANGED消息传给函数DefWindowProc,否则windows系统不会向窗口发送WM_SIZEWM_MOVE消息。

    windows系统在某窗口创建或被改变大小的时候向该窗口发送WM_NCCALCSIZE消息,windows系统使用这条消息计算窗口客户区的大小以及相对于窗口的左上角的客户区的位置,窗口通常把这条消息传给默认的窗口过程,但是这条消息对要定制窗口客户区或在改变窗口大小时保留客户区的某一部分的应用程序来说是很有用的。

    窗口销毁

    通常,应用程序必须销毁所有由它创建的窗口,这是调用函数DestroyWindow来实现的。如果一个窗口被销毁,系统就会隐藏这个窗口,如果它是可见的,那么与该窗口相应的所有内部数据都被删除,这就使窗口句柄失效,应用程序也就不能再用它。

    有许多窗口会在应用程序创建它们不久就删除,例如,应用程序通常在从用户得到足够的输入后删除对话框,并继续执行下去。应用程序最终要删除应用程序的主窗口(在结束之前)。

    在销毁一个窗口之前,应用程序保留或删除所有与窗口相关的数据.还应该释放为窗口分配的所有系统资源,如果应用程序不释放这些资源,则由windows系统来释放这些资源。

    销毁一个窗口并不影响创建这个窗口的窗口类,新窗口还可用这个窗口类来创建,由这种窗口类创建的所有窗口还会继续运转下去。

    销毁一个窗口同时也销毁了窗口的子孙窗口,函数DestroyWindow首先把WM_DESTROY消息发给窗口.然后再传给它的子窗口和子孙窗门,这样窗口的子孙窗口随着窗口的销毁而销毁。

    带有系统菜单的窗口在用户从系统中选中CLOSE时会接收到一条WM_CLOSE消息.通过处理这条消息,应用程序可在销毁窗口之前提示用户确认.如果用户确认窗口可以被销毁,应用程序就可调用函数DestroyWindow来销毁这个窗口。

    如果将销毁的窗口是一个活动窗口,那么活动及焦点状态就会转到另一个窗口上,这个将要成为活动的窗口就是由alt+esc组合键确定的下一个窗口,这个新的活动窗口也就决定那一个窗口接收键盘焦点。

    使用窗口

    下一节讲解如何在应用程序中创建和使用窗口,如何管理父子窗口关系以及如何移动和改变一个窗口的大小。

    创建主窗口

    应用程序创建的第一个窗口通常是主窗口.创建主窗口是调用函数CreateWindowEx指定窗口类、窗口名、窗口风格、大小、位置、菜单句柄、实例句柄和创建数据。主窗口属于应用程序定义的窗口类,所以必须在创建主窗口之前,注册窗口类并提供窗口过程。

    绝大多数应用程序部使用WS_OVERLAPPEDWINDOW风格来创建主窗口.这种风格给窗口一个标题栏、系统菜单、改变大小边框、最小和最大框,函数CreateWindowEx返回一个唯一标识此窗口的句柄。下面的范例创建了一个屑于应用程序定义的窗口类的主窗口,窗口名"Main Window"显示在窗口标题栏中。通过把WS_VSCROLLWS_HSCROLLWS_OVERLAPPEDWINDOW风格组合使用,应用程序创建的主窗口除了具有由WS_OVERLAPPEDWINDOW风格所创建的窗口成员外,还有水平和垂直滚动条。出现了4次的CW_USEDEFAULT常量把窗口的初始尺寸和位置设置成系统定义的默认值,指定NULL而不是菜单句柄意思是说窗口有为该窗口类定义的菜单。

    HINSTANCE hinst;

    HWND hwndMain;

    // Create the main window.

    hwndMain = CreateWindowEx(

    0, // no extended styles

    "MainWClass", // class name

    "Main Window", // window name

    WS_OVERLAPPEDWINDOW | // overlapped window

    WS_HSCROLL | // horizontal scroll bar

    WS_VSCROLL, // vertical scroll bar

    CW_USEDEFAULT, // default horizontal position

    CW_USEDEFAULT, // default vertical position

    CW_USEDEFAULT, // default width

    CW_USEDEFAULT, // default height

    (HWND) NULL, // no parent or owner window

    (HMENU) NULL, // class menu used

    hinstance, // instance handle

    NULL); // no window creation data

    if (!hwndMain)

    return FALSE;

    // Show the window using the flag specified by the program

    // that started the application, and send the application

    // a WM_PAINT message.

    ShowWindow(hwndMain, SW_SHOWDEFAULT);

    UpdateWindow(hwndMain); HINSTANCE hinst;

    HWND hwndMain;

    // Create the main window.

    hwndMain = CreateWindowEx(

    0, // no extended styles

    "MainWClass", // class name

    "Main Window", // window name

    WS_OVERLAPPEDWINDOW | // overlapped window

    WS_HSCROLL | // horizontal scroll bar

    WS_VSCROLL, // vertical scroll bar

    CW_USEDEFAULT, // default horizontal position

    CW_USEDEFAULT, // default vertical position

    CW_USEDEFAULT, // default width

    CW_USEDEFAULT, // default height

    (HWND) NULL, // no parent or owner window

    (HMENU) NULL, // class menu used

    hinstance, // instance handle

    NULL); // no window creation data

    if (!hwndMain)

    return FALSE;

    // Show the window using the flag specified by the program

    // that started the application, and send the application

    // a WM_PAINT message.

    ShowWindow(hwndMain, SW_SHOWDEFAULT);

    UpdateWindow(hwndMain);

    注意前面的例子中,创建了主窗口之后调用函数ShowWindow,这是因为windows系统在创建了窗口之后并不会自动地显示它,给ShowWindow传给SW_SHOWDEFAULT标志.应用程序就可让启动应用程序的程序设置主窗口的初始显示状态,函数UpdateWindow向窗口发送了第一条WM_PAINT消息。

    创建,统计子窗口及改变子窗口的大小

    使用于窗口把窗口的客户区划分成不同的功能区域.创建一个子窗口也象创建一个主窗口一样调用函数CreateWindowEx。要创建一个应用程序定义的窗口类窗口,就必须在创建子窗口之前注册窗口类并提供窗口过程。必须给子窗口设置WS_CHILD风格并在创建子窗口时指定它的父窗口。

    下面的例子通过创建3个大小相同的子窗口把应用程序主窗口的客户区分成3个功能区,每个子窗口的高度与主窗口的客户区等高,而宽度是客户区宽度的三分之一。主窗口创建子窗口是对WM_CREATE消息做出响应,这条消息是主窗口在它自己的窗口创建进程中收到的。因为每个子窗口都有WS_BORDER风格,那么每个子窗口都有一个边框。又因为没有指定WS_VISIBLE风格,每个子窗口在开始都是隐藏的。还要注意每个子窗口都赋予了一个子窗口标识。

    主窗口改变子窗口的大小和位置以响应WM_SIZE消息,这条消息是主窗口在它的尺寸将要改变时接收到的。为响应WM_SIZE消息.主窗口调用函数GetWindowRect检取它的客户区的尺寸,又把这个尺寸传给函数EnumChildWindows, EnumChildWindows再把每—个子窗口的句柄传给应用程序定义的回调函数EnumChildProc,这个函数调用函数MoveWindow来改变每个子窗口的大小和位置;大小部位置取决于主窗口的客户区的尺寸及子窗口的标识。然后,EnumChildProc调用函数ShowWindow使得窗口可见。

    #define ID_FIRSTCHILD 100

    #define ID_SECONDCHILD 101

    #define ID_THIRDCHILD 102

    LONG APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam)

    HWND hwnd;

    UINT uMsg;

    UINT wParam;

    LONG lParam;

    {

    RECT rcClient;

    int i;

    switch(uMsg) {

    case WM_CREATE: // creating main window

    // Create three invisible child windows.

    for (i = 0; i < 3; i++)

    CreateWindowEx( 0, "ChildWClass", (LPCTSTR) NULL, WS_CHILD | WS_BORDER, 0,0,0,0,

    hwnd, (HMENU) (int) (ID_FIRSTCHILD + i), hinst, NULL);

    return 0;

    case WM_SIZE: // main window changed size

    // Get the dimensions of the main window's client

    // area, and enumerate the child windows. Pass the

    // dimensions to the child windows during enumeration.

    GetClientRect(hwnd, &rcClient);

    EnumChildWindows(hwnd, EnumChildProc, (LPARAM) &rcClient);

    return 0;

    // Process other messages.

    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);

    }

    BOOL CALLBACK EnumChildProc(hwndChild, lParam)

    HWND hwndChild;

    LPARAM lParam;

    {

    LPRECT rcParent;

    int i, idChild;

    // Retrieve the child-window identifier. Use it to set the

    // position of the child window.

    idChild = GetWindowLong(hwndChild, GWL_ID);

    if (idChild == ID_FIRSTCHILD)

    i = 0;

    else if (idChild == ID_SECONDCHILD)

    i = 1;

    else

    i = 2;

    // Size and position the child window.

    rcParent = (LPRECT) lParam;

    MoveWindow(hwndChild, (rcParent->right / 3) * i, 0, rcParent->right / 3, rcParent->bottom, TRUE);

    // Make sure the child window is visible.

    ShowWindow(hwndChild, SW_SHOW);

    return TRUE;

    }

    销毁窗口

    函数DestroyWindow用来销毁一个窗口。通常,在销毁一个窗口之前要发送一条WM_CLOSE消息,给窗口一个机会提示用户在窗口被销毁之前确认一下。含有系统菜单的窗口在用户选中菜单中的Close命令时会自动地接收到一条WM_CLOSE消息,如果用户确认这个窗口可以被销毁,应用程序就调用DestroyWindow,windows系统在窗口从屏幕上删除后发送一条WM_DESTROY消息。为响应WM_DESTROY消息,窗口保存数据并释放所有分配给它的资源。主窗口调用函数PostQuitMessage结束对WM_DESTROY消息的处理,退出这个应用程序。

    下面的范例说明了在销毁窗口之前,如何提示用户确认.为响应WM_CLOSE,这个例子显示了一个含有Yes, OK,Cancel按钮的对话框,如果用户单击Yes按钮,DestroyWindow就被调用,否则,窗口就不会被销毁。因为将要销毁的是一个主窗口,这个例子调用PostQuitMessage来响应WM_DESTROY

    case WM_CLOSE:

    // Create the message box. If the user clicks

    // the Yes button, destroy the main window.

    if (MessageBox(hwnd, szConfirm, szAppName, MB_YESNOCANCEL) == IDYES)

    DestroyWindow(hwndMain);

    else

    return 0;

    case WM_DESTROY:

    // Post the WM_QUIT message to

    // quit the application terminate.

    PostQuitMessage(0);

    return 0;

    窗口函数 结构 消息

    AdjustWindowRect

    AdjustWindowRectEx

    ArrangeIconicWindows

    BeginDeferWindowPos

    BringWindowToTop

    CascadeWindows

    ChildWindowFromPoint

    ChildWindowFromPointEx

    CloseWindow

    CreateWindow

    CreateWindowEx

    DeferWindowPos

    DestroyWindow

    EnableWindow

    EndDeferWindowPos

    EnumChildProc

    EnumChildWindows

    EnumThreadWindows

    EnumThreadWndProc

    EnumWindows

    EnumWindowsProc

    FindWindow

    FindWindowEx

    GetClientRect

    GetDesktopWindow

    GetForegroundWindow

    GetLastActivePopup

    GetNextWindow

    GetParent

    GetTopWindow

    GetWindow

    GetWindowPlacement

    GetWindowRect

    GetWindowText

    GetWindowTextLength

    GetWindowThreadProcessId

    IsChild

    IsIconic

    IsWindow

    IsWindowUnicode

    IsWindowVisible

    IsZoomed

    MoveWindow

    OpenIcon

    SetForegroundWindow

    SetParent

    SetWindowLong

    SetWindowPlacement

    SetWindowPos

    SetWindowText

    ShowOwnedPopups

    ShowWindow

    ShowWindowAsync

    TileWindows

    WindowFromPoint

    WinMain

    Obsolete Functions

    AnyPopup

    EnumTaskWindows

    GetSysModalWindow

    GetWindowTask

    SetSysModalWindow

    CLIENTCREATESTRUCT

    COPYDATASTRUCT

    CREATESTRUCT

    MDICREATESTRUCT

    MINMAXINFO

    NCCALCSIZE_PARAMS

    STYLESTRUCT

    WINDOWPLACEMENT

    WINDOWPOS

    WM_ACTIVATE

    WM_ACTIVATEAPP

    WM_CANCELMODE

    WM_CHILDACTIVATE

    WM_CLOSE

    WM_COMPACTING

    WM_COPYDATA

    WM_CREATE

    WM_DESTROY

    WM_ENABLE

    WM_ENTERSIZEMOVE

    WM_EXITSIZEMOVE

    WM_GETICON

    WM_GETMINMAXINFO

    WM_GETTEXT

    WM_GETTEXTLENGTH

    WM_INPUTLANGCHANGE

    WM_INPUTLANGCHANGEREQUEST

    WM_MOVE

    WM_MOVING

    WM_NCACTIVATE

    WM_NCCALCSIZE

    WM_NCCREATE

    WM_NCDESTROY

    WM_PARENTNOTIFY

    WM_POWER

    WM_QUERYDRAGICON

    WM_QUERYOPEN

    WM_QUIT

    WM_SETICON

    WM_SETTEXT

    WM_SETTINGCHANGE

    WM_SHOWWINDOW

    WM_SIZE

    WM_SIZING

    WM_STYLECHANGED

    WM_STYLECHANGING

    WM_USERCHANGED

    WM_WINDOWPOSCHANGED

    WM_WINDOWPOSCHANGING

    WM_WININICHANGE

    展开全文
  • Windows窗口设计

    2020-09-25 11:15:24
    这里写自定义目录标题Windows API程序设计入门 Windows窗口写作目的操作步骤源代码 Windows API程序设计入门 Windows窗口 写作目的 了解 windows操作系统应用程序开发基本概念,win32 API函数、消息与事件驱动; ...
  • 1.窗口Windows程序是由一系列的窗口构成,每个窗口都有自己的窗口过程,窗口过程就是一个拥有有固定 Signature C函数,具体格式如下:LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM ...
  • 窗口的变换和视口的变换的目的是一样的,都是为了将物体显示在设备环境中,只不过由于视口中使用像素作为单位也就是显示屏的设备坐标,所以往往在视口中进行调整dc比较直观一些。 具体两者的概念上的区别参考:...
  • 目录 1.写在前面 2.窗口(Windows) 2.1分组窗口(Group Windows) ...2.3SQL 中窗口的定义 2.3.1Group Windows 2.3.2Over Windows 3.代码总结 4.代码练习(以分组滚动窗口为例) 1.写在前面 时间语...
  • VC++6.0与Windows窗口设计学习

    千次阅读 2020-09-23 11:33:50
    了解 windows操作系统应用程序开发基本概念,win32 API函数、消息与事件驱动; 掌握WinMain函数基本框架,窗口定义、窗口创建、消息循环及窗口过程函数; 二、作业要求: 动手写第一个基于windows API 基于...
  • 数据流中概念漂移问题的研究已成为近年来流数据挖掘领域的研究热点之一.已有的研究工作多依据单窗口中错误率...分析与实验结果表明:该算法可以快速有效地跟踪检测含噪数据流中的概念漂移,且抗噪性能与分类精度显著提高.
  • windows窗口程序设计

    2020-09-25 16:10:22
    windows窗口程序设计 ** 一:引言 二:目的 (1)了解 windows操作系统应用程序开发基本概念,win32 API函数、消息与事件驱动; ( 2)掌握WinMain函数基本框架,窗口定义、窗口创建、消息循环及窗口过程函数; ...
  •  在windows系统中,每个窗口对象都对应有一个数据结构,形成一个list链表。系统的窗口管理器通过这个list来获取窗口信息和管理每个窗口。这个数据结构中有四个数据用来构建list,即child、sibling、parent、owner四...
  • MFC中CWnd对象和Windows窗口的区别

    千次阅读 2012-12-08 10:36:00
    一个CWnd对象和一个Windows窗口是有本质区别,尽管它们有密切联系。CWnd对象是一个C++概念,即类实例;而Windows窗口则是指向Windows内部数据结构一个句柄,它创建和显示是要消耗系统资源。一个CWnd对象...
  • Emacs 窗口相关的概念

    千次阅读 2010-10-28 16:50:00
    Frame在图形界面下(例如 X window 或者 Microsoft Windows 中),一个 Frame 就是我们通常说一个顶层窗口了。如果不明白,C-x 5 2 试验一下应该就知道了。Emacs中C-x 5 是专门用于Frame相关操作
  • flink之windows窗口概念窗口的类型滚动窗口(tumbling windows)滑动窗口(sliding windows)会话窗口窗口(session windows)窗口应用示例窗口数据的集合统计增量聚合统计7.3.2 全量聚合统计 概念 把数据想象成一种...
  • java监听windows窗口事件,现在几乎用的很少了。 当初我还在大学求学的时候,刚开始学习JAVA,对于它监听windows窗口事件,其实花费了非常...自己不是一个很机灵的人,,很多的概念怎么看也不是很明白,很多的逻辑只...
  • 了解Windows程序内部运行机制与做一个基于Windows API...与动手做一个简单的Windows窗口程序 开发环境 1、Visual Studio 2017 初识Windows 学习Windows窗口应用程序第一步是了解WinMain函数 同DOS程序相同,Windows
  • #include <iostream> using namespace std;...//windows 消息的概念,如何处理windows消息 //windows程序中常用的符号 //windows程序中的基本结构 //如何使用windows API创建简单的程...
  • Windows桌面窗口菜单;... 3Windows操作系统的桌面图标任务栏快捷方式窗口菜单等概念这些概念并不要求学生去记忆只要求知道它们的外观功能并能熟练操作即可 二教学重难点 1重点 桌面的概念熟练掌握窗口和菜单的操作 2
  • windows API窗口程序

    2020-09-25 18:36:16
    了解 windows操作系统应用程序开发基本概念,win32 API函数、消息与事件驱动; 掌握WinMain函数基本框架,窗口定义、窗口创建、消息循环及窗口过程函数; 过程 在visual studio2019 下创建基于windows平台c++...
  • 窗口的概念很容易理解,就是我们使用软件时看到的界面。Windows 的核心就是窗口,它是Windows一统PC操作系统市场的杀手锏,如下图所示: 图1:记事本程序 我们使用的软件都有自己的窗口,比如 QQ、计算器、...
  • 想实现向linux那样多个虚拟桌面么?想知道让服务程序显示界面么?... 当一个用户登录到一个开启了远程桌面机器时,便会开始一个该用户会话。每个会话使用一个唯一会话ID来标识。由于每个登录到远程
  • 窗口窗口的概念很轻易了解,就是我们运用软件时看到的界面。Windows 的中心就是窗口,它是Windows一统PC操作零碎市场的杀手锏,如下图所示:图1:记事本程序我们运用的软件都有本人的窗口,比方QQ、盘算器、记事本等...
  • windows中的句柄的概念

    2010-11-17 20:46:00
    句柄,是整个windows编程基础,一个句柄是指使用一个唯一整数值,是指一个四字节长数值,用于标志应用程序中不同对象和同类对象中不同实例,windows使用了大量句柄来标志很多对象,诸如,一个窗口,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,987
精华内容 794
关键字:

windows窗口的概念