从另一个访问变量

时间:2013-10-28 14:37:50

标签: c++ mfc

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

  • CWinApp衍生物,MyWinApp
  • CDocument衍生物,MyDocument
  • CView衍生物,MyView
  • 名为CFrameWnd
  • CMainFrame衍生物

最后是一个对话框类,派生自CDialog名为

  • MyDialog

MyDialog有一个编辑框,允许用户输入整数值。点击OK后,我希望将该值(让我们称之为s_value)用于函数MyView::OnDraw(CDC* pDC){...}

内的绘图算法

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

{...
SetPixel(posX, posY, (s_value < 5) ? color1 : color2);
... }

但是我无法弄清楚如何将位于MyDialog类内的编辑框中的值表示为OnDraw函数中MyView函数内的绘图公式}类。

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

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

2 个答案:

答案 0 :(得分:2)

  

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

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

// in your document declaration
public:
    CString m_StringDataMember; // NOTE:  you may want to create accessors instead of public members - this is shown this way for simplicity.

// somewhere in your view
MyDialog dlg;
if (dlg.DoModal() == IDOK)
{
    ((MyDocument*)GetDocument())->m_StringDataMember = dlg.m_EditBoxValue; // assuming you created the edit box and had it map to a CString variable already
    Invalidate();
}

// In your OnDraw or OnUpdate function
MyDocument* pDlg = ((MyDocument*)GetDocument());
// Do something with pDlg->m_StringDataMember

如果你想使用一个整数值,过程是类似的(但是,你可能想要设置最小值和最大值,并在对话框中使用微调控件)。

答案 1 :(得分:0)

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

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
}