怎样在单文档工程里创建全屏幕的窗口? 在precreateWindow()里设置窗口style 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CMainFrame *pFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd);pFrame->ModifyStyle(WS_CAPTION,0);pFrame->ModifyStyle(WS_THICKFRAME,0);pFrame->SetMenu(NULL);pFrame->ShowWindow(SW_MAXIMIZE); 你是不是想做成像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);} to:anywn_cwh(我有个问题)这样生成的窗口有一个边框(因为用的是CFrameWnd),怎样让它没有边框呢?to:Kummer(Kummer) 你的回答很好,但我不要这么多功能。我只要一个全屏幕窗口(没有任何牵挂的窗口) 把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,一切搞定 to morningsing(奈何) :非常好!为什么我把最后一句改成Create(winStr,"Title",WS_POPUP,rect,NULL,NULL);就出错呢? 还有rect的大小没有包括任务栏 搞这么麻烦干吗?看下面的:全屏: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? 在CView 的如下函数中写上,就可以一启动就最大化,如果用GetSystemMetrics,就会覆盖下面的状态条void CView::OnInitialUpdate(){ CRect rect; SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0); //得到框架指针 CMainFrame *pFrame=(CMainFrame*)GetParentFrame(); //使得主窗口达到最大可用大小 pFrame->MoveWindow(&rect);} 如果是SDK请用ShowWindow();如果是MFC请修改PreCreateWindow函数传入的CREATESTRUCT& cs的成员。 to Kummer(Kummer):你的方法真的很完美,所以请到http://www.csdn.net/expert/topic/421/421820.shtm领取20分 C or C++? 全局变量出现的奇怪问题 求一个动态导航条界面的方案 dll中类如何测试? 拖动对话框时如何防止其内部的内容闪烁 100分 来者都有 正确结果另送300分 谢谢 怎么把响应节点改变后的TV_ITEM结构保存到一个对话框局部变量内呢?里面有指针,句柄,不能直接用“=” 关于ODBC 2 dll release 编译问题 我找了一个管理系统的整个代码!可是在登陆的时候怎么也登陆不进去? 添加新类的问题 在读数据文件时如何强制性地使程序中断本行数据的读取,接着从下一行开始读取其他数据
pFrame->ModifyStyle(WS_CAPTION,0);
pFrame->ModifyStyle(WS_THICKFRAME,0);
pFrame->SetMenu(NULL);
pFrame->ShowWindow(SW_MAXIMIZE);
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);
}
这样生成的窗口有一个边框(因为用的是CFrameWnd),怎样让它没有边框呢?to:Kummer(Kummer)
你的回答很好,但我不要这么多功能。我只要一个全屏幕窗口(没有任何牵挂的窗口)
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,一切搞定
非常好!为什么我把最后一句改成
Create(winStr,"Title",WS_POPUP,rect,NULL,NULL);
就出错呢?
全屏:
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?
void CView::OnInitialUpdate()
{
CRect rect;
SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);
//得到框架指针
CMainFrame *pFrame=(CMainFrame*)GetParentFrame();
//使得主窗口达到最大可用大小
pFrame->MoveWindow(&rect);
}
如果是MFC请修改PreCreateWindow函数传入的CREATESTRUCT& cs的成员。
你的方法真的很完美,所以请到
http://www.csdn.net/expert/topic/421/421820.shtm
领取20分