2013-10-28 89 views
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類中的代表編輯框中的值的變量代入MyView類的OnDraw函數中的圖形公式中。

例如,如果我想從MyDialog調用MyView中的方法,我必須創建新對象,並且所有事情都會變得混亂。我有類似的問題與靜態變量。

請注意,我來自Java背景,所以我的C++有點模糊。如果這不是一個複雜的問題,我會提前道歉。

回答

2

,如果我要調用MyView的方法從MyDialog

您通常不希望這樣做。通過描述,您的對話框具有您想要在視圖中使用的值(某處)。使用標準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

+1這是一個常用的方法來做到這一點。另一種MFC Doc/View「方法」是讓App本身充當理想主義的MVC控制器,在模型中設置成員(即Doc),並使視圖無效,就像這裏所做的那樣。 – WhozCraig

+0

爲什麼我需要'm_StringDataMember'? – CodyBugstein

+0

@Imray你需要存儲*值的地方*。文檔(在MFC中)是您通常存儲數據的地方,您的視圖是您顯示數據的地方(想法是您可能擁有同一數據的多個視圖 - 實際上,非平凡的MFC應用程序可以使用該視圖事實上廣泛)。 –

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 
}