0

私は一般的にMFCとWindowsプログラミングにかなり慣れていないため、キャンバス内のさまざまなポイントをクリックしてクリックしたポイント間に線を引くことができる一種のインタラクティブなグラフを作成する必要があります
これまでのところ、標準的な形状を描くことができました静的なピクチャ ボックス コントロールで
ただし、問題は、ダイアログ ボックスの一部を含むダイアログ ボックスの一部を画面の端の外にドラッグすると、描画された図が消去されて元に戻すと
、静的なコントロールに永久にとどまる必要があることです。
フォーラムの質問をいくつか読んだ後、CStatic クラスから独自の静的コントロール クラスを派生させ、この新しい静的コントロールの OnPaint() 関数にコードを記述する必要があることがわかりましたが、適切に行う方法がわかりません。 OnPaint 関数と WM_PAINT を適切にビジュアル スタジオで提供されているいくつかのウィザード関数を使用する必要がありますが、これを行う方法を教える簡単なチュートリアルが見つかりません
どんなアイデアでも大歓迎
です これは私がこれまでに持っているコードです

void Cpaint_using_dcDlg::OnBnClickedDraw()
{
    // TODO: Add your control notification handler code here
    COLORREF black = RGB(255, 0, 0);
    CPen pen(PS_SOLID, 1, black);
     CClientDC Dc(GetDlgItem(IDC_CANVAS));
    // CClientDC Dc(this);
    // Dc.MoveTo(0,0);
    Dc.SelectObject(&pen);
    CPoint point1(0,0);
    point1.x = 0;
    point1.y = 0;
    CPoint point2(0,0);
    point2.x = point1.x + 50;
    point2.y = point1.y + 50;
    Dc.Ellipse(CRect(point1, point2));
}

これにより、コマンド ボタンが押されるたびに、静的ピクチャ ボックス コントロールである IDC_CANVAS 内に楕円が描画されます。

---- 更新 ----
OnInitDialog() 関数で次のコードを使用して、ダイアログ ボックスに静的コントロールを作成できました。

BOOL Cpaint_using_dcDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);         // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    // TODO: Add extra initialization here
    CRect rect;
    CWnd *pWnd = GetDlgItem(IDC_CANVAS);
    pWnd->GetWindowRect(&rect);
    ScreenToClient(&rect); //optional step - see below
    // my_canvas.Create(NULL, WS_CHILD|WS_VISIBLE|SS_BLACKFRAME|SS_BLACKRECT|SS_ETCHEDFRAME , rect, this, 0x1111);
    my_canvas.Create(NULL, WS_CHILD|WS_VISIBLE|SS_BLACKFRAME, rect, this, 0x1111);

    return TRUE;  // return TRUE  unless you set the focus to a control
}

次のステップは、このダイアログ ボックスが別のダイアログ ボックスと重なっても消えることのない、この静的コントロールにグラフィックスを描画できるようにすることです。このために、カスタム スタティック コントロールのクラスに、クラス ウィザードを使用して OnPaint() 関数を含め、以下に示すように楕円を描画するコードを含めました。

void CMy_Canvas::OnPaint()
{
    CPaintDC dc(this); // device context for painting
    // TODO: Add your message handler code here
    // Do not call CStatic::OnPaint() for painting messages
    CPen pen;
    dc.SelectObject(&pen);
    // CPoint curPos;
    // GetCursorPos(&curPos);
    CPoint point1(0,0);
    point1.x = 0;
    point1.y = 0;
    CPoint point2(0,0);
    point2.x = point1.x + 50;
    point2.y = point1.y + 50;
    dc.Ellipse(CRect(point1, point2));
}

ただし、楕円を描画するようになりましたが、 を使用して生成された静的コントロールのアウトラインがmy_canvas.Create(NULL, WS_CHILD|WS_VISIBLE|SS_BLACKFRAME, rect, this, 0x1111);消えます。なぜそれが起こっているのですか?どうすれば回避できますか?また、実際に行う必要があるのは、このグラフをインタラクティブにして、マウス クリックを使用してこのコントロールに表示する曲線の構造を変更できるようにすることです。これを行うのに適切な WM_ メッセージはどれですか? WM_LBUTTONUPまたはあるべきだとWM_LBUTTONDOWN思いますが、よくわかりません。また、キャンバス上でクリックした 2 点間に線を引く必要があるとします。この線を引くコードはどこに置くべきですか? OnPaint() 関数またはマウス イベント ハンドラー関数に入れる必要がありますか?

4

1 に答える 1

0

OnInitDialog でカスタム スタティック コントロールを作成する必要はありません。ビジュアル デザイナーで作成した静的コントロール (IDC_CANVAS) を使用します。そのデザイナーでコントロールを右クリックし、コントロール メンバー変数を追加します。そのコントロール メンバー変数の型を CStatic から CMyCanvas に変更します。これで、カスタム コントロール クラスが OnPaint 呼び出しを受け取るはずです。

于 2013-07-02T13:39:40.323 に答える