关于全屏 - 让我一个头两个大的问题
看着不起眼的问题捣鼓好几天了,烦躁不安,哭笑不得。麻烦各位帮帮忙吧。
程序中有父子窗口,父窗口控制子窗口,间中使之全屏。用SetWindowPos将窗口放至极大,比如说,
hr = m_pModeless->SetWindowPos( NULL, 0-GetSystemMetrics( SM_CXBORDER )-3, 0-GetSystemMetrics( SM_CYCAPTION )-GetSystemMetrics( SM_CYBORDER )-3, lWidth+2*GetSystemMetrics( SM_CXBORDER )+6, lHeight+GetSystemMetrics( SM_CYCAPTION )+2*GetSystemMetrics( SM_CYBORDER )+10, SWP_NOOWNERZORDER );
可窗口确实变大不少,但并非全屏,在自动隐藏taskbar的情况下,窗口下面的框飘浮在距屏幕下方约5mm的地方。明显,这是“一个有些发育不良的全屏显示窗口。”
参考过http://search.csdn.net/expert/topic/50/5001/2002/8/14/938580.htm 和例程,但不知为什么我的程序好像从没获得过WM_GETMINMAXINFO消息 -- OnGetMinMaxInfo似乎从没执行过,PreTranslateMessage也截获不到这一消息。不知道问题在哪里,望请指教。
多谢。
问题点数:100、回复次数:6Top
1 楼aaasng()回复于 2003-12-03 19:08:09 得分 25
SetWindowPos(&wndTopMost, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),SWP_SHOWWINDOW);Top
2 楼adamchao()回复于 2003-12-03 19:17:53 得分 25
你用一下ShowWindow(SW_SHOWMAXIMIZED);试一下,也许管用Top
3 楼yanf_99()回复于 2003-12-04 10:05:15 得分 0
谢了,不过因为我所要的全屏是没有title bar也没有边框的,所以楼上好像不大适用。还有没有其他意见呢?Top
4 楼wangjinwang(王者之疯)回复于 2003-12-04 10:23:44 得分 50
这是一个比较完整的实现说明(当然要例子也有)
例子:
视图:http://www.yangning.com/cgi-bin/topic.cgi?forum=1&topic=23
对话框:http://www.yangning.com/cgi-bin/topic.cgi?forum=1&topic=93
说明:
1
// 定义三个全局或CMainFrame成员变量
WINDOWPLACEMENT m_OldWndPlacement;// 用来保存原窗口位置
BOOL m_bFullScreen; // 全屏显示标志
CRect m_FullScreenRect; // 表示全屏显示时的窗口位置
2
// 定义全屏显示函数
void CMainFrame::OnFullScreen()
{
// 设置控制条位置
CRect ClientRect;
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
// 获取屏幕的分辨率
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
// 获取窗口区域和客户区域(以便计算客户区域外的尺寸)
CRect WindowRect;
GetWindowRect(&WindowRect);
ClientToScreen(&ClientRect);
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 ;
// 取得并记录窗口当前位置
GetWindowPlacement(&m_OldWndPlacement);
// 设置全屏显示标志为TRUE并进入全屏显示状态
m_bFullScreen=TRUE;
WINDOWPLACEMENT wndpl;
wndpl.length=sizeof(WINDOWPLACEMENT);
wndpl.flags=0;
wndpl.showCmd=SW_SHOWNORMAL;
wndpl.rcNormalPosition=m_FullScreenRect;
SetWindowPlacement(&wndpl);
}
3
// 结束全屏显示
void CMainFrame::EndFullScreen()
{
ShowWindow(SW_HIDE);
SetWindowPlacement(&m_OldWndPlacement);
}
4
// 添加对消息WM_GETMINMAXINFO的处理函数及代码
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);
}
Top
5 楼yanf_99()回复于 2003-12-04 10:34:22 得分 0
谢谢。我的问题是,我好像从来都截获不到WM_GETMINMAXINFO消息。Top
6 楼yanf_99()回复于 2003-12-04 14:44:23 得分 0
原来是自己粗心。。。 忘了ON_WM_GETMINMAXINFO()。谢谢各位,接分吧。Top




