如何实现这种风格的全屏? 严格来说不是全屏,而是在保留标题栏、菜单等区域下,实现窗口的最大化,但是如果任务栏不是自动隐藏,窗口就无法盖住任务栏,因此想问问,有没有什么方法,可以让窗口最大化时盖住任务栏ps:在任务栏不是自动隐藏的前提下 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 参考下,呵呵...... 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); 另外,修改任务栏的自动隐藏属性,可以实现: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);但是这种方法有一点停滞,显得程序很不流畅,不知道还有什么好方法,大虾们赐教撒~~ AfxGetMainWnd()->SetWindowPos(&wndTopMost, 0, 0, ::GetSystemMetrics(SM_CXSCREEN), ::GetSystemMetrics(SM_CYSCREEN), 0); 得到包括任务栏在内的全屏尺寸:SystemParametersInfo(SPI_GETWORKAREA,0,(LPRECT)$rc,0);rc就是能盖住任务栏的尺寸,按这个尺寸设置窗口大小就可以了。 同意Mackz的方法,我经常这么做 Mackz的方法早试过了阿,盖不住任务栏的 我知道了,你的任务栏肯定是设置了显示在最上面的任务栏在点Win键是会出来,不过当点了全屏的对话框的标题栏后又可以盖住任务栏了我刚试过 噢,是我开头没说清楚,下面是我们软件的一个需求,当界面最大化时,要求尽可能的利用屏幕空间,现在最后的问题就是,如果任务栏是固定显示的,最好能够盖住任务栏,开头的处理方法类似Mackz说的(在按钮里执行),但是这种方法有一个问题,窗口虽然达到了显示效果,但是标题栏上的“最大化”按钮还在(窗口实际上不是处于最大化状态),如果你继续点最大化,窗口就会缩小(成为真正的最大化状态),我们找了半天,不知道怎么修改这个状态(修改为“向下还原”),因此这个方法暂时行不通。第二种方法是上面说到的修改任务栏的自动隐藏属性,窗口只是直接最大化而已,但是来回切换自动隐藏属性,windows使用的时间太多了,界面反应达不到性能要求:( 另外,SetWindowPos的代码如果在WM_SIZE里处理最大化时执行,则无法盖住任务栏写了这么久,被个小问题困住了,向各位讨教:(这个需求有一个最终方案是可以实现的,就是彻底去掉标题栏,用全屏的方式,自己再模拟一个标题栏,但是软件的工具栏很多,修改起来涉及的代码比较多,现在想看看通过一些简单的方法能不能实现,呵呵 这样不知行否?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); }} 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了. //全屏显示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); } 如果要实现真正全屏可以保存窗口风格,然后去掉边框滚动条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); //恢复上一次保存的窗口风格 开源送分 [快速结贴]散分 求教CloneCD生成的镜像.cdd文件格式是怎么样的? CDatabase::ExcuteSql()的问题 关于对话框类信息的显示,有没有人出现类似问题 如何自动注册自己的word的addin? 请问,那里有windows 2k 的sdk下载?(在线等待) _bstr_t 是怎么用的?新手入门,多多关照 关于数组的大小 关于《windows网络编程技术》中“完成端口”一节,书上技巧问题介绍的较浅。你是否也有自己的问题,希望大家一起讨论,取长补短。 如何在vc中显示png图片 树型视图的state image和overlay image?
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);
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);但是这种方法有一点停滞,显得程序很不流畅,不知道还有什么好方法,大虾们赐教撒~~
SystemParametersInfo(SPI_GETWORKAREA,0,(LPRECT)$rc,0);
rc就是能盖住任务栏的尺寸,按这个尺寸设置窗口大小就可以了。
任务栏在点Win键是会出来,不过当点了全屏的对话框的标题栏后又可以盖住任务栏了
我刚试过
第二种方法是上面说到的修改任务栏的自动隐藏属性,窗口只是直接最大化而已,但是来回切换自动隐藏属性,windows使用的时间太多了,界面反应达不到性能要求:(
{
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);
}
}
{
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了.
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);
}
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); //恢复上一次保存的窗口风格