[续]win7系统拖动最大化了的窗口,该窗口自动被缩小? 原帖:http://topic.csdn.net/u/20101025/17/a269b08a-8435-4ba6-8d09-eacd3017a444.html已结的帖关注度太低,所以发个续帖,大家仁者见仁智者见智 o(∩_∩)o 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 w_anthony:请下载顶楼的示例,您应该可以理解 呵呵,下载了看了下,实在没想到是最糟糕的情况,你的对话框置为最大化状态了,但是大小并不是满屏大小。对于微软来说,这属于错误效果!正如我所说的,重载了WM_GETMINMAXINFO则一定要屏蔽最大化操作,二者是互斥的。WM_GETMINMAXINFO是用来控制鼠标拉伸时的最小和最大尺寸的。“最大化”是Windows系统明确定义的概念,指窗口大小为满屏(除去任务栏区域),而由于“最大化”和“最小化”比较特殊,所以Windows使用了状态(Placement)来标识这两种状态,以便于判断(IsZoomed() IsIconic())和实现还原操作。 关于你的问题的解决办法,请先确认需求是什么。你提供的源码,对话框被设置为是不可拉伸的,那么我只能理解你的需求是,这个对话框只允许存在小尺寸和大尺寸两种模式,类似于有些对话框的收缩和展开。只是后者是通过客户区的一个按钮来操作,而这个对话框则是通过非客户区的“最大化/还原”按钮(非客户区按钮实际上不是控件)来操作。如果是这样,只需要自实现一下最大化处理就行了。// wndDlg.hbool m_bSpecialMaximizeState;afx_msg void OnSysCommand(UINT nID, LPARAM lParam);void SetSpecialMaximize(bool bMaximize);// wndDlg.cpp#define ZOOMED_X 512#define ZOOMED_Y 383#define RESTORED_X 400#define RESTORED_Y 285CwndDlg::CwndDlg(...) : CDialog(...) , m_bSpecialMaximizeState(true){ ...}BOOL CwndDlg::OnInitDialog(){ CDialog::OnInitDialog(); ... SetSpecialMaximize(true); return TRUE;}...void CwndDlg::OnSysCommand(UINT nID, LPARAM lParam){ if (nID == SC_MAXIMIZE) { m_bSpecialMaximizeState = !m_bSpecialMaximizeState; SetSpecialMaximize(m_bSpecialMaximizeState); } else { CDialog::OnSysCommand(nID, lParam); }}void CwndDlg::SetSpecialMaximize(bool bMaximize){ CRect rcWnd(0,0,0,0); GetWindowRect(&rcWnd); CPoint ptCenter = rcWnd.CenterPoint(); long cx = bMaximize ? ZOOMED_X : RESTORED_X; long cy = bMaximize ? ZOOMED_Y : RESTORED_Y; SetWindowPos(NULL, ptCenter.x-cx/2, ptCenter.y-cy/2, cx, cy, SWP_NOZORDER);} 呵呵,LZ挺费心的,谢谢了。不过我倒不认为,“非满屏的最大化的对话框”是个错误效果哦。而且直接设置窗口大小,一是会缺乏缩放的动画效果,二是如果窗口的最大化限制是1024x738,那么对于超过1024x768的分辨率没有什么问题,但是对于1024x768的分辨率,本来应该是最大化到整个屏幕,然后不可拖动的,但是现在依然是可以拖动的状态,这是不对的。另外我那张帖子也不是没有解决方法,那帖子里面也顺带的说了下 直接把Windows7这个特性关闭算了Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Control Panel\Desktop]"WindowArrangementActive"="0" 装VS2005需要卸载VS2008吗 那里出错? 在TCP上实现包格式SMGP协议的问题,高手来看看,不是的也来顶顶 怎么拦截发送给编辑控件的键盘消息? 大家来看一段简单的程序 我感觉VC里最神秘的几块内容(至今也没搞懂) 本人业余时间可以为个人或企业用户提供软件开发,如果你是学生朋友,可以通过QQ提供在线编程指导,让你快速掌握编程的技巧 关于自定义消息的问题 dbgrid的问题!我没分了,但你的回答对我狠重要! MFC 多文档程序,在view中创建的定时器如何区分自己是哪个view 窗口句柄获得问题 老是对多线程不感冒怎么办?
但是大小并不是满屏大小。对于微软来说,这属于错误效果!正如我所说的,重载了WM_GETMINMAXINFO则一定要屏蔽最大化操作,二者是互斥的。
WM_GETMINMAXINFO是用来控制鼠标拉伸时的最小和最大尺寸的。“最大化”是Windows系统明确定义的概念,指窗口大小为满屏(除去任务栏区域),
而由于“最大化”和“最小化”比较特殊,所以Windows使用了状态(Placement)
来标识这两种状态,以便于判断(IsZoomed() IsIconic())和实现还原操作。
这个对话框只允许存在小尺寸和大尺寸两种模式,类似于有些对话框的收缩
和展开。只是后者是通过客户区的一个按钮来操作,而这个对话框则是通过
非客户区的“最大化/还原”按钮(非客户区按钮实际上不是控件)来操作。如果是这样,只需要自实现一下最大化处理就行了。// wndDlg.hbool m_bSpecialMaximizeState;afx_msg void OnSysCommand(UINT nID, LPARAM lParam);void SetSpecialMaximize(bool bMaximize);
// wndDlg.cpp#define ZOOMED_X 512
#define ZOOMED_Y 383
#define RESTORED_X 400
#define RESTORED_Y 285CwndDlg::CwndDlg(...)
: CDialog(...)
, m_bSpecialMaximizeState(true)
{
...
}BOOL CwndDlg::OnInitDialog()
{
CDialog::OnInitDialog(); ... SetSpecialMaximize(true);
return TRUE;
}...void CwndDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if (nID == SC_MAXIMIZE)
{
m_bSpecialMaximizeState = !m_bSpecialMaximizeState;
SetSpecialMaximize(m_bSpecialMaximizeState);
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}void CwndDlg::SetSpecialMaximize(bool bMaximize)
{
CRect rcWnd(0,0,0,0);
GetWindowRect(&rcWnd); CPoint ptCenter = rcWnd.CenterPoint();
long cx = bMaximize ? ZOOMED_X : RESTORED_X;
long cy = bMaximize ? ZOOMED_Y : RESTORED_Y; SetWindowPos(NULL, ptCenter.x-cx/2, ptCenter.y-cy/2, cx, cy, SWP_NOZORDER);
}
不过我倒不认为,“非满屏的最大化的对话框”是个错误效果哦。
而且直接设置窗口大小,一是会缺乏缩放的动画效果,二是如果窗口的最大化限制是1024x738,那么对于超过1024x768的分辨率没有什么问题,但是对于1024x768的分辨率,本来应该是最大化到整个屏幕,然后不可拖动的,但是现在依然是可以拖动的状态,这是不对的。
另外我那张帖子也不是没有解决方法,那帖子里面也顺带的说了下
"WindowArrangementActive"="0"