在主窗口中创建一个CDailog子窗口(如有特殊处理,可以继承一个类,写相关函数),把它作为显示窗口,要全屏,只需将其最大化就可以搞定(还可以设置其为TopMost Wnd)。Doc-View方式和第Dialog Base 方式都可以。
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或编辑对话框等资源时,选择菜单“ViewFull Screen”,即可进入全屏显示状态,按“Esc”键后会退出全屏显示状态。在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面将先讨论点击菜单项“ViewFull Screen”实现全屏显示的方法,再讲述按“Esc”键后如何退出全屏显示状态。
1) 在CMainFrame类中,增加如下三个成员变量。
Class CMainFrame : public CFrameWnd
{ private: //自己添加的三个成员变量
WINDOWPLACEMENT m_OldWndPlacement//用来保存原窗口位置
BOOL m_bFullScreen//全屏显示标志
Crect m_FullScreenRect//表示全屏显示时的窗口位置
protected: CMainFrame()
DECLARE_DYNCREATE(CMainFrame)}
2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Full Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其ID值也设置为ID_FULL_SCREEN。
3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的响应函数。响应函数如下:
void CMainFrame::OnFullScreen()
{ GetWindowPlacement(&m_OldWndPlacement)
Crect WindowRect
GetWindowRect(&WindowRect)
Crect ClientRect
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect)
ClientToScreen(&ClientRect)
// 获取屏幕的分辨率
int nFullWidth=GetSystemMetrics(SM_CXSCREEN)
int nFullHeight=GetSystemMetrics(SM_CYSCREEN)
//将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域, //将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区位置间的差值, 就得到全屏显示的窗口位置
m_FullScreenRect.left = WindowRect.left-ClientRect.left
m_FullScreenRect.top = WindowRect.top-ClientRect.top
m_FullScreenRect.right = WindowRect.right-ClientRect.right+nFullWidth
m_FullScreenRect.bottom = WindowRect.bottom-ClientRect.bottom+nFullHeight
m_bFullScreen = TRUE// 设置全屏显示标志为 TRUE
// 进入全屏显示状态
WINDOWPLACEMENT wndpl
wndpl.length=sizeof(WINDOWPLACEMENT)
wndpl.flags=0
wndpl.showCmd=SW_SHOWNORMAL
wndpl.rcNormalPosition=m_FullScreenRect
SetWindowPlacement(&wndpl)}
4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置信息。
Void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{ if(m_bFullScreen)
{ lpMMI->ptMaxSize.x=m_FullScreenRect.Width()
lpMMI->ptMaxSize.y=m_FullScreenRect.Height()
lpMMI->ptMaxPosition.x=m_FullScreenRect.Width()
lpMMI->ptMaxPosition.y=m_FullScreenRect.Height()
// 最大的Track尺寸也要改变
lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width()
lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height()
} CFrameWnd::OnGetMinMaxInfo(lpMMI)
}完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“ViewFull Screen”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全屏显示状态的 *** 作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。
1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function…”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的 *** 作。
Void CMainFrame::EndFullScreen()
{ if(m_bFullScreen)
{ //退出全屏显示, 恢复原窗口显示
ShowWindow(SW_HIDE)
SetWindowPlacement(&m_OldWndPlacement)}}
2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullScreen,便可退出全屏显示状态。
Void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{ if(nChar==VK_ESCAPE) // 如果按的键为Esc键
{// 获取主框架窗口的指针
CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd
// 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态
pFrame->EndFullScreen()}
Cview::OnKeyDown(nChar, nRepCnt, nFlags)}
这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增色不少。
主机上另外再连接一个监视器,这样主机就可以检测到两个显示器,设置显示器属性,将屏幕扩展到第二屏(采用扩展模式)。在VC编程时,可以检测到第二屏的信息(甚至多屏),比如屏的个数,各个屏的分辨率,各个屏的句柄,获得了这些信息后,就可以在第二屏上 *** 作了,比如画图之类。在编程中要用到相关的结构体和函数,这些都已经包装好,在multimom.h头文件中,该头文件VC自带有。在要用的的地方包含该头文件,注意在包含前面要加上一句宏定义:
#define COMPILE_MULTIMON_STUBS
几个重要的结构体和函数
EnumDisplayMonitors( ) 该函数对当前用户系统中所包含的显示器进行枚举。应用程序就是通过与该函数交流得知,当前用户系统中
所拥有的显示器个数以及其名称。
MonitorInfoex 和MonitorInfo 。在这两个结构中保存着相应显示器的相关信息,如坐标、是否为主显示器等。
GetMonitorInfo ( ) 取得指定显示器的相关信息,如物理显示区大小等。
MonitorFromPoint ( ) 取得指定点所在的显示器句柄。
MonitorFromRect ( ) 取得指定矩形所在的显示器句柄。
MonitorFromWindow( ) 取得指定窗口所在的显示器句柄
MonitorEnumProc( ) 。当应用程序调用EnumDisplayMonitors ( )查询显示器个数时,系统自动为每一个显示器调用一次该函数。应用程序可以依此判断显示器的个数、位置及显示区域的大小等信息。
编程实现,获得第二屏信息,在主屏上点击一按钮,在第二屏上显示一幅图像。
在应用程序初始化时,调用EnumDisplayMonitors(NULL,NULL,MonitorEnumProc,0),该函数枚举显示器,得到显示器信息,方便以后调用。其中MonitorEnumProc,是一回调函数,这个回调函数是要自己写的
/*********************************************************
函数名:MonitorEnumProc()
输入参数:HMONITOR hMonitor ---显示器句柄
HDC hdcMonitor ----显示器DC句柄
LPRECT lprcMonitor-----
LPARAM dwData-----EnumDisplayMonitors传来的数据
返回:bool
功能:若返回为真,EnumDisplayMonitors继续枚举,
若返回为假,EnumDisplayMonitors停止枚举,从而获得显示器信息
将显示器个数保存在numScreen,分辨率信息保存在rect
**********************************************************/
BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor,
HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{
static BOOL first = TRUE //标志
//保存显示器信息
MONITORINFO monitorinfo
monitorinfo.cbSize = sizeof(MONITORINFO)
//获得显示器信息,将信息保存到monitorinfo中
GetMonitorInfo(hMonitor, &monitorinfo)
//若检测到主屏
if(monitorinfo.dwFlags == MONITORINFOF_PRIMARY)
{
if(first) //第一次检测到主屏
{
first = FALSE
numScreen = 1
//将显示器的分辨率信息保存到rect
rect[0] = monitorinfo.rcMonitor
return TRUE
}
else //第二次检测到主屏,说明所有的监视器都已经检测了一遍,故可以停止检测了
{
first = TRUE //标志复位
return FALSE //结束检测
}
}
rect[numScreen] = monitorinfo.rcMonitor
numScreen++
return TRUE
}
创建对话框,通过MoveWindow 函数将对话框移动到第二屏上即可
if(numScreen == 2)
{
CSecondScr *pDlg = new CSecondScr
pDlg->Create (IDD_DIALOG1,this)
pDlg->ShowWindow (SW_SHOW)
pDlg->MoveWindow (rect[1].left ,rect[1].top ,rect[1].Width (),rect[1].Height (),TRUE)
}
点击阅读全文
打开CSDN,阅读体验更佳
最新发布 MFC Windows 程序设计[六十]之窗口分屏(附源码)
MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。
继续访问
VC++双屏显示源码
双屏显示源代码,是双屏编程人员必不可少的参考代码,可实现扩展模式、克隆模式。
mfc多屏检测及双击窗口最大化
在OnInitDialog函数中添加:EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, NULL)MonitorEnumProc函数:CArray <MONITORINFO, MONITORINFO&>g_arMonitorInfoBOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor...
继续访问
VC++在MFC程序窗口中实现全屏显示切换
内容索引:VC/C++源码,界面编程,全屏VC++在MFC程序窗口中实现全屏显示切换,有点像微软PPT幻灯片播放中的全屏效果。在VC++的MFC程序中,有一个专一用来切换全屏的按钮,点击这个按钮,程序的主界面将全屏,标题栏、任务栏、菜单栏统统隐藏掉了,只显示主要内容及一个返回标准窗体的按钮,MFC模式的全屏切换,是不是有必要学习一下呢?
窗口移动到扩展屏(简单 *** 作)
这是一个简单的窗口移动到扩展屏的代码,主要实现了:1.扩展屏的分辨率大小测定 2. 主屏上的程序窗口移动到扩展屏上并全屏显示
基于MFC的屏幕分屏.rar
基于VC++ 的屏幕分屏显示工具
MFC双屏显示
//一、为工程添加一个类Spxs,在Spxs.h中添加 public: afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)//二、主cpp里添加: #include"Spxs.h" Spxs dlg1 //初始化函数里添加: dlg1.Create(IDD_TEST_111,GetDesktopWi
继续访问
VC对话框全屏显示及相应控件位置改变(转)
一、简单对话框全屏显示方法 在OnInitDialog()中任意加入: 1、ModifyStyle(WS_CAPTION,0,0)//如果不想去掉标题栏,去掉该句。 SendMessage(WM_SYSCOMMAND,SC_MAXIMIZE,0)2、ShowWindow(SW_SHOWMAXIMIZED)二、复杂一点的对话框全屏显示方法,随屏幕的分辩率而调节 ...
继续访问
热门推荐 VC++实现Windows中双显示器(主屏、扩展屏)各种 *** 作的源码工程
Windows中鼠标右键桌面->“屏幕分辨率”时出现的“更改显示器的外观”对话框下实现了双屏 *** 作的诸多功能,如:主屏的设置、主屏和扩展屏的分辨率、方向、屏幕合并等。实际项目中需要通过VC++代码实现这些功能,用了将近一周的事件,在网上经过几番搜索、整合及改写,终于开发出了所需功能。以下将cpp源码贴出,以弥补此方面网上资料的匮乏。完整工程见下载资源(VS2010下开发)。 // Multi_
继续访问
MFC 获取屏幕客户区(及显示器大小)
CRect rectWorkAreaSystemParametersInfo(SPI_GETWORKAREA,0,&rectWorkArea,SPIF_SENDCHANGE)//获取屏幕客户区大小 转载于:https://www.cnblogs.com/kingbin/p/4040179.html
继续访问
MFC 多屏显示
概念 HMONITOR : 显示器句柄. 有效的显示器,该值不为空. 当WM_DISPLAYCHANGE 心消息发送的时候, 任何小时起都有可能被移除, 所以应用程序时刻检查全部的HMONITORS是否为非空. 函数 EnumDisplayMonitors: 该函数对当前用户系统中所包含的显示器进行枚举. 示例 在自己的函数中: void Fun...
继续访问
MFC程序多屏最大化问题
单个显示屏下如果我们需要最大化窗口的时候我们如果直接调用 ShowWindow(SW_MAXIMIZE)//最大化show窗口 但是存在会遮挡Windows的标题栏这个时候我们可以用Windows给我们提供的方法 CRect rcWorkAreaSystemParametersInfo(SPI_GETWORKAREA,0,&rcWorkArea,0)//获取工作区域的大小 MoveWindow(&rcWorkArea)OnNcPaint()这样可
继续访问
MFC简单多屏 *** 作
简易的MFC下处理双屏 可以获得屏幕分辨率 主次屏信息 双击主对话框会在另一屏幕上d出一个全屏的新窗口
mfc在控制多显示器的使用方法
一、取得显示器的个数 GetSystemMetrics(SM_CMONITORS)二、根据窗口句柄、矩形区域、点取得显示器的句柄 MonitorFromRect( lprc, MONITOR_DEFAULTTONULL ) MonitorFromPoint( pt, MONITOR_DEFAULTTONULL ) MonitorFromWindow( pWnd->GetSafe...
继续访问
MFC
双屏
写评论
评论
6
2
踩
分享
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)