窗口最小化消息的解决之道

最近在弄程序的时候,碰到需要在主窗口最小化的时候,自动将其子窗口最小化的问题。当时没想通。不过现在明白了,其实就是在窗口大小变化的事件里判断主窗口是否最小化的。然后进行相应的操作即可。如果是在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.

原文地址:https://www.cnblogs.com/BeyondTechnology/p/1995933.html