zoukankan      html  css  js  c++  java
  • vc中窗口尺寸和位置相关

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

    • 尺寸

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

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

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

    • 位置
      窗口的位置是由它左上角的坐标决定的,这些坐标有时叫做窗口坐标,总是相对于屏幕的左上角,对于子窗口来说,则是相对于其父窗口客户区的左上角。例如,某个顶层窗口的坐标是(10,10),那么它就被定位在屏幕左上角向右10个象素,向下10个象素的位置。如果一个子窗口的坐标是 (10,10)。那么它就被定位在其父窗口客户区左上角向右10个象素向下10个象素的位置。
      函数WindowFromPoint用来检取包含屏幕上某一点的窗口的句柄,函数ChildWindowFromPoint则用来检取包含父窗口客户区中某一点的子窗口的句柄,这个点的坐标属于客户区坐标。
    •   默认的尺寸和位置

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

    • 跟踪尺寸
      window系统管理具有WS_THICKFRAME风格的窗口的最小和最大跟踪尺寸,具有这种风格的窗口有一个改变大小边框。最小跟踪尺寸是用户通过拖动窗口大小边框所能达到的最小窗口尺寸。同样,最大跟踪尺寸是用户通过拖动窗口大小边框所能达到的最大窗口尺寸。
      窗口的最小和最大跟踪尺寸是在Windows系统创建窗口时设置的系统定义的默认值。应用程序可通过处理WM_GETMINMAXINFO消息来获取或改变这些默认值。
    • 系统命令

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


    风格

    描述

    SC_CLOSE

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

    SC_MAXIMIZE

    最大化窗口

    SC_MINIMIZE

    最小化窗口

    SC_RESTORE

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

    SC_SIZE

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

    • Z次序

      窗口的Z次序表明了覆盖窗口堆中窗口的位置,这个窗口堆是按一个假想的轴定位的,这个轴就是从屏幕向外伸展的Z轴。Z次序最上面的窗口覆盖所有其它的窗口,Z次序最底层的窗口被所有其它的窗口覆盖。应用程序设置窗口在Z次序中的位置是通过把它放在个给定的窗口的后面,或是放在堆的顶部或底部。
      Windows系统管理三个独立的Z次序一个用于顶层窗口、一个用于兄弟窗口还有一个是用于最顶层窗口。最顶层窗口覆盖所有其它非最顶层窗口。而不管它是不是活动窗口或是前台窗口。应用程序通过设置WS_EX_TOPMOST风格创建最项层窗口。
      一股情况下,Windows系统把刚创建的窗口放在Z次序的顶部,用户可通过激活另外个窗口来改变Z次序Windows系统总是把活动的窗口放在Z次序的顶部,应用程序可用函数BringWindowToTop把一个窗口放置到Z次序的顶部。函数SetWindowPos和DeferWindowPos用来重排Z次序。

    • 改变大小和定位函数

      创建了窗口之后,应用程序可调用下列函数来设置窗口的大小和位置,这些函数是MoveWindow、SetWindowPos、DeferWindowPos和SetWindowPlacement。
      函数MoveWindow和SetWindowPos差不多,都用来设置单个应用程序窗口的大小和位置。函数SetWindowPos则含有一系列影响窗口显示状态的标志,以及窗口的位置属性。
      函数BeginDeferWindowPos、DeferWindowPos和EndDeferWindowPos一起用来同时设置一些窗口的大小、位置、z次序中的位置和显示状态。
      函数SetWindowPlacement则用来设置窗口最小和最大时的位置、恢复窗口的尺十和位置及显示状态。
      应用程序使用函数GetWindowRect检取窗口限定矩形的坐标,GetWindowRect用窗口的左上角和右下角填充RECT结构,这些坐标是相对于屏幕左上角的,对于窗口也一样。函数ScreenToClient或MapWindowPoints把子窗口限定矩形的屏幕坐标映射成相对于父窗口客户区的坐标。
      函数GetClientRect用于检取窗口客户区的坐标,GetClientRect用客户区左上角和右下角坐标填充RECT结构,但这里的坐标是相对于客户区本身的。这就是说,客户区左上角的坐标总是(0,0),右下角的坐标是客户区的宽度和高度。

    • 尺寸和位置消息

      Windows系统要向将要改变大小和位置的窗口发送WM_GETMINMAXINFO消息,例如,用户从System菜单上选中Move和 Size命令或单击了大小边框或是标题栏,或者应用程序调用函数SetWindowPos移动或改变窗口大小时,发送WM_GETMINMAXINFO消息。
      WM_GETMINMAXINFO消息含有一个MINMAXINFO结构的指针,这个结构是窗口的默认的最大尺寸和位置,以及窗口的最小和最大跟踪尺寸。应用程序可以通过处理WM_GETMINMAXINFO消息并给MINMAXINFO结构的成员适当的设置来改变这些默认值。
      接收WM_GETMINMAXINFO消息的窗口必须具有WS_THICKFRAME或WS CAPTION风格,具有WS_THICKFRAME风格的窗口在窗口创建过程中,或是在移动或改变大小时会接收到这条捎息。
      Windows系统还会向一个将要改变大小、位置、Z轴中的次序及显示状态时向窗口发送一条WM_WINDOWPOSCHANGING消息,这条消息含有一个WINDOWPOS结构的指针,这个结构指定了窗口新的尺寸、位置、Z轴次序中的位置及显示状态。
      设置WM_WINDOWPOSCHANGING消息的WINDOWPOS结构成员对窗口并没有影响,一个必须处理WM_SIZE和 WM_MOVE消息的窗口必须把WM_WINDOWPOSCHANGING消息传给函数DefWindowProc,否则Windows系统不会向窗口发送WM_SIZE和WM_MOVE消息。
      Windows系统在某窗口创建或被改变大小的时候向该窗口发送WM_NCCALCSIZE消息,Windows系统使用这条消息计算窗口客户区的大小以及相对于窗口的左上角的客户区的位置,窗口通常把这条消息传给默认的窗口过程,但是这条消息对要定制窗口非客户区或在改变窗口大小时保留客户区的某一部分的应用程序来说是很有用的
    在MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置:
    CRect r;
    pWnd->GetWindowRect(&r);
    这样获得的r是控件相对于屏幕的坐标,然后用ScreenToClient(&r)就可以获得控件相对于父窗口的坐标。
    如果用GetClientRect(&r)的话,r.left和r.top始终是0,得到的并不是实际坐标。
    • 相关函数
    1. GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置。
    2. GetClientRect取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的。
    3. ClientToScreen把客户区坐标系下的RECT坐标转换为屏幕坐标系下的RECT坐标.
    4. ScreenToClient把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标.  
    5. 我们对同一个窗口先GetWindowRect取得一个RECT,再用ScreenToClient转换到客户坐标系。然后GetClientRect取得一个RECT,再用ClientToScreen转换到屏幕坐标系.
      显然,GetWindowRect取得的矩阵不小于GetClientRect取得的矩阵。因为前者包含了非客户区,而后包括了客户区。对GetWindowRect取得的矩阵ScreenToClient后,矩阵的大小没有变小,(-3,-29)是窗口的左上角的坐标,相对窗口客户区左上角。  对GetClientRect取得的矩阵ClientToScreen后,矩阵也没有变大,新得到的矩阵是窗口客户区在屏幕坐标系上的RECT。
    • MoveWindow
     函数原型:BOOL MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint );
    参数
    hWnd指定了窗口的句柄
    x指定了CWnd的左边的新位置。
    y指定了CWnd的顶部的新位置。
    nWidth指定了CWnd的新宽度。
    nHeight指定了CWnd的新高度。
    bRepaint指定了是否要重画CWnd。如果为TRUE,则CWnd象通常那样在OnPaint消息处理函数中接收到一条WM_PAINT消息。如果这个参数为FALSE,则不会发生任何类型的重画操作。这应用于客户区、非客户区(包括标题条和滚动条)和由于CWnd移动而露出的父窗口的任何部分。当这个参数为FALSE的时候,应用程序必须明确地使CWnd和父窗口中必须重画的部分无效或重画。
    MoveWindow给窗口发送WM_WINDOWPOSCHANGING,WM_WINDOWPOSCHANGED,WM_MOVE,WM_SIZE和WM_NCCALCSIZE消息

    MoveWindow()的两个重载函数

    void CWnd::MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );
    void CWnd::MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );
    参数
    x指定了CWnd的左边的新位置。
    y指定了CWnd的顶部的新位置。
    nWidth指定了CWnd的新宽度。
    nHeight指定了CWnd的新高度。
    bRepaint指定了是否要重画CWnd。如果为TRUE,则CWnd象通常那样在OnPaint消息处理函数中接收到一条WM_PAINT消息。如果这个参数为FALSE,则不会发生任何类型的重画操作。这应用于客户区、非客户区(包括标题条和滚动条)和由于CWnd移动而露出的父窗口的任何部分。当这个参数为FALSE的时候,应用程序必须明确地使CWnd和父窗口中必须重画的部分无效或重画。
    lpRectCRect对象或RECT结构,指定了新的大小和位置。说明这个函数改变窗口的位置和大小。对于顶层的CWnd对象,x和y参数是相对于屏幕的左上角的。对于子对象,它们是相对于父窗口客户区的左上角的。
    MoveWindow函数发送一条WM_GETMINMAXINFO消息。处理这个消息时,CWnd得到一个改变最大和最小的窗口缺省值的机会。如果传递给MoveWindow成员函数的参数超过了这些值,则在WM_GETMINMAXINFO处理函数中可以用最小或最大值来代替这些值。

  • 相关阅读:
    morning
    周末,又见周末
    One Care, still Care
    Linux 下挂载硬盘的 方法
    Oracle 11g Alert log 文件位置的问题
    Oracle中 drop user 和 drop user cascade 的区别
    如何加快建 index 索引 的时间
    Oracle ADDM 自动诊断监视工具 介绍
    Vmware SERVER 简介
    Oracle Logminer 说明
  • 原文地址:https://www.cnblogs.com/rainduck/p/2076406.html
Copyright © 2011-2022 走看看