一、全屏

  1、全屏窗口从dialogex继承,因为要处理一些东西

  2、全屏代码,这样设置后尺寸不会出bug,只设置为最大值的话容易出bug

    //get current system resolution
    int g_iCurScreenWidth = GetSystemMetrics(SM_CXSCREEN);
    int g_iCurScreenHeight = GetSystemMetrics(SM_CYSCREEN);

    //for full screen while backplay
    GetWindowPlacement(&_struOldWndpl);

    CRect rectWholeDlg;//entire client(including title bar)
    CRect rectClient;//client area(not including title bar)
    CRect rectFullScreen;
    GetWindowRect(&rectWholeDlg);
    RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &rectClient);
    ClientToScreen(&rectClient);

    rectFullScreen.left = rectWholeDlg.left - rectClient.left;
    rectFullScreen.top = rectWholeDlg.top - rectClient.top;
    rectFullScreen.right = rectWholeDlg.right + g_iCurScreenWidth - rectClient.right;
    rectFullScreen.bottom = rectWholeDlg.bottom + g_iCurScreenHeight - rectClient.bottom;
    //enter into full screen;
    WINDOWPLACEMENT struWndpl;
    struWndpl.length = sizeof(WINDOWPLACEMENT);
    struWndpl.flags = 0;
    struWndpl.showCmd = SW_SHOWNORMAL;
    struWndpl.rcNormalPosition = rectFullScreen;
    SetWindowPlacement(&struWndpl);
    return true;

  3、全屏机制,创建全局的全屏类,也可以动态创建,竞争可以比较指针代替状态设置

  4、ShowWindow(SW_SHOW);ShowWindow(SW_HIDE);进行显示关闭

  5、全屏对按键消息的处理,包括win按键的处理

    BOOL cloudfullscreen::PreTranslateMessage(MSG* pMsg)
    {
    if (pMsg->message == WM_KEYUP)
    {
      switch (pMsg->wParam)
      {
        case VK_ESCAPE:
        resetOwner();
        break;
        case VK_LWIN:
        resetOwner();
        break;
        case VK_RWIN:
        resetOwner();
        break;
        defalut:
        break;

      }
    }
    return CDialogEx::PreTranslateMessage(pMsg);
    }

  6、dialog对话框的bug,重写

    virtual void OnCancel();
    virtual void OnOK();并注释掉原来的处理内容

    不然esc和return按键会出bug

  7、设置焦距:->SetFocus();

  8、设置全屏实例化的对话框也需要创建才会执行initdialog函数

    cloud_fullscreen_dialog_global.Create(IDD_CLOUD_FULLSCREEN);

    可以用静态标志位判断是否第一次创建。

二、动态显示子窗口及子窗口中的多个控件

  1、子窗口最好继承dialogex,这样才能处理消息和重载虚函数

  2、控件可以静态画上去,或动态创建

  3、思想:同一子窗口中的不同控件分层思想设置显示位置,(一般按相对比率来计算绝对位置,再画上去。若控件数目不定则用其它方法)

  4、获取客户区大小

    CRect clientRect;
    ::GetClientRect(this->m_hWnd, &clientRect); //取客户区大小

  5、移动控件,改变大小

    ::MoveWindow(c._wnd, r.left, r.top, r.Width(), r.Height(), TRUE);

  6、显示::ShowWindow(i.second->_wnd, SW_SHOW);

  7、控件是否被点击判断

    POINT CurPt;
    CurPt.x = point.x;
    CurPt.y = point.y;
    CRect PntDspRect;
    ::GetWindowRect(_wnd, &PntDspRect);
    CWnd::FromHandle(_wnd)->GetParent()->ScreenToClient(&PntDspRect);

    if ((CurPt.x < PntDspRect.left) || (CurPt.x > PntDspRect.right)
    || (CurPt.y < PntDspRect.top) || (CurPt.y > PntDspRect.bottom))
    {
      return false;
    }
    CurPt.x = CurPt.x - PntDspRect.left;
    CurPt.y = CurPt.y - PntDspRect.top;
    if (CurPt.x < 0 || CurPt.y > PntDspRect.right || CurPt.y<0 || CurPt.y > PntDspRect.bottom)
      return false;

    return true;

  注意:鼠标滚轮旋转(注意只是旋转,滚轮点击鼠标输入坐标和左右键输入坐标一样)输入坐标是屏幕坐标,应直接判断,不需要用父窗口判断

  8、dialog对话框的bug,重写

    virtual void OnCancel();
    virtual void OnOK();并注释掉原来的处理内容

    不然esc和return按键会出bug

  9、设置焦距:->SetFocus();

MFC全屏显示和多窗口动态显示的一些技巧和方法的更多相关文章

  1. 在VC++6.0开发中实现全屏显示

    全屏显示是一些应用软件程序必不可少的功能.比如在用VC++编辑工程源文件或编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“Esc”键后会退出全屏显示状态. ...

  2. 【温故而知新-Javascript】窗口效果 (全屏显示窗口、定时关闭窗口)

    1.全屏显示窗口 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  3. QT中关于窗口全屏显示与退出全屏的实现

    近期在学习QT时遇到了很多问题这也是其中一个,个人通过在各种书籍和网络上的查阅找到了一些关于这方面的答案,希望能给大家一些帮助. 首先,在QT中对于窗口显示常用的有这么几个方法可以调用: Qt全屏显示 ...

  4. Qt全屏显示窗口、子窗口的相关函数

    Qt全屏显示函数         window.showFullScreen() Qt最大化显示函数         window.showMaximized() Qt最小化显示函数         ...

  5. QT5中全屏显示子窗口和取消全屏的方法

    问题描述:用QT5做了个MDI多窗体应用程序,想把子窗体全屏显示,用网上的方法,但总是遇到问题. 网上的解决方法原文在这:http://www.cnblogs.com/Rick-w/archive/2 ...

  6. C# WinForm中 让控件全屏显示的实现代码

    夏荣全 ( lyout(at)163.com )原文 C#中让控件全屏显示的实现代码(WinForm) 有时候需要让窗口中某一块的内容全屏显示,比如视频播放.地图等等.经过摸索,暂时发现两种可行方法, ...

  7. android启动画面隐藏状态栏全屏显示

    1.在根部局给一个id,然后直接设置就行了layout.setSystemUiVisibility(View.INVISIBLE); 状态栏就没有了. 2.如果你只是想改变状态栏颜色的也可以 //5. ...

  8. PyQt5图像全屏显示

    Windows装这个:https://pypi.python.org/pypi/PyQt5Ubuntu输入这个:sudo apt-get install python3-pyqt5 或者直接输入:pi ...

  9. JavaScript:让浏览器全屏显示

    并不是所有人都会按F11让浏览器全屏显示~~~ 一.直接上代码 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xh ...

随机推荐

  1. JavaSE笔记-集合

    Java集合大致可分为:List,Set,Map,Queue List:有序,可重复 Set:无序(输出和插入顺序不一定一致),不可重复 Map:映射关系,根据key去访问value Queue:队列 ...

  2. Python爬虫从入门到进阶(1)之Python概述及爬虫入门

    一.Python 概述 1.计算机语言概述 (1).语言:交流的工具,沟通的媒介 (2).计算机语言:人跟计算机交流的工具 (3).Python是计算机语言的一种 2.Python编程语言 代码:人类 ...

  3. python进制转化函数,10进制字符串互转,16进制字符串互转

    来了老弟,emmmmm,今天想到平时经常用到编码转化,把字符串转化为16进制绕过等等的,今天想着用python写个玩,查询了一些资料,看了些bolg 上面的两个函数是将二进制流转化为16进制,data ...

  4. ubuntu 1604安装docker-ce 记录

    以前在linux 内核为2.x的低版本中安装过docker,但是很多功能特性都无法使用,本次是在ubuntu 16.04上安装,记录安装过程,方便后续查阅. 一.安装前准备: 1. 安装包,允许 ap ...

  5. Python基础【第二篇】

    一.Python的标准数据类型 Python 3中主要有以下6中数据类型: Number(数字).String(字符串).List(列表).Tuple(元组).Sets(集合).Dictionary( ...

  6. SQL数据插入

    T-SQL中提供了多个将数据插入到表中的语句:insert values.insert select.insert exec.select into和Bulk insert: 1.  insert v ...

  7. 树·AVL树/平衡二叉树

    1.AVL树 带有平衡条件的二叉查找树,所以它必须满足条件: 1 是一棵二叉查找树 2 满足平衡条件 1.1 平衡条件: 1)严格的平衡条件:每个节点都必须有相同高度的左子树和右子树(过于严格而不被使 ...

  8. vue组件,通过props父组件给子组件传值,WTF, 子组件报错undefined???

    如果是正常操作,找了半天又找不到为什么undefined, 那很可能是props的命名出了问题: 不要用小驼峰式命名 例如这种childrenData 这种形式就会报错undefined  请尽量用全 ...

  9. 在Pycharm中自动添加时间日期作者等信息

    1.按照下面路径以此打开File→→Settings→→Editor→→File and code Templates 右侧找到Python Script,如下图 2.设置相关代码如下 ##!/usr ...

  10. Python Basic 01.Basic

    01.variable ''' 변수(variable) - 자료(data)를 임시(휘발성) 저장하는 역할 - 실제 자료가 아닌 자료의 주소를 저장한다.(참조변수) ''' # 1. 변수 ...