VC中的CMainFrame,CView,CDocument有什么关系
编号:QA004384
建立日期: 2001年9月3日 最后修改日期:2001年9月3日
所属类别:
Q
蒋功:
操作系统: win98
编程工具: vc6.0
问题: 我想请教几个问题:
1.
这里有一个小程序:
#include "iostream.h"
class a
{
int i;
public:
void seti(int j);
void testpointer(void *arglist);
void aprint();
};
void a::seti(int j)
{
i=j;
}
void a::aprint()
{
cout< }
void a::testpointer(void *arglist)
{
a *port=(a *)arglist;
port->seti(100);
cout<<"Hello!\n"
}
void main()
{
a mya;
a *apointer=new a;
mya.seti(20);
mya.aprint();
mya.testpointer(apointer);
mya.aprint();
}
程序的结果:
20
Hello!
20
为什么没有输出100?我是照着别人的程序写的,但是不明白下列句子:a *port=(a *)arglist;
这好像是指向自身的指针,不知道具体的用途和方法是什么.
2.在调用上面的程序中的testpointer()方法时,传递给它的参数应该是什么?感觉应该可以传递给它这个类的一个对象的指针,可以吗?怎样做?
3.
VC中的各个类CMainFrame,CView,CDocument,应该不是孤立的,他们有什么关系?我在资源下的菜单项中加入了ID_FILE_SEEVIEW项,并生成消息映射函数:
void CMainFrame::OnSeeView()
{
CMyprojectView *pView=
(CMyprojectView *)GetActiveView();
}
结果编译说:
CMyprojectView,和pView未定义
在头文件中加入:#include "MyprojectView.h"
还是出错,为什么?应该怎样在VC的各类中访问数据?多谢你的回答!
水平: 刚入门
A回答:
关于第一个问题是这样的:在你的主程序中有两个a类的变量,一个是mya,一个是apointer所指的那个变量。注意这两个变量是不同的。mya.seti(20)设置mya.i的值,而mya.testpointer设置的是apointer->i的值,而mya.i的值没有改变,还是20。mya.aprint()输出的是mya.i的值,而不是apointer->i的值。所以100没有输出。testpointer()方法的参数应该是一个a类的指针,但并不一定就是指向自身的指针。就如同你的例子中,它可以是apointer,但apointer不对于&mya。
Frame、View、Document的关系,非常重要,它们的确不是孤立的,而是互相联系的。由于没有看到完整的程序,你也没有说错误是什么,所以判断你的程序在加入头文件之后不正确有点困难。但你可以按照下面的叙述来查一下:
如果是SDI程序,CMainFrame调用GetActiveView获得CView,而CView可以调用GetDocument获得CDocument。如果已知CDocument,可以使用GetFirstViewPosition获得第一个相关的CView,然后使用GetNextView获得下一个的CView。之所以这么做,是因为MFC允许一个CDocument拥有多个CView。你可以使用下面的这段代码来获得一个CDocument拥有的所有CView:
POSITION pos = GetFirstViewPosition();
CView* pFirstView = GetNextView( pos );
// This example uses CDocument::GetFirstViewPosition
// and GetNextView to repaint each view.
void CMyDoc::OnRepaintAllViews()
{
POSITION pos = GetFirstViewPosition();
while (pos != NULL)
{
CView* pView = GetNextView(pos);
pView->UpdateWindow();
}
}
如果是MDI程序,稍微复杂一些。你不能直接调用GetActiveView,而需要先调用CMainFrame::MDIGetActive获得当前的CMDIChildWnd,而这个CMDIChildWnd相当于SDI中的CMainFrame。
此问题由李海回答。
附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, 窗体与菜单, form, window, tform。
| |
|
|
| |
|
|