如何重载MDI程序中客户窗口的消息处理过程?
来源:互联网 发布:js 控制style.display 编辑:程序博客网 时间:2024/04/30 22:02
MDI应用程序分三个部分:框架窗口(Frame Window),客户窗口(Client Window),子窗口(Child Window) ,在VCL中,这个Client Window已经被封装了,你不能直接使用消息映射或者Application.OnMessage来得到发送到Client Window的消息,所以须在启动时使用SetWindowLog更改客户窗口的默认消息处理过程,在程序退出时恢复.
.h
...
private:
void __fastcall ClientProc(TMessage &msg);
Pointer ClientObjInstance;
LONG OldClientProc;
...
.cpp
...
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ClientObjInstance = MakeObjectInstance(ClientProc);
OldClientProc = SetWindowLong(ClientHandle,GWL_WNDPROC,(long)ClientObjInstance);
}
void __fastcall TForm1::FormClose(TObject *Sender)
{
SetWindowLong(ClientHandle,GWL_WNDPROC,OldClientProc);
FreeObjectInstance(ClientObjInstance);
}
//下面函数用来讲子窗体列表加入到ListBox1中,记得在最后调用默认的ClientWindow处理过程
void __fastcall TForm1::ClientProc(TMessage &msg)
{
if (msg.Msg == WM_PARENTNOTIFY) {
if (msg.WParamLo == WM_CREATE) {
TForm *r = (TForm *)(FindControl((HWND)msg.LParam));
ListBox1->Items->AddObject(r->Caption,r);
}
else if (msg.WParamLo == WM_DESTROY) {
TForm *r = (TForm *)(FindControl((HWND)msg.LParam));
ListBox1->Items->Delete(ListBox1->Items->IndexOfObject(r));
}
}
msg.Result = CallWindowProc((FARPROC)OldClientProc,
ClientHandle,msg.Msg,msg.WParam,msg.LParam);
}
//点击ListBox激活相应子窗体
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
TForm *AForm = (TForm *) ListBox1->Items->Objects[ListBox1->ItemIndex];
if (AForm->WindowState == wsMinimized)
SendMessage(AForm->Handle,WM_SYSCOMMAND,SC_RESTORE,0);
AForm->BringToFront();
}
WM_PARENTNOTIFY是子窗体向ClientWindow发送的消息,使用参数WParamLo判定事件,详情看帮助,如果使用WM_MDICREATE和WM_MDIDESTROY也是可以的,但是要注意调用默认过程CallWindowProc的顺序,因为WM_MDICREATE在处理之后才会返回子窗体句柄,而WM_MDIDESTROY则必须在处理之前使用它的WParam参数作为子窗体句柄.
- 如何重载MDI程序中客户窗口的消息处理过程?
- 发送给MDI客户窗口的消息MDI消息WM_MDICASCADE
- 如何在MDI客户区窗口响应鼠标双击消息?
- 如何在MDI客户区窗口响应鼠标双击消息?
- 在MFC的MDI程序中设置子窗口客户区大小
- SDI和MDI程序中对非客户区(标题栏、左右下边界)的美化
- MDI命令消息的流浪过程
- CB MDI框架,Frame关闭的时候,子窗口如何获取这个关闭消息
- 如何处理窗口的鼠标离开消息
- 如何处理鼠标离开窗口的消息
- MFC应用程序中处理消息的顺序 MFC应用程序创建窗口的过程 关闭窗口的顺序(非模态窗口) ..................
- Message消息重载、自定义消息处理过程
- MFC中窗口收到WM_PAINT消息是如何处理的,什么情况下产生WM_PAINT消息
- c#的mdi窗口中如何完成子窗口间的切换?
- 如何设计MDI的窗口样式
- MDI窗口程序
- 如何将MDI窗口中的RibbonPage合并到父窗口的Ribbon中
- 深入MDI客户窗口编程及改进
- 一个中专生在华为面试的真实经历!
- 一个使用JdbcTemplate增加一组数据的完整例子
- Server Error in '/' Application. Access to the Path Is Denied" error message appears
- 古罗马的幽灵--斗兽场
- 现代架构设计文档的编写
- 如何重载MDI程序中客户窗口的消息处理过程?
- ORA-01261: Parameter db_create_file_dest destination string cannot be
- DataHelper
- 工作了才知道
- 我拿什么爱您,我的爸妈
- asp.net不定级动态菜单的实现
- SQL server2000
- Ajax无刷新实现图片切换特效
- Domino 开发电子书集