我正在开发一个简单的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 ++有点模糊。如果这不是一个如此复杂的问题,我会事先道歉。
答案 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
}