MFC中多视图之间的通信

freesense 2000-06-07 08:41:00
小弟最近在写一个程序,单文档,有三个view,甲view中我创建了派生的CTreeCtrl控件,乙view中我创建了派生的CListCtrl控件(之所以不采用CTreeView和CListView是因为我想封装这两个控件),现在的问题是:我在CTreeCtrl中获得一个消息,必须调用在CListCtrl中的自定义函数,小弟试过以下几种方法,都不能得到正确结果,所以还请高手帮忙:
1 定义关于派生的CListCtrl的全局变量,在.h文件中使用extern修饰符,在.cpp中直接定义指针,编译通过,但运行时执行非法操作。可以确定不是其他方面的问题,因为小弟把这几行代码注释掉,程序可以正常运行,只是在CTreeCtrl接受消息以后不会调用CListCtrl中的自定义函数;
2 消息发送。CTreeCtrl接受消息以后发送自定义消息::PostMessage(NULL,MM_DISKSELCHANGED,(UINT)currentDir,0),在乙view中接受该消息并调用消息处理函数,单步跟踪发现消息被正确发出,但是乙view不知为何并没有接受该消息,因此也没有执行消息处理函数,程序编译通过,运行正常,就是在CListCtrl中没有正常显示;
3 直接取控件的指针。我在CTreeList中调用AfxGetMainWnd(),再使用GetNextWindow(),但是我不知道何时才能取到我所需要的CListCtrl的指针。
如果能有例程,小弟万分感谢。
...全文
371 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoutao 2000-06-11
  • 打赏
  • 举报
回复
关注!
ad 2000-06-11
  • 打赏
  • 举报
回复
在甲view中用::PostMessage(NULL,MM_DISKSELCHANGED,(UINT)currentDir,0)不能将消息发到乙view中,事实上这样做比较规范:
1、甲view中:
AfxGetMainWnd()->PostMessage(MM_DISKSELCHANGED, (UINT)currentDir);
2、CMainFrame中:
//响应MM_DISKSELCHANGED消息
OnDISKSELCHANGED(...)
{
取得乙view指针=>pView;
pView->PostMessage((MM_DISKSELCHANGED, (UINT)currentDir);
//或直接调乙view的刷新函数
}
celxta 2000-06-11
  • 打赏
  • 举报
回复
extern 在.cpp或.c中声明比较好,对于含指针的一定要在原始声明处初化否则会产生非法操作
蒋晟 2000-06-11
  • 打赏
  • 举报
回复
Use documents
jy 2000-06-11
  • 打赏
  • 举报
回复
give me a mail.
I'd like to send my listviewex & treeviewex,
dzl 2000-06-10
  • 打赏
  • 举报
回复
试试如下方法:
当CTreeCtrl获得一个消息时,在甲view中调用GetDocument()->UpdateAllViews(this),在乙view的OnUpdate调用CListCtrl中的自定义函数。

freesense 2000-06-07
  • 打赏
  • 举报
回复
在甲视中接受消息时,所有窗口都已经被创建,应该不存在发送消息到一个不存在的窗口的问题,声明全局变量我也试过,虽然编译通过,但是运行时报告非法操作。
BugGo 2000-06-07
  • 打赏
  • 举报
回复
SimpleBrowse
-- 简洁易用的图片浏览器(源码公开)--
http: www.thalia.com.cn

Just like this , left is a tree , right is a listCtrl
longx 2000-06-07
  • 打赏
  • 举报
回复
甲乙两个视一定有效?即在甲视中接受消息时,乙视窗口一定是存在的吗?如果是
可以用消息发送。声明一个全局变量保存乙视窗口句柄,在甲视中发送自定义
消息.
MFC串口通信程序代码,含界面 // 串口通信.cpp : 定义应用程序的类行为。 // #include "stdafx.h" #include "串口通信.h" #include "串口通信Dlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // C串口通信App BEGIN_MESSAGE_MAP(C串口通信App, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP() // C串口通信App 构造 C串口通信App::C串口通信App() { // 支持重新启动管理器 m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART; // TODO: 在此处添加构造代码, // 将所有重要的初始化放置在 InitInstance 中 } // 唯一的一个 C串口通信App 对象 C串口通信App theApp; // C串口通信App 初始化 BOOL C串口通信App::InitInstance() { // 如果一个运行在 Windows XP 上的应用程序清单指定要 // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, //则需要 InitCommonControlsEx()。 否则,将无法创建窗口。 INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); // 将它设置为包括所有要在应用程序中使用的 // 公共控件类。 InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); AfxEnableControlContainer(); // 创建 shell 管理器,以防对话框包含 // 任何 shell 树视图控件或 shell 列表视图控件。 CShellManager *pShellManager = new CShellManager; // 激活“Windows Native”视觉管理器,以便在 MFC 控件中启用主题 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); // 标准初始化 // 如果未使用这些功能并希望减小 // 最终可执行文件的大小,则应移除下列 // 不需要的特定初始化例程 // 更改用于存储设置的注册表项 // TODO: 应适当修改该字符串, // 例如修改为公司或组织名 SetRegistryKey(_T("应用程序向导生成的本地应用程序")); C串口通信Dlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: 在此放置处理何时用 // “确定”来关闭对话框的代码 } else if (nResponse == IDCANCEL) { // TODO: 在此放置处理何时用 // “取消”来关闭对话框的代码 } else if (nResponse == -1) { TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n"); TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n"); } // 删除上面创建的 shell 管理器。 if (pShellManager != NULL) { delete pShellManager; } // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序, // 而不是启动应用程序的消息泵。 return FALSE; }

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧