0

私は、3 つのクラス (Visual Studio ウィザードによって自動的に生成されます) で構成される単純な MFC プログラムに取り組んでいます。

  • CWinApp派生物、MyWinApp
  • CDocument派生物、MyDocument
  • CView派生物、MyView
  • と呼ばれるCFrameWnd派生物CMainFrame

CDialog最後に、 namedから派生したダイアログ ボックス クラス

  • MyDialog

MyDialogユーザーが整数値を入力できる編集ボックスがあります。クリックした後、関数内の描画アルゴリズムでOKその値(と呼びましょう)を使用したいと思いますs_valueMyView::OnDraw(CDC* pDC){...}

たとえば、OnDraw()関数は次のようになります。

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

ただし、クラス内にある編集ボックスの値を表す変数を、クラス内の関数MyDialog内の描画式に取得する方法がわかりません。OnDrawMyView

たとえば、MyViewfromのメソッドを呼び出したい場合MyDialog、新しいオブジェクトを作成する必要があり、すべてがめちゃくちゃになります。静的変数にも同様の問題があります。

私はJavaのバックグラウンドを持っているので、私のC ++は少しあいまいです。これがそれほど洗練された質問でない場合は、事前にお詫び申し上げます。

4

2 に答える 2

0

ダイアログはモーダルですか、それともモードレスですか? モーダルの場合は、 dlg.DoModal() が戻るまで待機するという Zac Howland の提案を使用してから、整数値をドキュメントに格納するか、ビュー クラスに直接格納します。モードレスの場合は、ドキュメントまたはビュー オブジェクトへのポインターをダイアログ コンストラクターに渡す必要があります。次に、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 に答える