• 【MFC】如何在MFC创建的程序中更改主窗口的属性 与 父窗口 WS_CLIPCHILDREN 样式 对子窗口刷新的影响 与 窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS


    如何在MFC创建的程序中更改主窗口的属性

    摘自:http://blog.sina.com.cn/s/blog_4bebc4830100aq1m.html

    在MFC创建的单文档界面中:

    (基于对话框的,直接在对话框的类向导中的虚函数里边添加PreCreateWindow函数,但是实际上有没有用就没有试过。望试验的告知,谢谢。)

    在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中添加下面的代码可以固定窗口大小

    cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX;// | WS_THICKFRAME;
    cs.style &= ~WS_BORDER;
    cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
    int iWinBorderX = GetSystemMetrics(SM_CXBORDER);
    int iWinBorderY = GetSystemMetrics(SM_CYBORDER);
    int iCaptionY = GetSystemMetrics(SM_CYCAPTION);
    int iMenuY = GetSystemMetrics(SM_CYMENU);
    int iStausY = GetSystemMetrics(SM_CYMENU);
    cs.cx = 510 + iWinBorderX ;
    cs.cy = 530 + iWinBorderY + iCaptionY + iStausY + iMenuY;

        在上面的代码中:

        前三行确定窗口风格。“|”表示添加风格,“&~”表示去掉风格。四到八行用函数GetSystemMetrics获取一些系统数据,以像素为单位。最后计算窗口的宽和高。

        style:

        WS_OVERLAPPED  有标题

        WS_SYSMENU  有系统菜单:最小化、最大化和关闭

        WS_MINIMIZEBOX   可以最小化窗口

        WS_THICKFRAME   可以拖动改变窗口大小

        WS_BORDER   带黑色边框

        WS_MAXIMIZEBOX 可以最大化窗口

        dwExStyle:

        WS_EX_CLIENTEDGE    扩展属性,带阴影边框

        GetSystemMetrics参数:

        SM_CMOUSEBUTTONS  返回值为系统支持的鼠标键数,返回0,则系统中没有安装鼠标。

      SM_CXBORDER、SM_CYBORDER  返回以像素值为单位的Windows窗口边框的宽度和高度,如果Windows的为3D形态,则等同于SM_CXEDGE参数

      SM_CXCURSOR、SM_CYCURSOR  返回以像素值为单位的标准光标的宽度和高度

      SM_CXDLGFRAME、SM_CYDLGFRAME  等同与SM_CXFIXEDFRAME and SM_CYFIXEDFRAME

      SM_CXDOUBLECLK、SM_CYDOUBLECLK  以像素值为单位的双击有效的矩形区域

      SM_CXEDGE、SM_CYEDGE  以像素值为单位的3D边框的宽度和高度

      SM_CXFIXEDFRAME、SM_CYFIXEDFRAME  围绕具有标题但无法改变尺寸的窗口(通常是一些对话框)的边框的厚度

      SM_CXFRAME、SM_CYFRAME  等同于SM_CXSIZEFRAME and SM_CYSIZEFRAME

      SM_CXFULLSCREEN、SM_CYFULLSCREEN  全屏幕窗口的窗口区域的宽度和高度

      SM_CXHSCROLL、SM_CYHSCROLL  水平滚动条的高度和水平滚动条上箭头的宽度

      SM_CXHTHUMB  以像素为单位的水平滚动条上的滑动块宽度

      SM_CXICON、SM_CYICON  系统缺省的图标的高度和宽度(一般为32*32)

      SM_CXICONSPACING、SM_CYICONSPACING  以大图标方式查看Item时图标之间的间距,这个距离总是大于等于


      SM_CXMAXIMIZED、SM_CYMAXIMIZED  处于顶层的最大化窗口的缺省尺寸

      SM_CXMAXTRACK、SM_CYMAXTRACK  具有可改变尺寸边框和标题栏的窗口的缺省最大尺寸,如果窗口大于这个尺寸,窗口是不可移动的。

      SM_CXMENUCHECK、SM_CYMENUCHECK  以像素为单位计算的菜单选中标记位图的尺寸

      SM_CXMENUSIZE、SM_CYMENUSIZE  以像素计算的菜单栏按钮的尺寸

      SM_CXMIN、SM_CYMIN  窗口所能达到的最小尺寸

      SM_CXMINIMIZED、SM_CYMINIMIZED  正常的最小化窗口的尺寸

      SM_CXMINTRACK、SM_CYMINTRACK  最小跟踪距离,当使用者拖动窗口移动距离小于这个值,窗口不会移动。

        SM_CXSCREEN、SM_CYSCREEN  以像素为单位计算的屏幕尺寸。

      SM_CXSIZE、SM_CYSIZE  以像素计算的标题栏按钮的尺寸

      SM_CXSIZEFRAME、SM_CYSIZEFRAME  围绕可改变大小的窗口的边框的厚度

      SM_CXSMICON、SM_CYSMICON  以像素计算的小图标的尺寸,小图标一般出现在窗口标题栏上。

      SM_CXVSCROLL、SM_CYVSCROLL  以像素计算的垂直滚动条的宽度和垂直滚动条上箭头的高度

      SM_CYCAPTION  以像素计算的普通窗口标题的高度

      SM_CYMENU  以像素计算的单个菜单条的高度

      SM_CYSMCAPTION  以像素计算的窗口小标题栏的高度

      SM_CYVTHUMB  以像素计算的垂直滚动条中滚动块的高度

      SM_DBCSENABLED  如果为TRUE或不为0的值表明系统安装了双字节版本的USER.EXE,为FALSE或0则不是。

      SM_DEBUG  如果为TRUE或不为0的值表明系统安装了debug版本的USER.EXE,为FALSE或0则不是。

      SM_MENUDROPALIGNMENT  如果为TRUE或不为0的值下拉菜单是右对齐的否则是左对齐的。

      SM_MOUSEPRESENT  如果为TRUE或不为0的值则安装了鼠标,否则没有安装。

      SM_MOUSEWHEELPRESENT  如果为TRUE或不为0的值则安装了滚轮鼠标,否则没有安装。(Windows NT only)

      SM_SWAPBUTTON  如果为TRUE或不为0的值则鼠标左右键交换,否则没有。

    父窗口 WS_CLIPCHILDREN 样式 对子窗口刷新的影响

    摘自:http://www.cppblog.com/zaccheo/articles/180331.html

    写了下面的程序,测试下父窗口设置 WS_CLIPCHILDREN 前后,对父窗口调用 RedrawWindow 或 InvalidateRect 对子窗口刷新造成的影响

    操作

    WS_CLIPCHILDREN

    WS_CLIPCHILDREN

    InvalidateRect

    父窗口的无效区域增加

    对子窗口无影响

    父窗口的无效区域增加

    子窗口的无效区域增加

    且无效区域坐标相同(屏幕坐标系下)

    RedrawWindow

    FLAG: RDW_INVALIDATE

    父窗口的无效区域增加

    对子窗口无影响

    父窗口的无效区域增加

    子窗口的无效区域增加

    且无效区域坐标相同(屏幕坐标系下)

    RedrawWindow

    FLAG: RDW_INVALIDATE|RDW_ALLCHILDREN

    父窗口的无效区域增加

    子窗口的无效区域增加

    且无效区域坐标相同(屏幕坐标系下)

    父窗口的无效区域增加

    子窗口的无效区域增加

    且无效区域坐标相同(屏幕坐标系下)

    RedrawWindow

    FLAG: RDW_INVALIDATE|RDW_NOCHILDREN

    父窗口的无效区域增加

    对子窗口无影响

    父窗口的无效区域增加

    对子窗口无影响

    其他窗口在父子窗口上移动

    父窗口会接收到WM_PAINT消息,但是无效区域是 父窗口 排除子窗口后的区域和 其他当前移动的窗口区域的交集

    子窗口会接收到wm_paint消息,无效区域是 子窗口和当前移动的窗口的区域的交集

    父窗口会接收到WM_PAINT消息,但是无效区域是 父窗口当前移动的窗口区域的交集

    子窗口会接收到wm_paint消息,无效区域是 子窗口和当前移动的窗口的区域的交集

    窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS

    摘自: http://www.cnblogs.com/gleam/archive/2012/11/26/2789513.html

    WS_CLIPCHILDREN,使得父窗体在绘制时留出其上的子窗体的位置不去画它,而那片区域留着子窗体去画。
    WS_CLIPSIBLINGS,必须用于子窗体,使得该子窗体在收到WM_PAINT时同时令其共父的诸多子窗体(MSDN讲必须不在该区域,即不与之重叠)也会被PAINT。

    //下面也是对WS_CLIPSIBLINGS的理解
    所有的overlapped窗口和popup窗口,都有WS_CLIPSIBLINGS 属性,
    这些窗口不能在它的sibling窗口上绘图

    对于child窗口,如果没有这个属性,它能在它的sibling窗口上绘图

     ┌────────┐
     │    A          │
     │               │
     │    ┌─────┼───┐
     │    │  C      │      │
     │    │         │      │
     └──┼─────┘      │
          │                  │
          │     B            │
          └──────────┘


    如果A, B都是child窗口,
    如果A具有WS_CLIPSIBLINGS属性,
    那么A重绘时不会重绘C部分

    clip是裁减,去除的意思 相当与英文的Exclude

    WS_CLIPCHILDREN和WS_CLIPSIBLING都是为了减少重画,减少闪动,保证窗口的重叠部分只有一个窗口来实现PAINT。

    如果问题解决起来不妥或者有更好的解决办法,麻烦请告知,帮助曾经和你一样的入门者,谢谢。
  • 相关阅读:
    docker常用命令
    docker安装注意事项
    DataGridView中实现自动编号
    Flask设置配置文件
    python路径找类并获取静态字段
    JavaScript数据类型
    php学习笔记6
    php学习笔记5
    php学习笔记4
    php学习笔记3
  • 原文地址:https://www.cnblogs.com/ourran/p/4610278.html
Copyright © 2020-2023  润新知