小鸟在MFC下的OpenGL学习笔记(一)全屏篇

原创 2007年10月11日 13:47:00

小鸟又来了.小鸟这次马不停蹄,立刻奉上全屏篇,解决 "小鸟在MFC下的OpenGL学习笔记(一)"中遗留的问题.不过,这也可以独立来看,这篇与OpenGL是完全没有关系的.

MFC下的全屏,其原理很简单,其实就是根据全屏后屏幕显示区的位置,得到窗口的位置,然后设置就可以了.如果窗口有标题栏的话,就让标题栏到屏幕之外去.总之一句话,让你的显示区域恰好充满整个屏幕就可以了.

首先在DlG类中加入以下变量申明:

    BOOL m_bFullSreen;          // 全屏幕标志
    CRect mFullSreen;           // 全屏幕尺寸
    CRect WndRect;              // 非全屏幕时屏幕尺寸

小鸟本人还是挺懒的,就暂时用MFC的WM_KEYUP来响应键盘时间吧.哎..................我会很快奉上高精度键盘响应篇的.

在OnKeyUp函数中加入以下代码:

void CLesson1Dlg::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
...{
    
// TODO: Add your message handler code here and/or call default
    switch(nChar)
    
...{
    
case 'f':
    
case 'F':
        
...{
            
if(m_bFullSreen)         //若正处于全屏模式,则不处理
                break;
            
int   cx,cy;   
            cx   
=   GetSystemMetrics(SM_CXSCREEN);   //屏幕像素宽度
            cy   =   GetSystemMetrics(SM_CYSCREEN);   //屏幕像素高度
            this->GetWindowRect(&WndRect);            //存储当前非全屏下的窗口尺寸
            CRect CliRect;                            //显示区域的尺寸
            this->GetClientRect(&CliRect);
            ClientToScreen(
&CliRect);                 //转换成屏幕尺寸
            mFullSreen.left = WndRect.left - CliRect.left;     //计算全屏幕后窗口尺寸的left值
            mFullSreen.top = WndRect.top - CliRect.top;           //计算全屏幕后窗口尺寸的top值
            mFullSreen.right = WndRect.right - CliRect.right + cx;//计算全屏幕后窗口尺寸的right值
            mFullSreen.bottom = WndRect.bottom - CliRect.bottom + cy;//计算全屏幕后窗口尺寸的bottom值
            m_bFullSreen = TRUE;                         //设置全屏标志为真
            
//重新设置窗口位置
            this->SetWindowPos(&wndTopMost,mFullSreen.left,mFullSreen.top,mFullSreen.Width(),mFullSreen.Height()
                ,SWP_SHOWWINDOW);
            
break;
        }

    
case 'b':
    
case 'B':
        
...{
            
//若正处于全屏模式下
            if (m_bFullSreen)
            
...{
            m_bFullSreen 
= FALSE;//设置全屏标志为真
            
//重新设置窗口位置,尺寸为存储的非全屏幕时的大小
            this->SetWindowPos(&wndTopMost,WndRect.left,WndRect.top,WndRect.Width(),WndRect.Height()
                ,SWP_SHOWWINDOW);
            }

            
break;
        }

    }

    CDialog::OnKeyUp(nChar, nRepCnt, nFlags);
}

到这里,按说应该就可以了吧.但是小鸟今天全屏的时候高度一直不对.不关我全屏的时候高度设置多大(我设置了2000多),但程序的高度最大只能到768左右.小鸟推测,CDialog类默认限制了窗口的最大尺寸.至于这个尺寸是多少,小鸟也不得而知了.小鸟继续在网上寻找,终于给我找到了WM_MINMAXINFO消息.Windows系统要向将要改变大小和位置的窗口发送WM_GETMINMAXINFO消息,并且可以在响应函数中更改窗口的最大尺寸.不过到这里,小鸟就很恨了.在SDI或者MDI中,可以在类向导中直接填加CMainFrame的WM_GETMINMAXINFO响应函数.但是在对话框程序中不能在类向导填加,必须得自己写的.还好,至少对话框程序支持WM_GETMINMAXINFO响应,要不我都不知道该怎么办了.

在Dlg中加入函数申明:

    afx_msg void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI);

这是消息响应函数,加在那里不用小鸟细说了吧.

在Dlg的消息映射中加入:

 ON_WM_GETMINMAXINFO();

这里不得不BS下CSDN的插入代码功能.怎么我插一行代码的时候经常会插不了呢?插多行的时候怪好的.

啥?问我消息映射在哪??不就是在APP的.在APP中找到如下形式的代码吧.

BEGIN_MESSAGE_MAP(CLesson1Dlg, CDialog)
    
//{{AFX_MSG_MAP(CLesson1Dlg)
                      /**////////////////////////////////////
                      
////////////消息映射/////////////
                      
//////////////////////////////////

    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

小鸟要晕了...代码又插入成功了......................

最后,就是函数的实现部分了.代码来了...

void CLesson1Dlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
...{
    
// TODO: Add your message handler code here and/or call default
    if   (m_bFullSreen)   
    
...{    
        
//改变最大TRACK尺寸   
        lpMMI->ptMaxTrackSize.x   =   mFullSreen.Width();   
        lpMMI
->ptMaxTrackSize.y   =   mFullSreen.Height();   
    }
 
    CWnd ::OnGetMinMaxInfo(lpMMI);
}

哎,这么简单的代码,小鸟也不是太了解.小鸟有个习惯,就是懒.如果不是必须的话,小鸟很不喜欢去刨根揪地.要扯原理的话,又要很多口水了.大家还是自己去找找这个函数的意思,还有MINMAXINFO FAR* lpMMI结构的意义.知道了别忘了告诉我.

大工告成.试一下吧,F键全屏,B键还原.知道了原理,大家也能开发更实用的程序了.

《鸟哥的Linux私房菜--基础学习篇》 读书笔记

############################################ 第20章 启动流程、模块管理与Loader 2015.04.11 ######################...
  • ustc_summer
  • ustc_summer
  • 2015年04月11日 17:59
  • 1270

【鸟哥的linux私房菜】终于再次读完《Linux 基础篇》——一些感想

今年暑假才开始入门linux,听说鸟哥的书挺适合入门的,于是就开始从《鸟哥的linux私房菜——基础篇》开始学,暑假的时候,比较粗略地看过了一遍,对linux系统有了整体的概念,也做了一些小笔记,不过...
  • jiange_zh
  • jiange_zh
  • 2015年11月16日 00:28
  • 4728

深度学习笔记1(卷积神经网络)

深度学习笔记1(卷积神经网络)          在看完了UFLDL教程之后,决定趁热打铁,继续深度学习的学习,主要想讲点卷积神经网络,卷积神经网络是深度学习的模型之一,还有其它如AutoEncodi...
  • Lu597203933
  • Lu597203933
  • 2015年06月20日 21:49
  • 11400

iPhone开发学习笔记004——自定义背景透明非全屏弹出窗口,子类化UIWindow

最终要实现的效果如下,点击上面的按钮可以弹出一个背景透明非全屏的弹出窗口,不使用UIActionSheet和UIAlertView.    下面说说具体过程。 一、新建一个single view a...
  • duanyipeng
  • duanyipeng
  • 2012年02月14日 22:23
  • 3662

as3学习笔记7:as3全屏功能

开发环境:FlashDevelop 步骤: 1.新建一个as3工程:FullScreen 目录:E:/ActionScript/FullScreen 2.在Main.a...
  • blackstar0219
  • blackstar0219
  • 2014年05月13日 18:55
  • 601

code_opengl学习笔记3-1-在3D中绘制点

  • 2013年09月30日 18:09
  • 7.54MB
  • 下载

code__opengl学习笔记1-基本的运行框架

  • 2013年09月22日 22:29
  • 3.47MB
  • 下载

opengl es 2.0 学习笔记

  • 2010年07月29日 16:24
  • 381KB
  • 下载

code__opengl学习笔记2-绘制矩形

  • 2013年09月24日 23:03
  • 797KB
  • 下载

opengl学习笔记4-动画效果

  • 2013年09月26日 22:04
  • 797KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:小鸟在MFC下的OpenGL学习笔记(一)全屏篇
举报原因:
原因补充:

(最多只允许输入30个字)