0

我正在开发一个简单的 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内部的绘图公式中。OnDrawMyView

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

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

4

2 回答 2

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

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

于 2013-10-28T14:48:37.567 回答
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
}
于 2013-10-31T00:38:54.800 回答