使用CClientDC在静态控件上绘制永久图片(Visual C ++ 2010 MFC)

时间:2013-07-02 06:36:10

标签: mfc visual-c++-2010

我对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内部绘制椭圆,这是一个静态图片框控件

----更新----
我能够使用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_LBUTTONUPWM_LBUTTONDOWN,但我不确定。另外,假设我需要在画布上点击两点之间画一条线。我应该在哪里放置绘制此行的代码?它应该进入OnPaint()函数还是鼠标事件处理函数?

1 个答案:

答案 0 :(得分:0)

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