我在MFC应用程序上有一个Dialog。
MyDialog :
{
int variable1;
int variable2;
Class1 cls = new Class1();
}
在class1()
中 Class1()
{
void Function1()
void Function2()
}
-
那么如何访问并返回到Class1中的variable1 :: Function1()
Class1::Function1()
{
MyDialog dlg = new MyDialog ();
Get x = dlg->variable1; //if like this, variable1 alway=0, because in above line, i'm define new myDialog()
}
我认为委托.NET,但在MFC应用程序中,我无法完成它?
答案 0 :(得分:3)
你可以
SendMessage
并处理父对话框中的消息GetParent
并将dynamic_cast
用于您的父对话框(需要父网址标题)1
Class1::Class1(MyParent *parent)
{
m_parentPointer = parent;
}
void Class1::Function1(void)
{
m_parentPointer->myPublicVariable;
}
2
void Class1::Function1(void)
{
CWnd *parent = GetParent();
if (parent)
parent->SendMessage(WM_YOUR_MESSAGE, yourWPARAM, yourLPARAM);
}
//MessageMap of parent
ON_MESSAGE(WM_YOUR_MESSAGE, ParentClassHandler)
LRESULT Parent::ParentClassHandler(WPARAM wp, LPARAM lp)
{
//Process
}
3
void Class1::Function1(void)
{
CWnd *parent = GetParent();
if (parent)
{
Parent *p = dynamic_cast<Parent*>(parent);
if (p)
{
//Process
}
}
}
答案 1 :(得分:2)
在深入研究之前,你必须从基础C ++课程开始。但这是如何完成的:
MyDialog dlg = new MyDialog ();
dlg->variable1 = 1; //set the variable
if (IDOK == dlg->DoModal()) //wait for user to click OK
{
int x = dlg->variable1; //get the variable
}
但是,dlg->variable1
除非您驾驶自己的课程并做一些改变,否则不会更改variable1
。
例如,您可以使用Dialog Data Exchange将void MyDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Check(pDX, IDC_CHECK1, variable1);
}
分配给复选框。
IDC_CHECK1
要尝试它,请使用Visual Studio的对话框向导创建一个复选框和一个编辑框。它可能会创建一个包含资源ID IDC_EDIT1
的复选框,这是一个资源ID设置为OnInitDialog
的编辑框。
另一种选择:
使用OnOK()
将变量分配给对话框控件
使用BOOL MyDialog::OnInitDialog()
{
//put `CString m_string1;` in class declaration
BOOL result = CDialog::OnInitDialog();
SetDlgItemText(IDC_EDIT1, m_string1);
return result;
}
void MyDialog::OnOK()
{
GetDlgItemText(IDC_EDIT1, m_string1);
CDialog::OnOK();
}
从对话框控件中获取变量:
function 3d(x, y, z, rotateX, rotateY, rotateZ){
var m = Matrix3D.create();
Matrix3D.translateX(m, x);
Matrix3D.translateY(m, y);
Matrix3D.translateZ(m, z);
Matrix3D.rotateX(m,this.data.rotateX);
Matrix3D.rotateY(m,this.data.rotateY);
Matrix3D.rotateZ(m,this.data.rotateZ);
return Matrix3D.toTransform3D(m);
}
答案 2 :(得分:2)
如果Class1::Function1()
需要访问该对话框,则需要指向Function1
中对话框的指针。
void Class1::Function1(MyDialog *dlg) {
}
如果要永久存储对话框指针,请调整Class1的构造函数。
class Class1 {
public:
Class1(class MyDialog *dlg_) : dlg(dlg_) {}
class MyDialog *dlg;
}
实现它的另一种可能更好的方法是将需要访问Class1和MyDialog的代码移动到全局函数或MyDialog成员函数中。但是走哪条路取决于课程的作用以及你想要的设计。