且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

MFC窗体实现 F11全屏切换 2种方法

更新时间:2022-08-13 08:14:08

 


 下面介绍2种方法 实现 F11 全屏切换窗体  ......  

 相关函数  介绍
 RepositionBars(0, AFX_IDW_PANE_FIRST, AFX_IDW_PANE_LAST, reposQuery , &enableClient);   //这个函数重新摆放控件 ,并且根据参数 reposQuery  获得窗体客户区矩形
 MoveWindow  移动窗体
 SetWindowPlacement 设置窗体位置 
 GetWindowPlacement 获得窗体位置信息函数   具体MSDN
 WINDOWPLACEMENT  结构体保存窗体位置信息
 ClientToScreen  客户坐标到屏幕坐标的映射
 GetSystemMetrics(SM_CXSCREEN);
 GetSystemMetrics(SM_CYSCREEN);  获得屏幕宽和高  
 OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)   消息响应函数 设置最窗体追踪高度 


 下面是主要代码  工程我打包传道MSDN  0积分下载   

 
 1.
   在MDI中的 VIEW类 增加   键盘按下响应    
   增加成员变量 BOOL bFullScreen;
   在构造函数中初始化为 FALSE 

 void CF11View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
  
    if(nChar==VK_F11)
 {
       if(this->bFullScreen==FALSE)
    {
                  ((CMainFrame*)AfxGetApp()->m_pMainWnd)->SetFullScreen();   //调用全屏函数
    this->bFullScreen=TRUE;
    }
       else
    {
     ((CMainFrame*)AfxGetApp()->m_pMainWnd)->EndFullScreen();  //退出全屏
     this->bFullScreen=FALSE;
    }
 }

}

2.在 CMainFrame类增加成员 如下
             WINDOWPLACEMENT oldInfo; 


  增加 3个函数 如下


    //设置全屏显示
    void CMainFrame::SetFullScreen()
    {
     int cx  = GetSystemMetrics(SM_CXSCREEN);
 int cy = GetSystemMetrics(SM_CYSCREEN);
    GetWindowPlacement(&oldInfo);  //获得原先窗体的位置信息   
 CRect winRect  ,enableClient;
 GetWindowRect(&winRect); //获得相对于屏幕的窗体的矩形区域
    RepositionBars(0, AFX_IDW_PANE_FIRST, AFX_IDW_PANE_LAST, reposQuery , &enableClient);  //reposQuery这个参数对应后面的CRect对象获取客户区域
 //1:CRect newPos;   //新位置                                                                                        //为了获取可用区域也就是客户区域大小
    RECT newPos;   //新位置
 ClientToScreen(&enableClient); //转换屏幕坐标
 newPos.left=winRect.left-enableClient.left  ;//窗体包括边界 - 内部客户区域  刚好吧边界去掉
 newPos.right=winRect.right-enableClient.right+cx;
 newPos.top=winRect.top-enableClient.top; //顶部也是用客户区域  -窗体  负坐标刚好是便捷的长度
 newPos.bottom=winRect.bottom-enableClient.bottom+cy; //下边框的高度 +  屏幕坐标
 //方法1: MoveWindow(newPos.left,newPos.top,newPos.Width(),newPos.Height());  //最大化
      WINDOWPLACEMENT  wp;
  wp.length=sizeof(WINDOWPLACEMENT);
  wp.flags=0;   //参数 0
  wp.rcNormalPosition=newPos; //新位置
  wp.showCmd=SW_SHOWNORMAL;//正常显示
  ::SetWindowPlacement(this->m_hWnd,&wp); //设置窗体位置 方法2
     }

 

   //退出全屏显示
   void CMainFrame::EndFullScreen()
   {
 SetWindowPlacement(&oldInfo); //恢复原来位置
   }
   


    //这是个消息响应函数 用来设置窗体追踪的最大高度
   void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
  {
       lpMMI->ptMaxTrackSize.y =10000;    //设置最大的窗体追踪高度
 CMDIFrameWnd::OnGetMinMaxInfo(lpMMI);
   }