请问如何获得桌面的状态栏大小?? 如上。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 枚举桌面窗口,用Class name查找Shell_TrayWnd。这其中又包含3个字窗口,分别是开始按钮、任务栏、系统托盘 任务栏的className是 Shell_TrayWnd,然后Findwindow就拿到了任务栏的句柄,接下来就不用说了吧 要这个主要是因为我用了一个CFrameWnd类,去掉了标题栏在最大化的时候会遮住桌面的任务栏这样获取任务栏后手动设置窗口的最大化,可行吗? 用SystemParametersInfo可以得到work area的大小再获得屏幕大小取差是你想要的吗? work area是指的去任务栏的那块区域吗?假如我的窗口在最大化的状态时,拉大了任务栏,那窗口也就随之变化,请问这样的消息应该写在哪啊? RECT rect; HWND hWnd = ::FindWindow("Shell_TrayWnd", 0); ::GetWindowRect(hWnd,&rect); 谢谢 vcmute(横秋)我在这个函数中设置窗口的最大最小化。当任务栏拉大时最大化的窗口可以相应改变,不会遮住任务栏。可是当任务栏再拉小时,窗口不能做出相应的改变。请问还就在哪里写消息响应??void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI){ // TODO: 在此添加消息处理程序代码和/或调用默认值 ModifyStyle(WS_CAPTION,0,SWP_FRAMECHANGED); lpMMI->ptMinTrackSize.x = 800; RECT rect; HWND hWnd = ::FindWindow("Shell_TrayWnd", 0); ::GetWindowRect(hWnd,&rect); lpMMI->ptMinTrackSize.y = 600; lpMMI->ptMaxTrackSize.x = 1024; lpMMI->ptMaxTrackSize.y = 768-(rect.bottom-rect.top); CFrameWnd::OnGetMinMaxInfo(lpMMI);} 你的意思是改变系统任务栏大小之后,把窗口最大化的大小也改变?用SystemParametersInfo带SPI_SETWORKAREA参数,pvParam传入改变大小后的RECT指针。这样就行了RECT rc;SystemParametersInfo(SPI_SETWORKAREA, 0, (PVOID)&rc, 0); To:pomelowu(羽战士) 是那样的意思。只是没太懂,应该要在哪里写?在 OnGetMinMaxInfo中?我在 OnGetMinMaxInfo中那样写的(如上)只是设置了最大的尺寸,窗口还可以被拖动大小,怎样设置它为最大化状态? RECT rc; rc.left=0; rc.top=0; rc.right=GetSystemMetrics(SM_CXSCREEN); RECT rect; HWND hWnd = ::FindWindow("Shell_TrayWnd", 0); ::GetWindowRect(hWnd,&rect); rc.bottom=GetSystemMetrics(SM_CYSCREEN)-(rect.bottom-rect.top); ShowWindow(SW_SHOWMAXIMIZED ); //注意这里,先最大化 MoveWindow(&rc); //再改变大小这是基于对话框的 无标题栏的窗口;完全不需要自己去写改变系统任务栏的响应函数测试:void CMy1Dlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); CString m_show; m_show.Format("cx:%d;cy:%d",cx, cy); MessageBox(m_show);} 麻烦你能告诉我这个应该写在哪个函数中?在OnGetMinMaxInfo中写不行。我的这个是FrameWnd类 哎,今天没事情,多写点给你CMainFrame::OnCreate中可以 呵呵,多谢 LCBoy() 。这样写在初始化的时候是最大化状态,但是拉动任务栏后就不行了。还应在哪有相应的处理啊?有空再提点下我吧。@@ 郁闷,给个简化的代码[email protected]真这么怪@ 在窗口的回调函数中捕获修改WM_GETMINMAXINFO消息:((LPMINMAXINFO)lParam)->ptMaxSize.x = GetSystemMetrics(SM_CXMAXIMIZED); //最大化宽((LPMINMAXINFO)lParam)->ptMaxSize.y = GetSystemMetrics(SM_CYMAXIMIZED); //最大化高((LPMINMAXINFO)lParam)->ptMinTrackSize.x = GetSystemMetrics(SM_CXMINTRACK);//可调整最小宽((LPMINMAXINFO)lParam)->ptMinTrackSize.y = iCH + iMH; //可调整最小高((LPMINMAXINFO)lParam)->ptMaxTrackSize.x = GetSystemMetrics(SM_CXMAXTRACK);//可调整最大宽((LPMINMAXINFO)lParam)->ptMaxTrackSize.y = GetSystemMetrics(SM_CYMAXTRACK);//可调整最大高break; to :rainivy(Rain) 不好意思啊,窗口的回调函数是哪个??我现在的程序任务栏拉大时最大化的窗口可以相应改变,不会遮住任务栏。你所以的这样做的话,能使:可是当任务栏再拉小时,窗口能做出相应的改变(即变大??)。谢谢回复 to :pomelowu(羽战士) 你的意思是改变系统任务栏大小之后,把窗口最大化的大小也改变?用SystemParametersInfo带SPI_SETWORKAREA参数,pvParam传入改变大小后的RECT指针。这样就行了RECT rc;SystemParametersInfo(SPI_SETWORKAREA, 0, (PVOID)&rc, 0);你的这个方法好像是很可行的,麻烦你说详细一点点啊。谢谢啊。等待~~ RECT rc;SystemParametersInfo(SPI_SETWORKAREA, 0, (PVOID)&rc, SPIF_SENDCHANGE);把最后一个参数改为SPIF_SENDCHANGE,则在SystemParametersInfo调用后会广播一条WM_SETTINGCHANGE消息。那么在程序中截获WM_SETTINGCHANGE即可。 如何枚举未受信任的数字证书列表? 如何解析数据包 ClistCtrl创建成功,为什么显示不出来? VC向网络编程方向发展看什么书最好?哪位高手推荐几本吧 请问如何在view类中取得cmainframe的指针 简单问题,谁解决就给谁100分!!! Merrychristmas to all of programmers of China! 一个紧急“关于Microsoft Web浏览器控件刷新的问题” VC++ WriteProcessMemory函数 如何用内嵌汇编或指针实现修改? 客户端访问数据库的问题 坐标小问题 ATL 相关
这其中又包含3个字窗口,分别是开始按钮、任务栏、系统托盘
接下来就不用说了吧
在最大化的时候会遮住桌面的任务栏
这样获取任务栏后手动设置窗口的最大化,可行吗?
再获得屏幕大小取差
是你想要的吗?
假如我的窗口在最大化的状态时,拉大了任务栏,那窗口也就随之变化,请问这样的消息应该写在哪啊?
HWND hWnd = ::FindWindow("Shell_TrayWnd", 0);
::GetWindowRect(hWnd,&rect);
我在这个函数中设置窗口的最大最小化。当任务栏拉大时最大化的窗口可以相应改变,不会遮住任务栏。可是当任务栏再拉小时,窗口不能做出相应的改变。请问还就在哪里写消息响应??void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
ModifyStyle(WS_CAPTION,0,SWP_FRAMECHANGED); lpMMI->ptMinTrackSize.x = 800;
RECT rect;
HWND hWnd = ::FindWindow("Shell_TrayWnd", 0);
::GetWindowRect(hWnd,&rect);
lpMMI->ptMinTrackSize.y = 600;
lpMMI->ptMaxTrackSize.x = 1024;
lpMMI->ptMaxTrackSize.y = 768-(rect.bottom-rect.top); CFrameWnd::OnGetMinMaxInfo(lpMMI);
}
用SystemParametersInfo带SPI_SETWORKAREA参数,pvParam传入改变大小后的RECT指针。这样就行了RECT rc;
SystemParametersInfo(SPI_SETWORKAREA, 0, (PVOID)&rc, 0);
在 OnGetMinMaxInfo中?
我在 OnGetMinMaxInfo中那样写的(如上)只是设置了最大的尺寸,窗口还可以被拖动大小,怎样设置它为最大化状态?
rc.left=0;
rc.top=0;
rc.right=GetSystemMetrics(SM_CXSCREEN);
RECT rect;
HWND hWnd = ::FindWindow("Shell_TrayWnd", 0);
::GetWindowRect(hWnd,&rect);
rc.bottom=GetSystemMetrics(SM_CYSCREEN)-(rect.bottom-rect.top); ShowWindow(SW_SHOWMAXIMIZED ); //注意这里,先最大化
MoveWindow(&rc); //再改变大小这是基于对话框的 无标题栏的窗口;完全不需要自己去写改变系统任务栏的响应函数
测试:
void CMy1Dlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
CString m_show;
m_show.Format("cx:%d;cy:%d",cx, cy);
MessageBox(m_show);
}
在OnGetMinMaxInfo中写不行。
我的这个是FrameWnd类
这样写在初始化的时候是最大化状态,但是拉动任务栏后就不行了。
还应在哪有相应的处理啊?
有空再提点下我吧。@@
[email protected]
真这么怪@
((LPMINMAXINFO)lParam)->ptMaxSize.x = GetSystemMetrics(SM_CXMAXIMIZED); //最大化宽
((LPMINMAXINFO)lParam)->ptMaxSize.y = GetSystemMetrics(SM_CYMAXIMIZED); //最大化高
((LPMINMAXINFO)lParam)->ptMinTrackSize.x = GetSystemMetrics(SM_CXMINTRACK);//可调整最小宽
((LPMINMAXINFO)lParam)->ptMinTrackSize.y = iCH + iMH; //可调整最小高
((LPMINMAXINFO)lParam)->ptMaxTrackSize.x = GetSystemMetrics(SM_CXMAXTRACK);//可调整最大宽
((LPMINMAXINFO)lParam)->ptMaxTrackSize.y = GetSystemMetrics(SM_CYMAXTRACK);//可调整最大高
break;
不好意思啊,窗口的回调函数是哪个??
我现在的程序任务栏拉大时最大化的窗口可以相应改变,不会遮住任务栏。
你所以的这样做的话,能使:
可是当任务栏再拉小时,窗口能做出相应的改变(即变大??)。谢谢回复
用SystemParametersInfo带SPI_SETWORKAREA参数,pvParam传入改变大小后的RECT指针。这样就行了RECT rc;
SystemParametersInfo(SPI_SETWORKAREA, 0, (PVOID)&rc, 0);你的这个方法好像是很可行的,麻烦你说详细一点点啊。
谢谢啊。等待~~
SystemParametersInfo(SPI_SETWORKAREA, 0, (PVOID)&rc, SPIF_SENDCHANGE);把最后一个参数改为SPIF_SENDCHANGE,则在SystemParametersInfo调用后会广播一条WM_SETTINGCHANGE消息。那么在程序中截获WM_SETTINGCHANGE即可。