父窗口指针传到子窗口的方法

本文介绍了一种有效的方法,即如何在子窗口中使用父窗口的指针。通过在子窗口声明void*型指针并在父窗口创建子窗口时传递this指针,实现了跨窗口数据同步。此方法解决了复杂项目中窗口间数据交互的问题。

      最近的的一个项目,涉及了很多的Dialog。数据在各个窗口之间的流动。如子窗口修改的数据,要保存到父窗口中进行保存。这就涉及到父窗口的指针传到子窗口的问题,我也查了一些资料,但是感觉起来,解决还是比较麻烦。经过本人实践总结,我发现,在子窗口中,声明一个void * 型指针,然后再父窗口创建子窗口对象时,将父窗口的this

传递给这个成语变量。当在子窗口中药使用父窗口指针时,可以用父窗口的类型强制转换为父窗口对象指针。非常好用。为什么不能在子窗口中声明父窗口的指针变量呢?

那是因为子窗口时父类的一部分,如果父窗口指针又声明为子窗口的一部分,这样必然导致一个鸡生蛋,蛋生鸡的问题,编译不通过。大家以后再遇到类似的问题时候可以试试!

MFC(Microsoft Foundation Classes)框架下,父窗口之间的通信是非常常见的需求之一。从窗口父窗口发送消息以便于父窗口可以根据这些信息作出相应反应的操作也很简单且有效率高。以下是详细的步骤指导: ### 获取父窗口指针 要让窗口能够找到它的直接上级——也就是所谓的“父”窗口,最常用的方式就是利用 `GetParent()` 成员函数获取父窗口对象指针。 ```cpp CWnd* pParent = GetParent(); if(pParent != NULL) { // 可以安全地操作父窗口对象了... } ``` 这种方法适用于大多数情况下的MDI(多文档界面) 或者 SDI (单文档界面) 应用程序结构。如果需要更精确地定位顶级主框窗体,则应考虑使用 `AfxGetMainWnd()` 来代替。 ### 使用预定义消息或自定义消息发送数据 #### 预定义的消息 有些时候不需要创建新的自定义消息就能解决问题。例如想关闭整个应用程序时可以直接调用 `PostMessage(WM_CLOSE)` 给父窗口传递默认关闭请求。同样也可以通过似的方式来触发其他常见动作如最小化(`WM_SYSCOMMAND`, `SC_MINIMIZE`) 等。 但是更多复杂的数据交换往往需要用到自定义的消息型,这使得我们可以携带更多的上下文信息给父级组件。 #### 创建并发送自定义消息 正如之前所提到过的关于【c++ mfc 自定义消息】的内容一样,首先你需要确定好自己的消息 ID,并确保其不会和其他已有的系统级别或者第三方库内建的消息相冲突。假设已经定义好了名为 `WM_CHILD_WINDOW_UPDATE` 的自定义消息之后就可以像下面这样做: **窗口侧** ```cpp // 假设在窗口中有一个成员变量m_nData表示想要传送给父窗口的信息内容 UINT nMsgId = WM_CHILD_WINDOW_UPDATE; // 替换成你自己定义的那个ID吧! // 将准备好的数据作为参数一并发出去 pParent->SendMessage(nMsgId, (WPARAM)m_nData, (LPARAM)NULL); // 还有一种选择是采用 PostMessage(),区别在于是否立即处理还是排队等待执行。 ``` **父窗口侧 - 注册和响应** 接下来就是在父窗口端设置侦听机制了,即告诉 MFC 当有指定型的事件进来的时候去哪里找处理器方法。可以在资源脚本(.rc 文件卡住? )里做这件事儿,不过更好的做法是在CPP源码内部搞定一切事情。 1. **注册消息映射条目**: 在 .cpp 中添加宏 ON_MESSAGE 到 MESSAGE_MAP 区块之中去关联特定的回调例程; ```cpp BEGIN_MESSAGE_MAP(CChildView,CFormView) // ... 其他原有的东西 ... ON_MESSAGE(WM_CHILD_WINDOW_UPDATE,&CMainFrame::OnUpdateFromChildWindow) END_MESSAGE_MAP() ``` 2. **实现具体的处理逻辑** 对上述宏中的第二个参数给出对应的功能实现版本,形参列表会包含两个由 WPARAM 和 LPARAM 引入进来的原始值,可以自由解析它们来得知来自孩的意图。 ```cpp afx_msg LRESULT CMainFrame::OnUpdateFromChildWindow(WPARAM wParam/*这里放的是你当初塞进去的东西*/,LPARAM lParam) { int dataReceived=(int)wParam; TRACE(_T("接收到窗口传来的新数值:%d\n"),dataReceived); // 根据实际情况在这里编写进一步的动作... return 0; } ``` 这样一来就成功实现了基于消息驱动模式的一次跨层级间交流的过程啦!这种方式不仅限于简单的数字传输,还可以配合一些高级技巧将更大规模甚至复杂的结构体打包起来一起飞往目的地哦~ --- 总结一下关键要点: - 找到正确的父窗口实例引用 (`GetParent()`); - 决定是要走现成路(内置消息集),还是要另辟蹊径构造独一无二的通知信号(自定义消息); - 最后别忘了告诉父亲大人怎么迎接这份礼物~通过消息映射机制把所有准备工作串联起来形成完整的链路闭环即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值