C++ 从另一个访问变量

C++ 从另一个访问变量,c++,mfc,C++,Mfc,我正在开发一个简单的MFC程序,它由三个类组成(由Visual Studio向导自动生成): ACWinApp衍生品,MyWinApp ACDocument衍生品,MyDocument ACView衍生品,MyView 称为cmainframeWnd的衍生工具CMainFrame 最后是一个对话框类,它是从名为 MyDialog MyDialog有一个允许用户输入整数值的编辑框。单击OK后,我希望在函数MyView::OnDraw(CDC*pDC){…}内的绘图算法中使用该值(我们称之为

我正在开发一个简单的MFC程序,它由三个类组成(由Visual Studio向导自动生成):

  • A
    CWinApp
    衍生品,
    MyWinApp
  • A
    CDocument
    衍生品,
    MyDocument
  • A
    CView
    衍生品,
    MyView
  • 称为
    cmainframeWnd
    的衍生工具
    CMainFrame
最后是一个对话框类,它是从名为

  • MyDialog
MyDialog
有一个允许用户输入整数值的编辑框。单击
OK
后,我希望在函数
MyView::OnDraw(CDC*pDC){…}内的绘图算法中使用该值(我们称之为
s_值

例如,
OnDraw()
函数类似于:

{...
SetPixel(posX, posY, (s_value < 5) ? color1 : color2);
... }
MyDialog::MyDialog( MyDocument* pDoc, CWnd* pParent /*=NULL*/)
    : CDialog(MyDialog::IDD, pParent)
    , m_pDoc(pDoc)
{
}

ON_EN_CHANGE(IDC_SVALUE, &MyDialog::OnEnChangeSValue)

void MyDialog::OnEnChangeSValue()
{
    m_pDoc->SetSValue( GetDlgItemInt( IDC_SVALUE ));
}


void MyDocument::SetSValue( int svalue )
{
    m_svalue = svalue;
    UpdateAllViews( NULL, HINT_SVALUE );
}

void MyView::OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint )
{
    if( lHint == HINT_SVALUE ) do something
}
{。。。
SetPixel(posX,posY,(s_值<5)?颜色1:color2;
... }
但是,我不知道如何将位于
MyDialog
类中的编辑框中表示值的变量放入
MyView
类中
OnDraw
函数中的绘图公式中

例如,如果我想从
MyDialog
调用
MyView
中的方法,我必须创建新对象,而一切都变得一团糟。我对静态变量也有类似的问题

请注意,我来自java背景,所以我的C++有点模糊。如果这不是一个复杂的问题,我提前道歉

如果我想从MyDialog调用MyView中的方法

您通常不想这样做。根据您的描述,您的对话框中有一个您希望在视图(某处)中使用的值。使用标准MFC范例(与其他模型-视图-控制器范例非常类似),您希望将编辑框(对话框上)的值作为变量存储在文档中。然后,当视图正在绘制时,它会从文档中提取数据以进行渲染。它看起来像这样(伪代码):


如果您想使用整数值(不过,您可能希望设置最小值和最大值,并在对话框中使用微调器控件),则过程类似。

对话框是模态还是非模态?如果是模态,请使用Zac Howland的建议,等待dlg.DoModal()返回,然后将整数值存储在文档中或直接存储在视图类中。如果它是无模式的,则必须将指向文档或视图对象的指针传递到对话框构造函数中。然后为EN_更改通知编写一个处理程序,并调用视图或文档方法来更新该值。可能是这样的:

{...
SetPixel(posX, posY, (s_value < 5) ? color1 : color2);
... }
MyDialog::MyDialog( MyDocument* pDoc, CWnd* pParent /*=NULL*/)
    : CDialog(MyDialog::IDD, pParent)
    , m_pDoc(pDoc)
{
}

ON_EN_CHANGE(IDC_SVALUE, &MyDialog::OnEnChangeSValue)

void MyDialog::OnEnChangeSValue()
{
    m_pDoc->SetSValue( GetDlgItemInt( IDC_SVALUE ));
}


void MyDocument::SetSValue( int svalue )
{
    m_svalue = svalue;
    UpdateAllViews( NULL, HINT_SVALUE );
}

void MyView::OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint )
{
    if( lHint == HINT_SVALUE ) do something
}

+1这是一种常见的方法。另一种MFC文档/视图“方式”是让应用程序本身充当理想的MVC控制器,在模型中设置成员(即文档),并按此处所做的方式使视图无效。为什么我需要
m_StringDataMember
?@Imray您需要存储在某处的值。文档(在MFC中)是您通常存储数据的地方,视图是您显示数据的地方(其思想是您可以潜在地拥有相同数据的多个视图-事实上,非平凡的MFC应用程序可能会广泛地利用这一事实)。