0

一般来说,我对 MFC 和 windows 编程相当陌生,我需要制作一种交互式图形,我可以在其中单击画布中的不同点并在单击的点之间绘制线条
到目前为止,我已经能够绘制标准形状在静态图片框控件中
但是问题是,如果我将包含绘图图形的对话框部分拖动到屏幕边缘之外,当我将它带回来时,绘制的图形会被擦除
,我需要它永久保留在静态控件中
在阅读了几个论坛问题后,我发现我需要从 CStatic 类派生我自己的静态控件类,然后在 OnPaint() 函数中为这个新的静态控件编写我的代码,但我无法理解如何正确执行,因为要使用OnPaint 函数和 WM_PAINT 正确我需要使用 Visual Studio 中提供的一些向导函数,但我找不到任何简单的教程来教如何做到这一点
任何想法将不胜感激
这是我到目前为止的代码

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 内绘制一个椭圆,该 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但我不确定。另外,假设我需要在画布上单击的两点之间画一条线。我应该把画这条线的代码放在哪里?它应该放在 OnPaint() 函数中还是鼠标事件处理函数中?

4

1 回答 1

0

您不需要在 OnInitDialog 中创建自定义静态控件。使用您在可视化设计器中创建的静态控件 (IDC_CANVAS)。在该设计器中,右键单击控件并添加控件成员变量。将该控制成员变量类型从 CStatic 更改为 CMyCanvas。现在您的自定义控件类应该会收到 OnPaint 调用。

于 2013-07-02T13:39:40.323 回答