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
- MFC动态画直线(响应WM_MOUSEMOVE)
- MFC动态画矩形(响应WM_MOUSEMOVE)
- MFC画直线(3)
- MFC 动态菜单 及响应(转)
- MFC中画直线
- js 动态画直线
- javascript 动态画直线
- MFC-菜单的动态(增加 插入 删除 响应)
- MFC 画直线 减少闪烁
- MFC中的画直线方法
- MFC创建画直线程序
- VB托盘图标不响应WM_MOUSEMOVE的原因及解决方法
- MFC 直线
- MFC动态添加按钮以及消息响应
- MFC动态添加菜单并响应,优缺点(响应函数不能动态添加)
- MFC 动态的Bresenham直线画法 最详细的讲解,,,
- MFC中动态创建BUTTON及添加响应的响应
- MFC中画直线和曲线
- 《c程序设计语言》读书笔记
- 从hadoop框架与MapReduce模式中谈海量数据处理
- squidclient
- JedisConnectionException: java.net.SocketException: Broken pipe
- 工作笔记5.JAVA文本框验证码
- MFC动态画直线(响应WM_MOUSEMOVE)
- acd - 1403 - Graph Game(博弈 + 二分图最大匹配)
- javascript的函数
- c/c++预处理
- 【UML】------四种关系
- 解决EditText跟ScrollView滑动冲突
- 文件夹对话框两种解决方案
- PBOC规范研究之四、文件结构及访问
- 线程