MFC全屏显示OpenGL窗口的简易操作

全屏显示OpenGL程序的说明

 

本程序主要在CMainFrame上操作:

1.准备工作OpenGL框架的创建

 

(1)添加需要的成员变量:

CClientDC(或者CDCm_pDC 并初始化m_pDC=new CClientDC(this);(注意只能在OnCreate()里加,而不能在View类的构造函数里加,???不知道为什么)

 

(2)设置像素格式考虑到模块化就封装了bSetupPixelFormat()

匹配并选择合适的像素格式ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)

并选到设备描述表中SetPixelFormat(m_pDC->GetSafeHdc(),iPixelFormat,&pfd)

 

(3)创建相关联的着色描述表 并将其与设备描述表连接

       hrc=::wglCreateContext(m_pDC->GetSafeHdc());                         /

       ::wglMakeCurrent(m_pDC->GetSafeHdc(),hrc); 

4)具体OpenGL场景的初始化

 

2.CMainFrame类中操作实现全屏显示

(1)准备工作添加成员变量

WINDOWPLACEMENT m_OldWndPlacement;//存储窗口显示的位置等信息

CRect m_rectFullScreen;//保存全屏显示的区域矩形(其实可省去此变量,后面解释)

BOOL m_bFullScreen;//控制全屏的开关变量

 

(2)封装OnFullScreen()函数

一、保存窗口原来的位置等信息

GetWindowPlacement(&m_OldWndPlacement);

二、获得整个窗口的矩形坐标

GetWindowRect(&WindowRect);

三、获得视图客户区的矩形坐标(相对于框架客户区,reposQuery这个参数的作用)

RepositionBars(0,0xffff,AFX_IDW_PANE_FIRST,reposQuery,&ClientRect);

四、将该坐标转化为屏幕坐标系      

ClientToScreen(&ClientRect); 

五、计算屏幕的长和宽

int nFullWidth= GetSystemMetrics(SM_CXSCREEN);

int nFullHeight=GetSystemMetrics(SM_CYSCREEN);

六、计算全屏显示的位置

       m_rectFullScreen.left=WindowRect.left-ClientRect.left-2;

       m_rectFullScreen.top=WindowRect.top-ClientRect.top-2;

       m_rectFullScreen.right=WindowRect.right-ClientRect.right+nFullWidth+2;

       m_rectFullScreen.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight+2;

       m_bFullScreen=TRUE;

七、更新窗口位置

WINDOWPLACEMENT wndpl;

       wndpl.length=sizeof(WINDOWPLACEMENT);

       wndpl.flags=0;

       wndpl.showCmd=SW_SHOWNORMAL;

       wndpl.rcNormalPosition=m_rectFullScreen;

       SetWindowPlacement(&wndpl);

 

补充说明:

其实第二步到第五步都是为第六步做铺垫的,但第六步求出来的值其实是一个定值,也就是说计算出来此值之后,以后的每一个需要全屏显示的程序都可以直接用这个值,从而避免此操作,对应的前面这个变量m_rectFullScreen可以省略,这也是有Windows窗口的固有属性决定的。

这里先给出这个值:

m_rectFullScreen.left=0-10

可以计算出来这个值就是 (边框的宽度左右都一样)(边框)

 

m_rectFullScreen.top=0-76

上面的宽度(菜单栏+标题栏+工具栏+边框)

 

m_rectFullScreen.right=1280+10

 

m_rectFullScreen.bottom=800-76+105

下面的宽度105-76(状态栏+边框)

 

我们可以看到为了达到全屏的效果,其实是不显示标题栏、菜单栏、工具栏、边框,就是原矩形(0,0)(1280,800)进行平移操作即可

 

(3)设置移动的时候全屏的大小不变,重载OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)

设置如下:

lpMMI->ptMaxSize.x=1300;//m_rectFullScreen.Width();

lpMMI->ptMaxSize.y=905;//m_rectFullScreen.Height();

lpMMI->ptMaxPosition.x=0;//m_rectFullScreen.Width();

lpMMI->ptMaxPosition.y=0;//m_rectFullScreen.Height();

      

lpMMI->ptMaxTrackSize.x=1300;//m_rectFullScreen.Width();

lpMMI->ptMaxTrackSize.y=905;//m_rectFullScreen.Height();

重要的是最后两行代码,注意:注释和数字是等价的,就是前面讨论的两种方法

 

(4)退出全屏,封装EndFullScreen()

       if(m_bFullScreen)

       {

              //退出全屏显示, 恢复原窗口显示

              ShowWindow(SW_HIDE);

              SetWindowPlacement(&m_OldWndPlacement);

       }

      

全屏显示OpenGL程序的说明

 

本程序主要在CMainFrame上操作:

1.准备工作OpenGL框架的创建

 

(1)添加需要的成员变量:

CClientDC(或者CDCm_pDC 并初始化m_pDC=new CClientDC(this);(注意只能在OnCreate()里加,而不能在View类的构造函数里加,???不知道为什么)

 

(2)设置像素格式考虑到模块化就封装了bSetupPixelFormat()

匹配并选择合适的像素格式ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)

并选到设备描述表中SetPixelFormat(m_pDC->GetSafeHdc(),iPixelFormat,&pfd)

 

(3)创建相关联的着色描述表 并将其与设备描述表连接

       hrc=::wglCreateContext(m_pDC->GetSafeHdc());                         /

       ::wglMakeCurrent(m_pDC->GetSafeHdc(),hrc); 

4)具体OpenGL场景的初始化

 

2.CMainFrame类中操作实现全屏显示

(1)准备工作添加成员变量

WINDOWPLACEMENT m_OldWndPlacement;//存储窗口显示的位置等信息

CRect m_rectFullScreen;//保存全屏显示的区域矩形(其实可省去此变量,后面解释)

BOOL m_bFullScreen;//控制全屏的开关变量

 

(2)封装OnFullScreen()函数

一、保存窗口原来的位置等信息

GetWindowPlacement(&m_OldWndPlacement);

二、获得整个窗口的矩形坐标

GetWindowRect(&WindowRect);

三、获得视图客户区的矩形坐标(相对于框架客户区,reposQuery这个参数的作用)

RepositionBars(0,0xffff,AFX_IDW_PANE_FIRST,reposQuery,&ClientRect);

四、将该坐标转化为屏幕坐标系      

ClientToScreen(&ClientRect); 

五、计算屏幕的长和宽

int nFullWidth= GetSystemMetrics(SM_CXSCREEN);

int nFullHeight=GetSystemMetrics(SM_CYSCREEN);

六、计算全屏显示的位置

       m_rectFullScreen.left=WindowRect.left-ClientRect.left-2;

       m_rectFullScreen.top=WindowRect.top-ClientRect.top-2;

       m_rectFullScreen.right=WindowRect.right-ClientRect.right+nFullWidth+2;

       m_rectFullScreen.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight+2;

       m_bFullScreen=TRUE;

七、更新窗口位置

WINDOWPLACEMENT wndpl;

       wndpl.length=sizeof(WINDOWPLACEMENT);

       wndpl.flags=0;

       wndpl.showCmd=SW_SHOWNORMAL;

       wndpl.rcNormalPosition=m_rectFullScreen;

       SetWindowPlacement(&wndpl);

 

补充说明:

其实第二步到第五步都是为第六步做铺垫的,但第六步求出来的值其实是一个定值,也就是说计算出来此值之后,以后的每一个需要全屏显示的程序都可以直接用这个值,从而避免此操作,对应的前面这个变量m_rectFullScreen可以省略,这也是有Windows窗口的固有属性决定的。

这里先给出这个值:

m_rectFullScreen.left=0-10

可以计算出来这个值就是 (边框的宽度左右都一样)(边框)

 

m_rectFullScreen.top=0-76

上面的宽度(菜单栏+标题栏+工具栏+边框)

 

m_rectFullScreen.right=1280+10

 

m_rectFullScreen.bottom=800-76+105

下面的宽度105-76(状态栏+边框)

 

我们可以看到为了达到全屏的效果,其实是不显示标题栏、菜单栏、工具栏、边框,就是原矩形(0,0)(1280,800)进行平移操作即可

 

(3)设置移动的时候全屏的大小不变,重载OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)

设置如下:

lpMMI->ptMaxSize.x=1300;//m_rectFullScreen.Width();

lpMMI->ptMaxSize.y=905;//m_rectFullScreen.Height();

lpMMI->ptMaxPosition.x=0;//m_rectFullScreen.Width();

lpMMI->ptMaxPosition.y=0;//m_rectFullScreen.Height();

      

lpMMI->ptMaxTrackSize.x=1300;//m_rectFullScreen.Width();

lpMMI->ptMaxTrackSize.y=905;//m_rectFullScreen.Height();

重要的是最后两行代码,注意:注释和数字是等价的,就是前面讨论的两种方法

 

(4)退出全屏,封装EndFullScreen()

       if(m_bFullScreen)

       {

              //退出全屏显示, 恢复原窗口显示

              ShowWindow(SW_HIDE);

              SetWindowPlacement(&m_OldWndPlacement);

       }

      

 

 

附件(工程Test2 部分源码):

 

//Test2View.h

 

 

//Test2View.cpp

 

 

//MainFrame.h

 

//MainFrame.cpp

 

 

 

编译运行后结果:

(选择全屏后)

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页