在CMainFrame类里如何调用View类的方法???

doall4u 2003-08-23 12:39:13
我在CMainFrame里添加了一个菜单事件,一点就调用View类的ShowMessage()方法,我试了试不行,总出错.
void CSDIView::ShowMessage()
{
MessageBox("zhengjia!!!");
}
void CMainFrame::OnOoTest()
{
// TODO: Add your command handler code here

CSDIView::ShowMessage();
}
各位指点一下
...全文
120 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐代的农民 2003-08-25
  • 打赏
  • 举报
回复
CSDIDoc* GetDocument();
xghost 2003-08-25
  • 打赏
  • 举报
回复
在MainFrm.cpp中加#include "***Doc.h" ;
在MainFrm.cpp中加#include "***View.h" ;

注意头文件的顺序


doall4u 2003-08-24
  • 打赏
  • 举报
回复
up
houdy 2003-08-24
  • 打赏
  • 举报
回复
可能是头文件重包含的问题。
wl3c 2003-08-24
  • 打赏
  • 举报
回复
谁能说说原因啊?
doall4u 2003-08-24
  • 打赏
  • 举报
回复
哦,我没有看清楚,这次可以了,但是方法是不是太繁琐啦,为什么在CSDIView类定义前加class CSDIDoc呢????
唐代的农民 2003-08-24
  • 打赏
  • 举报
回复
你的ShowMessage();是protected:类型
当然会出错啦
建议你先看看C++的书吧。
look4u 2003-08-24
  • 打赏
  • 举报
回复
liushax() :我照你的做了,但:
--------------------Configuration: SDI - Win32 Debug--------------------
Compiling...
MainFrm.cpp
E:\VC_EXE\SDI\MainFrm.cpp(112) : error C2248: 'ShowMessage' : cannot access protected member declared in class 'CSDIView'
e:\vc_exe\sdi\sdiview.h(38) : see declaration of 'ShowMessage'
Error executing cl.exe.

SDI.exe - 1 error(s), 0 warning(s)


我的ShowMessage是这样声明的:
class CSDIView : public CView
{
protected: // create from serialization only
CSDIView();
DECLARE_DYNCREATE(CSDIView)

// Attributes
public:
CSDIDoc* GetDocument();

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSDIView)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
//}}AFX_VIRTUAL
void ShowMessage();
后面省略....
不明白了
唐代的农民 2003-08-24
  • 打赏
  • 举报
回复
1: 在MainFrm.cpp中加#include "SDIView.h",
2: 在CSDIView类定义前加class CSDIDoc;
3: MainFrm.cpp类中实现如下
void CMainFrame::OnOoTest()

CTempMdiView *pView = (CTempMdiView*)GetActiveView();
pView->ShowMessage();

不用我再说了吧
xghost 2003-08-23
  • 打赏
  • 举报
回复
up
doall4u 2003-08-23
  • 打赏
  • 举报
回复
up!
doall4u 2003-08-23
  • 打赏
  • 举报
回复
up!
doall4u 2003-08-23
  • 打赏
  • 举报
回复
liushax() :
跟本不用发,我通过向导建立了一个SDI工程,什么都没动,就加了这么两个函数,你建个试试
唐代的农民 2003-08-23
  • 打赏
  • 举报
回复
xingxhen6@163.com,是否介意发过来?
houdy 2003-08-23
  • 打赏
  • 举报
回复
我也遇到这样的问题,你试试这样:
在CYourApp中添加各种视或文档的指针,在那些视或文档初始化的时候将指针传给CYourApp中的对应变量。这样以后不管在哪用上面指针只需(CYourApp*)AfxGetApp()取其属性变量即可。
如:
CMyApp* pApp=(CMyApp*) AfxGetApp();
pApp->pView->ShowMessage();
试试这样,看怎么样。
doall4u 2003-08-23
  • 打赏
  • 举报
回复
去掉头文件,在class CMainFrame类定义前加Class CSDIView,出错:
--------------------Configuration: SDI - Win32 Debug--------------------
Compiling...
MainFrm.cpp
E:\VC_EXE\SDI\MainFrm.cpp(37) : error C2146: syntax error : missing ';' before identifier 'CSDIView'
E:\VC_EXE\SDI\MainFrm.cpp(37) : error C2501: 'Class' : missing storage-class or type specifiers
E:\VC_EXE\SDI\MainFrm.cpp(37) : fatal error C1004: unexpected end of file found
Error executing cl.exe.
doall4u 2003-08-23
  • 打赏
  • 举报
回复
liushax():
加头文件我也试过了,出错:
-------------------Configuration: SDI - Win32 Debug--------------------
Compiling...
MainFrm.cpp
e:\vc_exe\sdi\sdiview.h(21) : error C2143: syntax error : missing ';' before '*'
e:\vc_exe\sdi\sdiview.h(21) : error C2501: 'CSDIDoc' : missing storage-class or type specifiers
e:\vc_exe\sdi\sdiview.h(21) : error C2501: 'GetDocument' : missing storage-class or type specifiers
E:\VC_EXE\SDI\MainFrm.cpp(114) : error C2248: 'ShowMessage' : cannot access protected member declared in class 'CSDIView'
e:\vc_exe\sdi\sdiview.h(37) : see declaration of 'ShowMessage'
Error executing cl.exe.

SDI.exe - 4 error(s), 0 warning(s)
唐代的农民 2003-08-23
  • 打赏
  • 举报
回复
晕,不会连这点编译错误还要请教人家吧??
在class CMainFrame类定义前加Class CSDIView;或者#include "SDIView.h"
doall4u 2003-08-23
  • 打赏
  • 举报
回复
SoLike(是我) :
你的方法我试过,不行;
--------------------Configuration: SDI - Win32 Debug--------------------
Compiling...
MainFrm.cpp
E:\VC_EXE\SDI\MainFrm.cpp(112) : error C2065: 'CSDIView' : undeclared identifier
E:\VC_EXE\SDI\MainFrm.cpp(112) : error C2065: 'pView' : undeclared identifier
E:\VC_EXE\SDI\MainFrm.cpp(112) : error C2059: syntax error : ')'
E:\VC_EXE\SDI\MainFrm.cpp(113) : error C2227: left of '->ShowMessage' must point to class/struct/union
Error executing cl.exe.

SDI.exe - 4 error(s), 0 warning(s)
思危 2003-08-23
  • 打赏
  • 举报
回复
CSDIView* pView = (CSDIView*)GetActiveView();
pView->ShowMessage();
加载更多回复(4)
Visual C++ 知识库电子书 VC 知识库文章 VC 知识库Faqs VC 知识库Tips VC++5.0是Microsoft新近推出的可视化C++集成开发环境。它在继承以前VC++的基础上增加了许多新的功能,用于支持Win32平台应用程序、服务程序和控件的开发。VC++5.0提供了强大、快捷的编程工具,其中最基本的是三个导航: AppWizard用于程序框架的生成,AppStudio用于资源的编辑, ClassWizard用于的编辑和管理。其中,窗口、菜单等无需用户编写程序,而由系统自动生成。但在许多情况下,用户要设置自己希望的窗口(即定制窗口)。 一、如何在多文档界面下去掉开始的子窗口 在多文档界面下,自动生成一个新的子窗口,而一个实际的应用系统往往是由用户操作后再生成新的窗口。为了去掉开始的子窗口,可在应用程序文件分析命令行的语句 CcommandLineInfo cmdInfo; ParseCommandLine(cmdInfo);后加入: cmdInfo.m_nShellCommand=CcommandLineInfo::FileNothing; 去掉子窗口后,就只剩下主框架窗口了。因为在多文档界面中,系统生成两个菜单:一个是用户的菜单,另一个是系统主框架菜单。通常用户工作在用户菜单。为了保证菜单界面不变,可修改主框架菜单资源,使其与用户菜单保持一致。 二、修改窗口标题栏 在缺省情况下,窗口标题栏中显示的文档名为文件名。若要在标题栏显示一个长字符串,而又不修改文件名,则可将项目工作区转换到 Resource View面版,选择串表( StringTable)资源,在StringTable中双击 IDR-MAIN-FRAME项,caption中显示一字符串xx yy......,将第一个参数修改为用户自己希望见到的主窗口标题即可。 三、修改主框架窗口、子窗口及其显示性质 可通过覆盖CWnd的成员函数PreCreateWindow来修改主窗口和子窗口。PreCreateWindow函数在即将创建窗口前被调用,函数原型为: Virtual BOOL PreCreateWindow(CREATESTRUCT cs) 如果要覆盖 PreCreateWindow函数,则在创建窗口前可以修改 CREATESTRUCT结构以替换缺省参数。CREATESTRUCT结构存放窗口特征,如窗口坐标、风格等,还可以定义新窗口风格, 若想修改主框架窗口,则可以在MainFrm.cpp的下列成员函数中加入待修改的内容。例如: BOOL CmainFrame::PreCreateWindow(CREATESTRUCT&cs) { //通过修改CREATESTRUCT结构来修改窗口或风格 //定义新窗口的高度、宽度 cs.cx=450; cs.cy=300; //定义新窗口风格为去掉主窗口名及最大化等按钮 cs.style=ws-POPWINDO; return CframeWnd::PreCreateWindow(cs); } 定制子窗口的操作与上述主窗口相同,可在 ChildFrm.cpp中加入以下内容: BOOL CmainFrame::PreCreateWindow(CREATESTRUCT&cs) { //通过修改CREATESTRUCT结构来修改窗口或风格

16,472

社区成员

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

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

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