MFC基于对话窗口画一个随鼠标拖拽的三角形
时间: 2023-09-19 13:05:49 浏览: 194
在MFC中画三角形
5星 · 资源好评率100%
### 回答1:
首先创建一个对话框应用程序,然后将对话框的风格设置为Popup,这样对话框就没有标题栏,用户就不能拖动对话框。接下来,在对话框上添加一个静态控件,用于显示三角形。
在对话框类的头文件中添加以下代码:
```cpp
class CMyDlg : public CDialogEx
{
public:
CMyDlg(CWnd* pParent = nullptr);
enum { IDD = IDD_MYDIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX);
DECLARE_MESSAGE_MAP()
private:
CPoint m_Point1;
CPoint m_Point2;
CPoint m_Point3;
bool m_bDragging;
CRect m_Rect;
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg BOOL OnInitDialog();
afx_msg void OnPaint();
};
```
在对话框类的实现文件中添加以下代码:
```cpp
CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MYDIALOG, pParent)
{
m_Point1.SetPoint(100, 100);
m_Point2.SetPoint(150, 200);
m_Point3.SetPoint(200, 100);
m_bDragging = false;
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_PAINT()
END_MESSAGE_MAP()
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
if (m_Rect.PtInRect(point))
{
m_bDragging = true;
}
CDialogEx::OnLButtonDown(nFlags, point);
}
void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bDragging)
{
int dx = point.x - m_Rect.left;
int dy = point.y - m_Rect.top;
m_Point1.Offset(dx, dy);
m_Point2.Offset(dx, dy);
m_Point3.Offset(dx, dy);
m_Rect.OffsetRect(dx, dy);
Invalidate();
}
CDialogEx::OnMouseMove(nFlags, point);
}
void CMyDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bDragging = false;
CDialogEx::OnLButtonUp(nFlags, point);
}
BOOL CMyDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
m_Rect = CRect(m_Point1, m_Point3);
AdjustWindowRectEx(&m_Rect, GetStyle(), TRUE, GetExStyle());
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CMyDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CDialogEx::OnPaint() for painting messages
CBrush brush(RGB(255, 0, 0));
CBrush* pOldBrush = dc.SelectObject(&brush);
CPen pen(PS_SOLID, 1, RGB(0, 0, 255));
CPen* pOldPen = dc.SelectObject(&pen);
POINT points[] = { m_Point1, m_Point2, m_Point3 };
dc.Polygon(points, 3);
dc.SelectObject(pOldBrush);
dc.SelectObject(pOldPen);
}
```
在对话框类的资源文件中,添加一个静态控件,并设置其ID为IDC_STATIC,位置和大小可以自己调整。在对话框的OnInitDialog()函数中,调用AdjustWindowRectEx()函数,计算出窗口的客户区矩形,并存储在成员变量m_Rect中。在OnPaint()函数中,使用Polygon()函数绘制三角形。在OnLButtonDown()、OnMouseMove()和OnLButtonUp()函数中,实现拖拽功能。
最后,在应用程序的InitInstance()函数中,创建对话框并显示:
```cpp
CMyDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
```
运行程序,就可以在对话框上看到一个随鼠标拖拽的三角形了。
### 回答2:
在MFC中,可以通过继承CDialog类来创建对话框窗口,在对话框类的OnLButtonDown、OnLButtonUp和OnMouseMove函数中实现鼠标拖拽功能。以下是实现步骤:
1. 首先,在对话框类的头文件中添加成员变量m_bDrag和m_ptTriangle,用于记录是否正在拖拽和三角形的位置。
2. 在对话框类的OnInitDialog函数中初始化变量m_bDrag为false。
3. 在对话框类的OnLButtonDown函数中,先判断鼠标点击位置是否在三角形内。如果是,则设置m_bDrag为true,并保存当前鼠标位置到m_ptTriangle。
4. 在对话框类的OnLButtonUp函数中,将m_bDrag设置为false,结束拖拽。
5. 在对话框类的OnMouseMove函数中,判断m_bDrag是否为true。如果是,更新m_ptTriangle为当前鼠标位置,并调用Invalidate函数刷新窗口。
6. 在对话框类的OnPaint函数中,根据m_ptTriangle的坐标,绘制一个三角形。可以使用CDC的LineTo函数连接三个点,在对话框类的OnPaint函数中获取CDC对象,用于绘制。
7. 编译并运行程序,点击鼠标左键在对话框窗口内拖拽,即可看到随鼠标拖拽的三角形。
需要注意的是,在对话框类的OnPaint函数中绘制的内容会被覆盖,因此需要在每次绘制前将窗口区域擦除,可以使用CDC的FillSolidRect函数填充背景色。
### 回答3:
MFC是一个用于开发Windows应用程序的框架,其中包含了许多功能和类库,可以帮助开发人员创建用户界面和处理用户交互等任务。
在基于对话框的MFC应用程序中,我们可以通过继承CDialog类来创建自定义对话框类。在该类中,我们可以通过重写多个事件处理函数来实现对鼠标的响应。
为了在对话窗口上画一个随鼠标拖拽的三角形,我们可以按照以下步骤进行:
1. 在自定义对话框类的头文件中添加成员变量,用于存储鼠标拖拽后的三角形坐标。
```cpp
CPoint m_trianglePos;
```
2. 在对话框类的OnInitDialog函数中,启用鼠标消息和设置初始三角形坐标。
```cpp
BOOL CMyDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// 启用鼠标消息
SetCapture();
// 设置初始三角形坐标
m_trianglePos.x = 0;
m_trianglePos.y = 0;
return TRUE;
}
```
3. 在对话框类的OnMouseMove函数中,更新三角形坐标。
```cpp
void CMyDialog::OnMouseMove(UINT nFlags, CPoint point)
{
if (nFlags & MK_LBUTTON) // 鼠标左键按下时
{
// 更新三角形坐标为鼠标位置
m_trianglePos = point;
// 强制重绘对话框
RedrawWindow();
}
CDialog::OnMouseMove(nFlags, point);
}
```
4. 在对话框类的OnPaint函数中,根据三角形坐标绘制三角形。
```cpp
void CMyDialog::OnPaint()
{
CPaintDC dc(this);
// 创建绘图对象
CBrush brush(RGB(255, 0, 0)); // 红色画刷
CPen pen(PS_SOLID, 1, RGB(0, 0, 0)); // 黑色画笔
CBrush* pOldBrush = dc.SelectObject(&brush);
CPen* pOldPen = dc.SelectObject(&pen);
// 绘制三角形
CPoint vertices[3];
vertices[0] = m_trianglePos;
vertices[1] = CPoint(m_trianglePos.x + 50, m_trianglePos.y);
vertices[2] = CPoint(m_trianglePos.x, m_trianglePos.y + 50);
dc.Polygon(vertices, 3);
// 恢复绘图对象
dc.SelectObject(pOldBrush);
dc.SelectObject(pOldPen);
}
```
通过以上步骤,我们在基于对话框的MFC应用程序中成功实现了一个随鼠标拖拽的三角形。当鼠标左键按下并移动时,三角形的位置将跟随鼠标位置并实时更新。
阅读全文