MFC动态画直线(响应WM_MOUSEMOVE)

来源:互联网 发布:python接口测试框架 编辑:程序博客网 时间:2024/06/05 06:06

VS2010代码备份,基于MFC对话框示例


GDI版:


1、DrawLineDlg.h

// DrawLineDlg.h : 头文件//#pragma once// CDrawLineDlg 对话框class CDrawLineDlg : public CDialogEx{// 构造public:CDrawLineDlg(CWnd* pParent = NULL);// 标准构造函数// 对话框数据enum { IDD = IDD_DRAWLINE_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 支持// 实现protected:HICON m_hIcon;CPoint m_ptBegin;CPoint m_ptEnd;CDC dcMemory;BOOL m_bLBtnDown;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);};

2、DrawLineDlg.cpp

// DrawLineDlg.cpp : 实现文件//#include "stdafx.h"#include "DrawLine.h"#include "DrawLineDlg.h"#include "afxdialogex.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx{public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// CDrawLineDlg 对话框CDrawLineDlg::CDrawLineDlg(CWnd* pParent /*=NULL*/): CDialogEx(CDrawLineDlg::IDD, pParent), m_ptBegin(0, 0), m_ptEnd(0, 0), m_bLBtnDown(FALSE){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CDrawLineDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CDrawLineDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()END_MESSAGE_MAP()// CDrawLineDlg 消息处理程序BOOL CDrawLineDlg::OnInitDialog(){CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标// TODO: 在此添加额外的初始化代码return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE}void CDrawLineDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}}// 如果向对话框添加最小化按钮,则需要下面的代码//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,//  这将由框架自动完成。void CDrawLineDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CPaintDC dc(this);dc.MoveTo(m_ptBegin);dc.LineTo(m_ptEnd);CDialogEx::OnPaint();}}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSOR CDrawLineDlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}void CDrawLineDlg::OnLButtonDown(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值m_ptBegin = point;m_bLBtnDown = TRUE;CDC* pDC = GetDC();CRect rcClient;GetClientRect(&rcClient);CBitmap oBitmap;oBitmap.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height());if (dcMemory.m_hDC != NULL){dcMemory.DeleteDC();}dcMemory.CreateCompatibleDC(pDC);dcMemory.SelectObject(&oBitmap);dcMemory.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), pDC, 0, 0, SRCCOPY);oBitmap.DeleteObject();ReleaseDC(pDC);CDialogEx::OnLButtonDown(nFlags, point);}void CDrawLineDlg::OnLButtonUp(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值m_ptEnd = point;m_bLBtnDown = FALSE;dcMemory.DeleteDC();Invalidate();CDialogEx::OnLButtonUp(nFlags, point);}void CDrawLineDlg::OnMouseMove(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值if (m_bLBtnDown){CDC* pDC = GetDC();CRect rcClient;GetClientRect(&rcClient);pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &dcMemory, 0, 0, SRCCOPY);pDC->MoveTo(m_ptBegin);pDC->LineTo(point);ReleaseDC(pDC);}CDialogEx::OnMouseMove(nFlags, point);}

3、源码:http://download.csdn.net/detail/wwkaven/8097005


GDI+版:


4、GDI_Plus_DrawLineDlg.h

// GDI_Plus_DrawLineDlg.h : 头文件//#pragma once#include <GdiPlus.h>#pragma comment(lib, "Gdiplus.lib")// CGDI_Plus_DrawLineDlg 对话框class CGDI_Plus_DrawLineDlg : public CDialogEx{// 构造public:CGDI_Plus_DrawLineDlg(CWnd* pParent = NULL);// 标准构造函数// 对话框数据enum { IDD = IDD_GDI_PLUS_DRAWLINE_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 支持// 实现protected:HICON m_hIcon;Gdiplus::GdiplusStartupInput gdiplusStartupInput;ULONG_PTR gdiplusToken;Gdiplus::Point m_ptBegin;Gdiplus::Point m_ptEnd;BOOL m_blBtmDown;CDC m_dcMemory;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:afx_msg void OnDestroy();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 OnEraseBkgnd(CDC* pDC);};

5、GDI_Plus_DrawLineDlg.cpp

// GDI_Plus_DrawLineDlg.cpp : 实现文件//#include "stdafx.h"#include "GDI_Plus_DrawLine.h"#include "GDI_Plus_DrawLineDlg.h"#include "afxdialogex.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx{public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// CGDI_Plus_DrawLineDlg 对话框CGDI_Plus_DrawLineDlg::CGDI_Plus_DrawLineDlg(CWnd* pParent /*=NULL*/): CDialogEx(CGDI_Plus_DrawLineDlg::IDD, pParent), m_blBtmDown(FALSE){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);// Initialize GDI+.Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);m_ptBegin = Gdiplus::Point(0, 0);m_ptEnd = Gdiplus::Point(0, 0);}void CGDI_Plus_DrawLineDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CGDI_Plus_DrawLineDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_DESTROY()ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_WM_ERASEBKGND()END_MESSAGE_MAP()// CGDI_Plus_DrawLineDlg 消息处理程序BOOL CGDI_Plus_DrawLineDlg::OnInitDialog(){CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标// TODO: 在此添加额外的初始化代码return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE}void CGDI_Plus_DrawLineDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}}// 如果向对话框添加最小化按钮,则需要下面的代码//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,//  这将由框架自动完成。void CGDI_Plus_DrawLineDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CPaintDC dc(this);Gdiplus::Graphics graphics(dc.m_hDC);Gdiplus::Pen pen(Gdiplus::Color::Black, 2);graphics.DrawLine(&pen, m_ptBegin, m_ptEnd);CDialogEx::OnPaint();}}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSOR CGDI_Plus_DrawLineDlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}void CGDI_Plus_DrawLineDlg::OnDestroy(){CDialogEx::OnDestroy();// TODO: 在此处添加消息处理程序代码Gdiplus::GdiplusShutdown(gdiplusToken);}void CGDI_Plus_DrawLineDlg::OnLButtonDown(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值m_ptBegin = Gdiplus::Point(point.x, point.y);m_blBtmDown = TRUE;CDC* pDC = GetDC();CRect rcClient;GetClientRect(&rcClient);CBitmap oBitmap;oBitmap.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height());if (m_dcMemory.m_hDC != NULL){m_dcMemory.DeleteDC();}m_dcMemory.CreateCompatibleDC(pDC);m_dcMemory.SelectObject(&oBitmap);m_dcMemory.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), pDC, 0, 0, SRCCOPY);oBitmap.DeleteObject();ReleaseDC(pDC);CDialogEx::OnLButtonDown(nFlags, point);}void CGDI_Plus_DrawLineDlg::OnLButtonUp(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值m_ptEnd = Gdiplus::Point(point.x, point.y);m_blBtmDown = FALSE;m_dcMemory.DeleteDC();Invalidate();CDialogEx::OnLButtonUp(nFlags, point);}void CGDI_Plus_DrawLineDlg::OnMouseMove(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值if (m_blBtmDown){CDC* pDC = GetDC();CRect rcClient;GetClientRect(&rcClient);pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_dcMemory, 0, 0, SRCCOPY);Gdiplus::Graphics graphics(pDC->m_hDC);Gdiplus::Pen pen(Gdiplus::Color::Black, 2);graphics.DrawLine(&pen, m_ptBegin, Gdiplus::Point(point.x, point.y));ReleaseDC(pDC);}CDialogEx::OnMouseMove(nFlags, point);}BOOL CGDI_Plus_DrawLineDlg::OnEraseBkgnd(CDC* pDC){// TODO: 在此添加消息处理程序代码和/或调用默认值return TRUE;//return CDialogEx::OnEraseBkgnd(pDC);}

6、源码:http://download.csdn.net/detail/wwkaven/8097307



0 0
原创粉丝点击