VC++ SDI程序中对话框调用视图类函数与变量的方法

4星 · 超过85%的资源 需积分: 50 68 下载量 159 浏览量 更新于2024-07-26 1 收藏 164KB DOC 举报
"在Windows应用程序开发中,特别是使用MFC(Microsoft Foundation Classes)框架时,经常需要在不同的类之间通信,比如在对话框类中调用视图类(CView派生类)的功能。本文主要探讨如何在对话框类内部访问和操作CView类的函数与变量。" 在SDI(Single Document Interface)程序中,视图(View)和对话框(Dialog)通常负责UI的不同部分。视图是文档窗口中显示和编辑数据的部分,而对话框通常用于展示临时信息或用户输入。有时,我们可能需要在对话框中触发视图类的行为,例如根据对话框的用户输入更新视图中的界面元素。 以下是一种常见的做法: 1. 首先,你需要获取到当前活动的主框架窗口(CMainFrame)的指针,可以使用`AfxGetMainWnd()`函数来获取。 2. 然后,通过主框架窗口获取到当前活动的视图(CView派生类)的指针,使用`GetActiveView()`方法。 3. 如果需要,你还可以获取到与视图关联的文档(CDocumet)的指针,使用`GetActiveDocument()`方法。 在上述过程中,可能会遇到编译错误,如“undeclared identifier”或“missing ';' before '*'”。这通常是因为缺少了相关的头文件包含。例如,如果你的视图类是CXXView,你需要在对话框类的头文件中包含"CXXView.h"。但如果这样做导致了语法错误,可能是因为在"CXXView.h"中又引用了未包含的"CXXDoc.h"。在这种情况下,你应该确保在包含"CXXView.h"之前先包含"CXXDoc.h",以解决依赖问题。 当你需要在对话框类中调用视图类的方法时,可以像这样: ```cpp // 假设你已经有了CXXView* pView的指针 pView->YourViewMethod(); ``` 若要修改视图中的变量,假设有一个成员变量叫做`m_var`: ```cpp // 假设你已经有了CXXView* pView的指针 pView->m_var = newValue; ``` 对于更复杂的情况,比如在视图中响应按钮点击事件,弹出对话框,并在对话框中操作视图的控件,你可以使用消息映射和命令ID。在视图的ON_COMMAND()宏中处理按钮点击,然后打开对话框。在对话框的按钮点击事件中,通过已获取的视图指针修改视图中的控件: ```cpp // 在视图类的消息映射中 ON_COMMAND(IDC_BUTTON_IN_VIEW, OnButtonClickInView) void CXXView::OnButtonClickInView() { // 打开对话框 CMyDialog dlg; dlg.DoModal(); } // 在对话框类中,假设有一个按钮ID为IDC_BUTTON_IN_DIALOG ON_BN_CLICKED(IDC_BUTTON_IN_DIALOG, OnButtonInDialogClick) void CMyDialog::OnButtonInDialogClick() { CMainFrame*pMain = (CMainFrame*)AfxGetMainWnd(); CXXView*pView = (CXXView*)pMain->GetActiveView(); // 假设你有一个CEdit控件,ID为IDC_EDIT_IN_VIEW CEdit* pEdit = (CEdit*)pView->GetDlgItem(IDC_EDIT_IN_VIEW); pEdit->SetWindowTextW(L"新的文本"); } ``` 在涉及到图形处理时,可能需要获取到视图的设备上下文(Device Context,CDC),以便进行绘图操作。通过视图类的`GetDC()`方法可以得到: ```cpp CDC* pDC = pView->GetDC(); // 使用pDC进行绘图 ``` 要在对话框类中调用视图类的函数和变量,关键在于正确地获取到视图类的指针,并确保包含了所有必要的头文件。同时,遵循MFC的消息映射机制,使得类间的交互更加有序和可维护。在进行跨类操作时,注意类型安全和异常处理,以防止程序出现未预期的错误。