怎样在单文档工程里创建全屏幕的窗口?
没有标题栏的那种 问题点数:30、回复次数:14Top
1 楼morningsing(奈何)回复于 2001-12-13 11:50:07 得分 0
在precreateWindow()里设置窗口styleTop
2 楼anywn_cwh(我有个问题)回复于 2001-12-13 11:56:52 得分 5
CMainFrame *pFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd);
pFrame->ModifyStyle(WS_CAPTION,0);
pFrame->ModifyStyle(WS_THICKFRAME,0);
pFrame->SetMenu(NULL);
pFrame->ShowWindow(SW_MAXIMIZE);Top
3 楼Kummer(Kummer)回复于 2001-12-13 12:15:33 得分 5
你是不是想做成像VC全屏的那种效果加入成员变量记录下一些全屏相关的信息
CRect m_FullScreenRect;
WINDOWPLACEMENT m_OldWndPlacement;
BOOL m_bFullScreen;
1.在CMainFrame中加入一个OnFullScreen函数
void CMainFrame::OnViewFullscreen()
{
if(!m_bFullScreen)
{
//保存原窗口的位置,
//包括和其他窗口的前后位置关系
GetWindowPlacement(&m_OldWndPlacement);
//保存原窗口的矩形范围
CRect WindowRect;
GetWindowRect(&WindowRect);
CRect ClientRect;
//获得除去所有控制条之外的客户区位置
//并把它转化为Screen坐标
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)两个点外扩充原窗口和除控制条之外的 客
//户区位置间的差值, 就得到全屏显示的窗口位置
//实际上,现在窗口的位置是在左边定点在负数位置,
//而右边的点在屏幕以下,这样,正好View占有了整个屏幕
m_FullScreenRect.left=WindowRect.left-ClientRect.left;
m_FullScreenRect.top=WindowRect.top-ClientRect.top;
m_FullScreenRect.right=WindowRect.right+nFullWidth-ClientRect.right;
m_FullScreenRect.bottom=WindowRect.bottom+nFullHeight-ClientRect.bottom;
m_bFullScreen=TRUE;//设置全屏显示标志为 TRUE
//进入全屏显示状态
WINDOWPLACEMENT wndpl;
wndpl.length=sizeof(WINDOWPLACEMENT);
wndpl.flags=0;
wndpl.showCmd=SW_SHOWNORMAL;
wndpl.rcNormalPosition=m_FullScreenRect;
SetWindowPlacement(&wndpl);
m_bFullScreen=true;
}
}
2。加入一个结束全屏的函数
void CMainFrame::EndFullScreen()
{
if(m_bFullScreen)
{
BOOL res=ShowWindow(SW_RESTORE);
SetWindowPlacement(&m_OldWndPlacement);
m_bFullScreen=false;
}
}
3。重载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);
}
Top
4 楼emmai(WaTaXiWaWaTaXi)回复于 2001-12-13 13:15:46 得分 0
to:anywn_cwh(我有个问题)
这样生成的窗口有一个边框(因为用的是CFrameWnd),怎样让它没有边框呢?
to:Kummer(Kummer)
你的回答很好,但我不要这么多功能。我只要一个全屏幕窗口(没有任何牵挂的窗口)Top
5 楼morningsing(奈何)回复于 2001-12-13 14:13:03 得分 10
把CMainFrame的基类改成CWnd,并在构造函数种子基础侧窗口类:
CMainFrame::CMainFrame()
{
CString winStr = AfxRegisterWndClass( CS_DBLCLKS,
AfxGetApp()->LoadStandardCursor(IDC_ARROW),
(HBRUSH)GetStockObject(BLACK_BRUSH),
NULL );
CRect rect( 0, 0, GetSystemMetrics( SM_CXSCREEN ),
GetSystemMetrics( SM_CYSRREEN ) );
::CreateEx( 0, winStr, "Title", WS_POPUP, rect, NULL, NULL );
}
OK,一切搞定 Top
6 楼emmai(WaTaXiWaWaTaXi)回复于 2001-12-13 14:24:17 得分 0
to morningsing(奈何) :
非常好!为什么我把最后一句改成
Create(winStr,"Title",WS_POPUP,rect,NULL,NULL);
就出错呢?Top
7 楼emmai(WaTaXiWaWaTaXi)回复于 2001-12-13 14:30:15 得分 0
还有rect的大小没有包括任务栏Top
8 楼sam1111(化神奇为腐朽)回复于 2001-12-13 14:55:31 得分 5
搞这么麻烦干吗?看下面的:
全屏:
void CMainFrame::OnFullScreen(int nWndID)
{
GetWindowRect(&m_WndRect);
m_lWndStyle = GetWindowLong(GetSafeHwnd(), GWL_STYLE);
LONG tmpStyle = m_lWndStyle & ~WS_OVERLAPPEDWINDOW;
SetWindowLong(GetSafeHwnd(), GWL_STYLE, tmpStyle);
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(&wndTopMost, -1, -1, cx + 1, cy + 1, SWP_FRAMECHANGED);
}
恢复:
void CMainFrame::OnRestoreWnd()
{
SetWindowLong(GetSafeHwnd(), GWL_STYLE, m_lWndStyle);
SetWindowPos(&wndNoTopMost,
m_WndRect.left, m_WndRect.top,
m_WndRect.right - m_WndRect.left,
m_WndRect.bottom - m_WndRect.top,
SWP_FRAMECHANGED);
}
ok?Top
9 楼darkbb(小虫)回复于 2001-12-13 14:58:00 得分 0
关注!Top
10 楼Julienjut(秋水)回复于 2001-12-13 15:14:32 得分 5
在CView 的如下函数中写上,就可以一启动就最大化,如果用GetSystemMetrics,就会覆盖下面的状态条
void CView::OnInitialUpdate()
{
CRect rect;
SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);
//得到框架指针
CMainFrame *pFrame=(CMainFrame*)GetParentFrame();
//使得主窗口达到最大可用大小
pFrame->MoveWindow(&rect);
}Top
11 楼emmai(WaTaXiWaWaTaXi)回复于 2001-12-13 15:21:06 得分 0
方法真是多种多样,给分都成了问题,我想看看有没有更多的解答Top
12 楼xiaoxiaohan(萧晓寒)回复于 2001-12-13 15:51:50 得分 0
如果是SDK请用ShowWindow();
如果是MFC请修改PreCreateWindow函数传入的CREATESTRUCT& cs的成员。Top
13 楼Kummer(Kummer)回复于 2001-12-14 14:34:22 得分 0
不公平,我的方法可以动态的全屏和退出全屏,而不是把代码写死在程序中Top
14 楼emmai(WaTaXiWaWaTaXi)回复于 2001-12-14 17:00:46 得分 0
to Kummer(Kummer):
你的方法真的很完美,所以请到
http://www.csdn.net/expert/topic/421/421820.shtm
领取20分Top




