使用C++ mfc 在对话框上自由画框 并实现点击拖拽 放大缩小
要在MFC对话框上实现自由画框并实现点击拖拽、放大缩小功能,可以按照以下步骤进行:
- 在对话框资源编辑器中添加一个Picture Control控件,作为绘图区域。
- 将该控件的属性设置为“可调整大小”和“无边框”,并为其添加一个自定义类CMyPictureCtrl。
- 在CMyPictureCtrl类头文件中添加以下成员变量和函数声明:
class CMyPictureCtrl : public CStatic
{
DECLARE_DYNAMIC(CMyPictureCtrl)
public:
CMyPictureCtrl();
virtual ~CMyPictureCtrl();
protected:
CPoint m_StartPoint; // 起始点
CPoint m_EndPoint; // 终止点
BOOL m_bIsDrawing; // 是否正在绘制
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
DECLARE_MESSAGE_MAP()
};
- 在CMyPictureCtrl类的实现文件中添加以下代码:
IMPLEMENT_DYNAMIC(CMyPictureCtrl, CStatic)
CMyPictureCtrl::CMyPictureCtrl()
{
m_bIsDrawing = FALSE;
}
CMyPictureCtrl::~CMyPictureCtrl()
{
}
BEGIN_MESSAGE_MAP(CMyPictureCtrl, CStatic)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_MOUSEWHEEL()
END_MESSAGE_MAP()
void CMyPictureCtrl::OnPaint()
{
CPaintDC dc(this); // 用于绘制的设备上下文
// TODO: 在此处添加消息处理程序代码
// 绘制矩形框
if (m_bIsDrawing)
{
CRect rect(m_StartPoint, m_EndPoint);
dc.DrawFocusRect(&rect);
}
}
void CMyPictureCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
m_StartPoint = point;
m_bIsDrawing = TRUE;
CStatic::OnLButtonDown(nFlags, point);
}
void CMyPictureCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
m_EndPoint = point;
m_bIsDrawing = FALSE;
CStatic::OnLButtonUp(nFlags, point);
}
void CMyPictureCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bIsDrawing)
{
m_EndPoint = point;
Invalidate(); // 重绘控件
}
CStatic::OnMouseMove(nFlags, point);
}
BOOL CMyPictureCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// 缩放处理
int delta = zDelta / WHEEL_DELTA;
int width = GetWindowWidth();
int height = GetWindowHeight();
int newWidth = width + delta;
int newHeight = height + delta;
if (newWidth > 0 && newHeight > 0)
{
SetWindowPos(NULL, 0, 0, newWidth, newHeight, SWP_NOMOVE | SWP_NOZORDER);
}
return CStatic::OnMouseWheel(nFlags, zDelta, pt);
}
- 在对话框的头文件中添加一个CMyPictureCtrl类对象成员变量:
class CMyDialog : public CDialogEx
{
// ...
private:
CMyPictureCtrl m_PictureCtrl;
};
- 在OnInitDialog()函数中添加以下代码,将Picture Control控件设置为CMyPictureCtrl类对象:
BOOL CMyDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
// ...
CRect rect;
GetDlgItem(IDC_PICTURE_CTRL)->GetWindowRect(&rect);
ScreenToClient(&rect);
m_PictureCtrl.Create(NULL, NULL, WS_VISIBLE | WS_CHILD | SS_NOTIFY, rect, this, IDC_PICTURE_CTRL);
return TRUE;
}
- 在对话框的消息映射中添加以下代码,处理WM_MOUSEWHEEL消息:
BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
ON_WM_MOUSEWHEEL()
// ...
END_MESSAGE_MAP()
BOOL CMyDialog::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
m_PictureCtrl.OnMouseWheel(nFlags, zDelta, pt);
return CDialogEx::OnMouseWheel(nFlags, zDelta, pt);
}
现在,你可以在对话框的Picture Control控件上自由画框,并且实现了点击拖拽和放大缩小功能
原文地址: https://www.cveoy.top/t/topic/hBDb 著作权归作者所有。请勿转载和采集!