窗口最小化消息的解决之道
最近在弄程序的时候,碰到需要在主窗口最小化的时候,自动将其子窗口最小化的问题。当时没想通。不过现在明白了,其实就是在窗口大小变化的事件里判断主窗口是否最小化的。然后进行相应的操作即可。如果是在SDK程序, 或者VC中可能用不着这样麻烦了,直接在消息循环中进行相应的操作即可。呵呵,其它的语言,就用这方法吧。。。下面是网上的一些资料:
我们首先要知道窗口什么时候最小化。但是窗口消息中并没有最小化这个消息,经过一番查找,发现最小化竟而藏在了WM_SIZE这个消息的wParam参数中了。
我们在这里就利用窗口的WM_SIZE消息来获取窗口最小化的消息。首先我们要了解一下WM_SIZE消息是什么时候产生的。
在MSDN中描述道:“The WM_SIZE message is sent to a window after its size has changed. ”意思是:“在窗口大小改变时,Windows给窗口过程发送一个WM_SIZE消息。”
所以,在窗口最小化时,Windows会给窗口发送WM_SIZE消息,我们可以通过这个消息来截取最小化消息。
那么,到底怎么截取呢?我们来看一下winuser.h头文件的定义:
/*
* WM_SIZE message wParam values
*/
#define SIZE_RESTORED 0
#define SIZE_MINIMIZED 1
#define SIZE_MAXIMIZED 2
#define SIZE_MAXSHOW 3
#define SIZE_MAXHIDE 4
这是WM_SIZE消息的wParam参数取值的宏定义。从上面可以看到一项
#define SIZE_MINIMIZED 1
这就是我们接下来要用到的。如果wParam的值为SIZE_MINIMIZED就代表窗口被最小化了。
明白以上内容后,我们开始动手来实现最小化时改变程序图标。
1.新建SDI文档,把要更改的图标加入到资源,然后通过向导添加一个WM_SIZE消息的处理函数。
2.具体做法是点击菜单栏中的"查看"->"建立类向导..."
3.在Message Maps页中的"Class name"项选择CMainFrame,然后Message中选择WM_SIZE,然后单击"Add Function"按钮.
4.这样就把处理WM_SIZE消息的函数建立起来了,我们不要急着关闭向导,单击按钮"Edit Code"来进行具体的功能实现。
5.进入到代码页面,我们可以看到处理WM_SIZE消息的函数框架,如下:
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
}
6.现在我们来实现,当窗口最小化时弹出提示信息。我们可以在OnSize函数中加入如下代码:
if(nType==SIZE_MINIMIZED)
{
::AfxMessageBox("窗口最小化了",MB_OK);
}
7.运行一下,看到效果了吗?
========================================================================
判断最小化:
IsIconic()
The IsIconic function determines whether the specified window is minimized (iconic).
BOOL IsIconic(
HWND hWnd // handle of window
);
Parameters
hWnd
Identifies the window.
Return Values
If the window is iconic, the return value is nonzero.
If the window is not iconic, the return value is zero.
判断最大化
IsZoomed()
The IsZoomed function determines whether a window is maximized.
BOOL IsZoomed(
HWND hWnd // handle of window
);
Parameters
hWnd
Identifies the window.
Return Values
If the window is zoomed, the return value is nonzero.
If the window is not zoomed, the return value is zero.
我们首先要知道窗口什么时候最小化。但是窗口消息中并没有最小化这个消息,经过一番查找,发现最小化竟而藏在了WM_SIZE这个消息的wParam参数中了。
我们在这里就利用窗口的WM_SIZE消息来获取窗口最小化的消息。首先我们要了解一下WM_SIZE消息是什么时候产生的。
在MSDN中描述道:“The WM_SIZE message is sent to a window after its size has changed. ”意思是:“在窗口大小改变时,Windows给窗口过程发送一个WM_SIZE消息。”
所以,在窗口最小化时,Windows会给窗口发送WM_SIZE消息,我们可以通过这个消息来截取最小化消息。
那么,到底怎么截取呢?我们来看一下winuser.h头文件的定义:
/*
* WM_SIZE message wParam values
*/
#define SIZE_RESTORED 0
#define SIZE_MINIMIZED 1
#define SIZE_MAXIMIZED 2
#define SIZE_MAXSHOW 3
#define SIZE_MAXHIDE 4
这是WM_SIZE消息的wParam参数取值的宏定义。从上面可以看到一项
#define SIZE_MINIMIZED 1
这就是我们接下来要用到的。如果wParam的值为SIZE_MINIMIZED就代表窗口被最小化了。
明白以上内容后,我们开始动手来实现最小化时改变程序图标。
1.新建SDI文档,把要更改的图标加入到资源,然后通过向导添加一个WM_SIZE消息的处理函数。
2.具体做法是点击菜单栏中的"查看"->"建立类向导..."
3.在Message Maps页中的"Class name"项选择CMainFrame,然后Message中选择WM_SIZE,然后单击"Add Function"按钮.
4.这样就把处理WM_SIZE消息的函数建立起来了,我们不要急着关闭向导,单击按钮"Edit Code"来进行具体的功能实现。
5.进入到代码页面,我们可以看到处理WM_SIZE消息的函数框架,如下:
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
}
6.现在我们来实现,当窗口最小化时弹出提示信息。我们可以在OnSize函数中加入如下代码:
if(nType==SIZE_MINIMIZED)
{
::AfxMessageBox("窗口最小化了",MB_OK);
}
7.运行一下,看到效果了吗?
========================================================================
判断最小化:
IsIconic()
The IsIconic function determines whether the specified window is minimized (iconic).
BOOL IsIconic(
HWND hWnd // handle of window
);
Parameters
hWnd
Identifies the window.
Return Values
If the window is iconic, the return value is nonzero.
If the window is not iconic, the return value is zero.
判断最大化
IsZoomed()
The IsZoomed function determines whether a window is maximized.
BOOL IsZoomed(
HWND hWnd // handle of window
);
Parameters
hWnd
Identifies the window.
Return Values
If the window is zoomed, the return value is nonzero.
If the window is not zoomed, the return value is zero.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现