MFC对话框之间数据的传递

写了一个直方图对话框,要在上面画直方图,画图的时候要用到的数据在主对话框里,怎么用其中的数据呢?

1,全局变量一:1,在任何一个CPP文件的函数体外声明(不能加关键字static,否则链接性为内部,只能在该文件中使用), 此时为定义声明,它给变量分配存储空间。2,在要使用全局变量的函数体外用关键字extern声明,此时为引用声明,表示这个变量为外部的,它不给变量分配内存空间,只是引用已有的变量。注意:引用声明使用关键字extern,且不进行初始化工作,否则,声明为定义声明,导致分配内存空间。

    全局变量二:用MFC生成的工程中都有一个名为CxxxApp的类,它派生于CWinApp类。这个类主要进行程序的初始化,生成文档、视图对象等工作。我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实现全局访问了。从严格意义上讲,这种变量和函数并不是全局的,因为它仍然只是类中的成员,只是由于我们很容易获得CxxxApp类的指针,所以我们可以在文档、视 图、对话框以及各种自定义类中访问到它们,达到与全局变量类似的效果。访问时用函数“AfxGetApp()”获得CxxxApp类的指针,用 “AfxGetApp()->成员”访问变量或函数。

CBaseOnDialogShowApp *pAPP = (CBaseOnDialogShowApp *)AfxGetApp();
	for(int i = 0; i < 256; i++)
	{
		pAPP->m_nAPPHist[i] = m_Dib.m_nHistogram[i];
	}

   全局变量三:

全局变量和全局函数最好集中封装,不要在文档、视图等类内部定义,这样用起来才有全局的感觉。

例:

1、添加一个没有基类的新类,设类名起为CPublic,姑且称之为公用类

单击“Insert”菜单下的“New Class”命令,选择“Class type”为“Generic Class”,在“Name”栏中填入类名“CPublic”,单击“OK”,则新类建立完毕。

2、包含公用类的头文件,使各个类都能访问它

CPublic的头文件应包含在应用程序类的头文件中,这样在其它类中引用CPublic类时就不需要再包含了。

Test.h:(应用程序类头文件) 

#include "Public.h" //包含公用类头文件

class CTestApp : public CWinApp
{
…………
};

3、在公用类中定义全局变量和全局函数,均使用static修饰,静态变量还必须在类外定义和初始化

Public.h:(公用类头文件)

class CPublic
{
public:
CPublic();
virtual ~CPublic();

public:
static int x; //全局变量
static int time; //全局变量
static int f(int y); //全局函数
…………
}

在公用类中对静态变量进行初始化和定义函数体:

Public.cpp:(公用类程序文件)

int CPublic::x = 0; //初始化全局变量
int CPublic::time; //定义全局变量,重要

CPublic::CPublic()
{

}

CPublic::~CPublic()
{

}

int CPublic::f(int y) //全局函数,这里不要再加static
{
y++;
return y;
}

4、全局量的使用

使用变量:CPublic::变量名

使用函数:CPublic::函数()

如在视图的某函数中访问变量x和函数f():

void CTestView::xyz()
{
CPublic::x = 0; //访问变量x
CPublic::time = CPublic::f(1); //访问函数f()
…………
}

在其它类中访问x、time和f()的方法与此相同。

5、几点注意:

① 由于静态量可独立于类存在,不需要生成CPublic类的实例。

② 静态数据成员的定义和初始化必须在类外进行,如例中x的初始化;变量time虽然没有初始化,但也必须在类外进行定义。由于没有生成CPublic类的实例,所以它的构造函数和析构函数都不会被执行,在里面做什么工作都没有什么意义。

③ 如果静态函数需要访问CPublic类内的变量,这些变量也必须为静态的。因为非静态量在不生成实例时都不会存在。

 


 

2,CBaseOnDialogShowDlg *pWnd = (CBaseOnDialogShowDlg *)AfxGetMainWnd();就可以获得主对话框的指针。

那么,另一方面,在主对话框中怎么操作别的对话框呢?我是在主对话框的菜单“打开”中显示完图像之后立马显示一个关于该图像信息的对话框,这个对画框就得用到主对话框当中的数据。 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页