如何实现这种风格的全屏?

microyzy 2007-03-26 05:35:39
严格来说不是全屏,而是在保留标题栏、菜单等区域下,实现窗口的最大化,但是如果任务栏不是自动隐藏,窗口就无法盖住任务栏,因此想问问,有没有什么方法,可以让窗口最大化时盖住任务栏

ps:在任务栏不是自动隐藏的前提下
...全文
380 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
icxiaojiang 2012-06-10
  • 打赏
  • 举报
回复
如果要实现真正全屏可以保存窗口风格,然后去掉边框滚动条
m_WndStyle=GetWindowLong(hWnd,GWL_STYLE); //保存当前窗口的风格
m_FullStyle=m_WndStyle&(~(WS_DLGFRAME|WS_THICKFRAME|WS_BORDER|WS_VSCROLL|WS_HSCROLL));//去除所有边框和滚动条
SetWindowLong(hWnd,GWL_STYLE,m_FullStyle); //设置全屏窗口风格

即出时记得加上恢复窗口风格
SetWindowLong(hWnd,GWL_STYLE,m_WndStyle); //恢复上一次保存的窗口风格
icxiaojiang 2012-06-10
  • 打赏
  • 举报
回复
//全屏显示
void FullScreen(HWND hWnd){
GetWindowRect(hWnd,&m_OldWndRect);//保存当前窗口的屏幕位置
//获取屏幕分辨率
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);//以像素为单位计算的屏幕尺寸
m_FullScreenRect.left=0; //可以微量-1
m_FullScreenRect.top=0;
m_FullScreenRect.right=nFullWidth; //可以微量加1~3
m_FullScreenRect.bottom=nFullHeight;
//重新放置窗口到所有最顶层窗口之上包括任务栏窗口并发送窗口框架改变消息
SetWindowPos(hWnd,HWND_TOPMOST,m_FullScreenRect.left,m_FullScreenRect.top,
m_FullScreenRect.right,m_FullScreenRect.bottom,SWP_FRAMECHANGED);
}

//退出全屏显示
void ExitFullScreen(HWND hWnd){
//恢复上一次窗口的大小和屏幕的位置并重新放置显示
SetWindowPos(hWnd,HWND_TOPMOST,m_OldWndRect.left,m_OldWndRect.top,m_OldWndRect.right-m_OldWndRect.left,m_OldWndRect.bottom-m_OldWndRect.top,SWP_FRAMECHANGED);
}
菜牛 2007-03-27
  • 打赏
  • 举报
回复
AfxGetMainWnd()->SetWindowPos(&wndTopMost, 0, 0, ::GetSystemMetrics(SM_CXSCREEN), ::GetSystemMetrics(SM_CYSCREEN), 0);
菜牛 2007-03-27
  • 打赏
  • 举报
回复
我试过的,可以。你说清楚在哪里、怎么调用我给你的代码?
dazedase 2007-03-27
  • 打赏
  • 举报
回复
我知道了,你的任务栏肯定是设置了显示在最上面的
任务栏在点Win键是会出来,不过当点了全屏的对话框的标题栏后又可以盖住任务栏了
我刚试过
microyzy 2007-03-27
  • 打赏
  • 举报
回复
Mackz的方法早试过了阿,盖不住任务栏的
dazedase 2007-03-27
  • 打赏
  • 举报
回复
同意Mackz的方法,我经常这么做
ringphone 2007-03-27
  • 打赏
  • 举报
回复
得到包括任务栏在内的全屏尺寸:
SystemParametersInfo(SPI_GETWORKAREA,0,(LPRECT)$rc,0);
rc就是能盖住任务栏的尺寸,按这个尺寸设置窗口大小就可以了。
jonezheng 2007-03-27
  • 打赏
  • 举报
回复
void CXXDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
if (nType == SIZE_MAXIMIZED)
{
SetWindowPos(&wndTopMost, 0, 0,
GetSystemMetrics(SM_CXSCREEN)-1,GetSystemMetrics(SM_CYSCREEN), 0);
}
}
记得不要设置成 GetSystemMetrics(SM_CXSCREEN),与它有一点小差别就OK了.
microyzy 2007-03-27
  • 打赏
  • 举报
回复
双击标题,还是会最大化的,而且窗口那样就没法还原了~~
dazedase 2007-03-27
  • 打赏
  • 举报
回复
这样不知行否?

void CXXX::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}

if (nID == SC_MAXIMIZE)//最大化
{
SetWindowPos(&wndTopMost, 0, 0, ::GetSystemMetrics(SM_CXSCREEN), ::GetSystemMetrics(SM_CYSCREEN), 0);
}

if (nID == SC_MINIMIZE)//最大化
{
.....
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
microyzy 2007-03-27
  • 打赏
  • 举报
回复
另外,SetWindowPos的代码如果在WM_SIZE里处理最大化时执行,则无法盖住任务栏。。。写了这么久,被个小问题困住了,向各位讨教:(

这个需求有一个最终方案是可以实现的,就是彻底去掉标题栏,用全屏的方式,自己再模拟一个标题栏,但是软件的工具栏很多,修改起来涉及的代码比较多,现在想看看通过一些简单的方法能不能实现,呵呵
microyzy 2007-03-27
  • 打赏
  • 举报
回复
噢,是我开头没说清楚,下面是我们软件的一个需求,当界面最大化时,要求尽可能的利用屏幕空间,现在最后的问题就是,如果任务栏是固定显示的,最好能够盖住任务栏,开头的处理方法类似Mackz说的(在按钮里执行),但是这种方法有一个问题,窗口虽然达到了显示效果,但是标题栏上的“最大化”按钮还在(窗口实际上不是处于最大化状态),如果你继续点最大化,窗口就会缩小(成为真正的最大化状态),我们找了半天,不知道怎么修改这个状态(修改为“向下还原”),因此这个方法暂时行不通。
第二种方法是上面说到的修改任务栏的自动隐藏属性,窗口只是直接最大化而已,但是来回切换自动隐藏属性,windows使用的时间太多了,界面反应达不到性能要求:(
YangAnShun 2007-03-26
  • 打赏
  • 举报
回复
用SHOWWINDOW不就可以咯吗?
microyzy 2007-03-26
  • 打赏
  • 举报
回复
另外,修改任务栏的自动隐藏属性,可以实现:
APPBARDATA stPa ;
memset(&stPa, 0, sizeof(APPBARDATA));
stPa.cbSize = sizeof(APPBARDATA);
stPa.hWnd = ::FindWindow("Shell_TrayWnd",0);
stPa.lParam = ABS_AUTOHIDE;
SHAppBarMessage(ABM_SETSTATE, &stPa);

但是这种方法有一点停滞,显得程序很不流畅,不知道还有什么好方法,大虾们赐教撒~~
microyzy 2007-03-26
  • 打赏
  • 举报
回复
兄弟,看清楚点撒,俺专门提到了:保留标题栏和菜单条,白高兴了:(
miaoshengwu 2007-03-26
  • 打赏
  • 举报
回复
参考下,呵呵......

int cx, cy;
HDC dc = ::GetDC(NULL);
cx = GetDeviceCaps(dc,HORZRES) + GetSystemMetrics(SM_CXBORDER);
cy = GetDeviceCaps(dc,VERTRES) + GetSystemMetrics(SM_CYBORDER);
::ReleaseDC(0,dc);

//去除标题和边框
SetWindowLong(m_hWnd, GWL_STYLE,GetWindowLong(m_hWnd, GWL_STYLE) &
(~(WS_CAPTION | WS_BORDER)));

// 置对话框为最顶端并扩充到整个屏幕
::SetWindowPos(m_hWnd, HWND_TOPMOST, -(GetSystemMetrics(SM_CXBORDER)+2),
-(GetSystemMetrics(SM_CYBORDER)+2), cx+5,cy+5, SWP_NOZORDER);

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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