hur.cn - 华软网

 热门搜索

MDI如何最小化所有子窗口(枚举方法出现“实参形参不兼容”的提示)

  作者:未知    来源:网络    更新时间:2011/7/19
我想要将MDI所有打开的子窗口全部最小化,有提示说可以用EnumChildProc和EnumChildWindows()枚举完成,但是我实际做的时候,却提示““EnumChildWindows”: 不能将参数 2 从“bool (__cdecl *)(HWND,LPARAM)”转换为“WNDENUMPROC”,意思是EnumChildWindows的回调函数EnumChildProc类型与其不兼容,这是为什么?

我使用的是VS2010sp1编译器。
另外,如果不用枚举,是否还可以用GetWindow()或者其他的方法,来完成MDI所有窗口最小化?
多谢各位,如果有示例代码劳烦贴一下,感激不尽!!!

附:枚举部分代码
void CtestDoc::OnButtonMiniall()
{
HWND hWnd=AfxGetMainWnd()->m_hWnd;
EnumChildWindows(hWnd, EnumChildProc, NULL);
}

bool  CtestDoc::EnumChildProc(HWND hWndChild, LPARAM lParam)
{
PostMessage(hWndChild, WM_CLOSE, NULL, NULL);       //最小化用哪个消息也需要各位指正。
return TRUE;
}
EnumChildProc函数是定义在文档类的static的成员函数。
---华软 网友回答---
C++">
static BOOL CALLBACK EnumChildProc(HWND hWndChild, LPARAM lParam);

声明函数原型的时候,别忘了加 CALLBACK


————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
---华软网友回复---
最小化的消息:http://msdn.microsoft.com/en-us/library/ms646360%28v=VS.85%29.aspx

遍历所有窗口,给每个子窗口都发一条消息就可以了
---华软网友回复---
既然是 MDI,就不应该用这么底层的方法来实现“最小化”功能,应该是通过遍历视图的方式来操作,大体上应该有这些内容:

通过 CDocTemplate 遍历所有 CDocument 对象;
通过 CDocument 遍历所有 CView 对象;
给每个 CView 对象发送“最小化”命令;


————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
---华软网友回复---
引用 1 楼 maquan 的回复:
C/C++ code

static BOOL CALLBACK EnumChildProc(HWND hWndChild, LPARAM lParam);


声明函数原型的时候,别忘了加 CALLBACK


————————————————————————————————


有CALLBACK 但还是提示不行,能说一下可能的原因吗?谢谢。。
---华软网友回复---
改用大写的 BOOL 试试?
---华软网友回复---
其实如果你不怕麻烦的话,把 WNDENUMPROC 的原型定义展开一下,跟你看到的报错信息一比较就清楚了:
typedef BOOL (CALLBACK* WNDENUMPROC)(HWND, LPARAM);
展开后是:
int (__stdcall* )(HWND, LPARAM)
而你的报错信息里是:
bool (__cdecl *)(HWND,LPARAM)
---华软网友回复---
引用 2 楼 bllqbz 的回复:
最小化的消息:http://msdn.microsoft.com/en-us/library/ms646360%28v=VS.85%29.aspx

遍历所有窗口,给每个子窗口都发一条消息就可以了

谢谢你的建议,但是我实际操作之后,发现使用WM_SYSCOMMAND消息只能最小化主窗口(当然子窗口也一并最小化了),而不能最小化子窗口。
我是使用了GetWindow()来获取的子窗口的句柄,不知道是不是这里有什么不合理的地方?
---华软网友回复---
引用 6 楼 maquan 的回复:
其实如果你不怕麻烦的话,把 WNDENUMPROC 的原型定义展开一下,跟你看到的报错信息一比较就清楚了:
typedef BOOL (CALLBACK* WNDENUMPROC)(HWND, LPARAM);
展开后是:
int (__stdcall* )(HWND, LPARAM)
而你的报错信息里是:
bool (__cdecl *)(HWND,LPARAM)

。。。。抱歉,回调函数我一点都不懂,不过我的问题已经解决了。因为我注意到不管是SendMessage()还是GetWindow(),除了Win32 API函数外,在CWnd中都有同名的成员函数,所以我就获得了子窗口的指针pChildWnd,然后用pChildWnd->SendMessage(WM_SYSCOMMAND, SC_MINIMIZE,0)加上CWnd::isiconic()的循环条件判断,完成了全部子窗口的最小化。

谢谢你的讨论,通过这个小功能的实现,学习了很多东西。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。