如何将视图全屏显示

dzy198239 2010-04-29 11:08:03
我建立了一个单文档MFC应用程序,为了将视图全屏显示,我去掉了标题、菜单、工具栏、状态栏和边框。代码如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
..........//省略
ModifyStyle(WS_CAPTION,0); //去掉标题栏
ModifyStyle(WS_THICKFRAME,0);//去掉边框
SetMenu(NULL); //去掉菜单
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
//以下为设置全屏显示
cs.x=cs.y=0;
cs.cx=GetSystemMetrics(SM_CXSCREEN);
cs.cy=GetSystemMetrics(SM_CYSCREEN);

return TRUE;
}

运行程序后,发现视图的边界仍有两个像素宽的区域,该区域无法响应WM_MOUSEMOVE消息,同时该区域无法绘图,我觉得该区域不是客户区。我现在希望,全屏幕都可以绘图,可以设置背景颜色,请各位高手指点一下,Thank you very much!
...全文
507 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
dzy198239 2010-05-11
  • 打赏
  • 举报
回复
哈哈,不好意思,我上面发的代码错了,应该为
MoveWindow(-2,-2,GetSystemMetrics(SM_CXSCREEN)+4,GetSystemMetrics(SM_CYSCREEN)+4);
dzy198239 2010-05-11
  • 打赏
  • 举报
回复
现在又发现了更简单的方法直接一条语句搞定,哈哈
MoveWindow(-2,-2,GetSystemMetrics(SM_CXSCREEN)+2,GetSystemMetrics(SM_CYSCREEN)+2);
好了,要结贴了。
郑大钱 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dzy198239 的回复:]
谢谢各位,问题解决了。仅仅使用各位所提供的代码还是不行,我在这些代码的基础上作了一些修改,现在我把代码贴出来希望对被该问题困扰的程序员有所帮助:

在函数int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中将生成工具栏和状态栏的代码删去,同时添加如下代码:
ModifyStyle(WS_CAPTION,0); //需要去掉标题栏……
[/Quote]

用过~
luocw110 2010-05-04
  • 打赏
  • 举报
回复
路过 学习
dzy198239 2010-05-04
  • 打赏
  • 举报
回复
谢谢各位,问题解决了。仅仅使用各位所提供的代码还是不行,我在这些代码的基础上作了一些修改,现在我把代码贴出来希望对被该问题困扰的程序员有所帮助:

在函数int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中将生成工具栏和状态栏的代码删去,同时添加如下代码:
ModifyStyle(WS_CAPTION,0); //需要去掉标题栏。
ModifyStyle(WS_THICKFRAME,0);//去掉四周的小框架
SetMenu(NULL);//去掉菜单栏
CRect WindowRect;
GetWindowRect(&WindowRect);
CRect ClientRect;
//RepositionBars(0,0xffff,AFX_IDW_PANE_FIRST,reposQuery,&ClientRect);
GetClientRect(&ClientRect);
ClientToScreen(&ClientRect);

int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
m_FullScreenRect.left=WindowRect.left-ClientRect.left-2;
m_FullScreenRect.top=WindowRect.top-ClientRect.top-2;
m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth+2;
m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight+2;
m_FullScreen=TRUE;

WINDOWPLACEMENT wndpl;
wndpl.length=sizeof(WINDOWPLACEMENT);
wndpl.flags=0;
wndpl.showCmd=SW_SHOWNORMAL;
wndpl.rcNormalPosition=m_FullScreenRect;
ShowWindow(SW_SHOW);
SetWindowPlacement(&wndpl);
在此要特别感谢VisualEleven和yincheng01两位。
dzy198239 2010-04-30
  • 打赏
  • 举报
回复
谢谢各位的热情帮助。我试试你们提供的代码。
Eleven 2010-04-30
  • 打赏
  • 举报
回复
WINDOWPLACEMENT m_OldWndPlacement;
CRect m_FullScreenRect;
BOOL m_FullScreen;

void CMainFrame::FullScreenShow()
{
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);
m_FullScreenRect.left=WindowRect.left-ClientRect.left-1;
m_FullScreenRect.top=WindowRect.top-ClientRect.top-1;
m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth+2;
m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight+2;
m_FullScreen=TRUE;

WINDOWPLACEMENT wndpl;
wndpl.length=sizeof(WINDOWPLACEMENT);
wndpl.flags=0;
wndpl.showCmd=SW_SHOWNORMAL;
wndpl.rcNormalPosition=m_FullScreenRect;

ShowWindow(SW_HIDE);
SetWindowPlacement(&wndpl);
}

void CMainFrame::EndFullScreen()
{
m_FullScreen=FALSE;
ShowWindow(SW_HIDE);
SetWindowPlacement(&m_OldWndPlacement);
}
dzy198239 2010-04-30
  • 打赏
  • 举报
回复
我按照各位的代码试了试,我发现边界处的像素依然无法用OnDraw来进行绘图。例如执行如下代码:
pDC->MoveTo(0,0);
pDC->LineTo(0,500);
绘制的直线并没有在屏幕的左边,而是绘制在了屏幕的第3个像素处,即屏幕最左边的两个像素不能被绘制。不知道这是为什么,很郁闷呀!
littlefangMFC 2010-04-29
  • 打赏
  • 举报
回复
发现视图的边界仍有两个像素宽的区域是什么意思,显示有东西还是显示正常就是无法响应MOUSEMOVE消息啊?
尹成 2010-04-29
  • 打赏
  • 举报
回复
我是全屏的代码

void CMainFrame::OnViewFullScreen()
{
RECT rectDesktop;
WINDOWPLACEMENT wpNew;

if (!IsFullScreen())
{
// need to hide all status bars
//m_wndStatusBar.ShowWindow(SW_HIDE);
//m_wndToolBar.ShowWindow(SW_HIDE);

if(m_wndStatusBar!=NULL) delete m_wndStatusBar;
if(m_wndToolBar!=NULL) delete m_wndToolBar;
this->UpdateWindow();
// We'll need these to restore the original state.
GetWindowPlacement (&m_wpPrev);
m_wpPrev.length = sizeof m_wpPrev;

//Adjust RECT to new size of window
::GetWindowRect ( ::GetDesktopWindow(), &rectDesktop );
::AdjustWindowRectEx(&rectDesktop, GetStyle(), TRUE, GetExStyle());

// Remember this for OnGetMinMaxInfo()
m_FullScreenWindowRect = rectDesktop;

wpNew = m_wpPrev;
wpNew.showCmd = SW_SHOWNORMAL;
wpNew.rcNormalPosition = rectDesktop;

m_pwndFullScrnBar=new CToolBar;

if (!m_pwndFullScrnBar->Create(this,CBRS_SIZE_DYNAMIC|CBRS_FLOATING) ||
!m_pwndFullScrnBar->LoadToolBar(IDR_FULLSCREEN))
{
TRACE0("Failed to create toolbar\n");
return; // fail to create
}

//don't allow the toolbar to dock
m_pwndFullScrnBar->EnableDocking(0);
m_pwndFullScrnBar->SetWindowPos(0, 100,100, 0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_SHOWWINDOW);
m_pwndFullScrnBar->SetWindowText(_T("Full Screen"));
FloatControlBar(m_pwndFullScrnBar, CPoint(100,100));
m_bFullScreen=TRUE;
}
else
{
m_pwndFullScrnBar->DestroyWindow();
delete m_pwndFullScrnBar;
m_wndToolBar=new CToolBar;
m_wndStatusBar=new CStatusBar;
if (!m_wndToolBar->Create(this) ||
!m_wndToolBar->LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return;
}

if (!m_wndStatusBar->Create(this) ||
!m_wndStatusBar->SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return ; // fail to create
}

// TODO: Remove this if you don't want tool tips or a resizeable toolbar
m_wndToolBar->SetBarStyle(m_wndToolBar->GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar->EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(m_wndToolBar);
m_bFullScreen=FALSE;

// m_wndStatusBar->ShowWindow(SW_SHOWNORMAL);
// m_wndToolBar->ShowWindow(SW_SHOWNORMAL);
wpNew = m_wpPrev;
}

SetWindowPlacement ( &wpNew );

}

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
if (IsFullScreen())
{
lpMMI->ptMaxSize.y = m_FullScreenWindowRect.Height();
lpMMI->ptMaxTrackSize.y = lpMMI->ptMaxSize.y;
lpMMI->ptMaxSize.x = m_FullScreenWindowRect.Width();
lpMMI->ptMaxTrackSize.x = lpMMI->ptMaxSize.x;
}

}

BOOL CMainFrame::IsFullScreen()
{
return m_bFullScreen;
}

void CMainFrame::OnUpdateViewFullScreen(CCmdUI* pCmdUI)
{
pCmdUI->Enable();
if (IsFullScreen())
pCmdUI->SetCheck();
else
pCmdUI->SetCheck(0);

}

Eleven 2010-04-29
  • 打赏
  • 举报
回复
spaceoflove 2010-04-29
  • 打赏
  • 举报
回复
当然不是客户去啦!楼主的问题很典型,这其实是一个微软windows窗口的问题,是窗口就要有窗口区,通过扩大客户去是不能够进行全屏显示的,楼主可以查查全屏技术是如何实现的~~~~~希望对你有帮助!!!
尹成 2010-04-29
  • 打赏
  • 举报
回复
帖子都沉底了,帮楼主顶下

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧