2013-07-02 31 views
0

我对MFC和Windows编程一般都比较陌生,我需要制作一种交互式图形,在这里我可以点击图形中的不同点画布和点击点之间的线条
到目前为止,我已经能够在静态图片框控件中绘制标准形状
但是,问题是如果我拖动包含绘制图形的对话框的部分在屏幕边缘之外,当我把它带回去的绘制图得到擦除
我需要它永久保留在静态控制
在阅读几个论坛问题后,我看到我需要派生我自己的静态控制cl屁股从CStatic类,然后编写我的代码在这个新的静态控制的OnPaint()函数,但我不明白如何正确地做到这一点,因为正确使用OnPaint函数和WM_PAINT我需要使用一些向导中提供的向导函数工作室,但我无法找到任何简单的教程,教如何做到这一点
任何想法,将不胜感激
这是我的代码到目前为止使用CClientDC在静态控件上绘制永久图片

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内要绘制这是一个静态图片框控件,每当按下命令按钮时

---- UPD ATE ----
我能够在的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 
} 

下一步是要能够借鉴这种静态控制显卡使用下面的代码来创建我diaog箱静态控制即使这个对话框被另一个对话框重叠也不会消失。对于这一点,在类我的自定义的静电控制,我包括使用类向导一个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()函数中还是在鼠标事件处理函数中进行?

+0

当您在论坛问题中阅读时,您是否从CStatic派生出了自己的类?如果你这样做,请使用MFC类wizzard创建类​​,这使添加OnPaint处理程序时更容易。 –

+0

我还没弄清楚如何使用类向导来派生类,坦白地说,至此我不确定这是否正是我需要做的;例如,可以说我从CStatic派生出一个名为CStatic_my的类,它的对象应该代表我的自定义静态控件;我如何将它放在我的对话框中?它是否显示为工具箱中的图标?或者我必须自己在OnInitDialog()中创建它,在这种情况下,我可能必须指定它的坐标,我不知道该怎么做 – user13267

+0

Class wizzard:右键单击项目,然后Class Wizzard,然后添加类(MFC类),然后base class = CStatic。您可以使用对话框编辑器将静态控件放入对话框中(并为控件/子类添加一个变量),但您也可以自己动态创建控件。使用对话框编辑器是更简单的方法。 –

回答

0

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

+0

哇,它的工作原理。非常感谢。我在'OnInitDialog()'函数中注释了我用来创建控件的代码。它用我的'CMy_Static'控件替换了我使用表单设计器放置的'CStatic'。我知道这是因为我已经放置了代码在'CMY_Static'的'OnPaint()'中绘制一个椭圆。然而,我从窗体设计器为'CStatic'控件定义的边框完全消失了。在哪里以及如何为CMy_Static指定外观? – user13267