要在MFC对话框上实现自由画框并实现点击拖拽、放大缩小功能,可以按照以下步骤进行:

  1. 在对话框资源编辑器中添加一个Picture Control控件,作为绘图区域。
  2. 将该控件的属性设置为“可调整大小”和“无边框”,并为其添加一个自定义类CMyPictureCtrl。
  3. 在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()
};
  1. 在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);
}
  1. 在对话框的头文件中添加一个CMyPictureCtrl类对象成员变量:
class CMyDialog : public CDialogEx
{
    // ...

private:
    CMyPictureCtrl m_PictureCtrl;
};
  1. 在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;
}
  1. 在对话框的消息映射中添加以下代码,处理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控件上自由画框,并且实现了点击拖拽和放大缩小功能

使用C++ mfc 在对话框上自由画框 并实现点击拖拽 放大缩小

原文地址: https://www.cveoy.top/t/topic/hBDb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录