我对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_LBUTTONUP
或WM_LBUTTONDOWN
,但我不确定。另外,假设我需要在画布上点击两点之间画一条线。我应该在哪里放置绘制此行的代码?它应该进入OnPaint()函数还是鼠标事件处理函数?
答案 0 :(得分:0)
您无需在OnInitDialog中创建自定义静态控件。使用您在可视化设计器中创建的静态控件(IDC_CANVAS)。在该设计器中右键单击控件并添加控件成员变量。将控制成员变量类型从CStatic更改为CMyCanvas。现在,您的自定义控件类应该接收OnPaint调用。