CDC(HDC)绘图类:

五大GDI对象类:CPen,CBrush,CFont,CBitmap,CRgn

24.1 梯形分页的双缓冲改进和尺寸自适应

24.2 蝴蝶跟随鼠标点击运动

class CHitFlyDlg : public CDialogEx
{CMemoryDC m_dc;//缓冲enum { PAGE_COUNT = 7 };CMemoryDC m_dcBack;CMemoryDC m_dcFly[PAGE_COUNT];int m_nIndex;CPoint m_pos,m_des;//中心点与目标public:CHitFlyDlg(CWnd* pParent = NULL); // 标准构造函数
protected:HICON m_hIcon;virtual BOOL OnInitDialog();afx_msg void OnPaint();
public:afx_msg void OnTimer(UINT_PTR nIDEvent);afx_msg BOOL OnEraseBkgnd(CDC* pDC);afx_msg void OnNcPaint();afx_msg void OnLButtonDown(UINT nFlags, CPoint point);void rePosition();
};
BOOL CHitFlyDlg::OnInitDialog()
{CDialogEx::OnInitDialog();int cx = GetSystemMetrics(SM_CXSCREEN);int cy = GetSystemMetrics(SM_CYSCREEN);m_pos.SetPoint(cx / 2, cy / 2);m_des = m_pos;MoveWindow(0, 0, cx, cy, FALSE);m_dc.Create(cx, cy);//缓冲dcm_dcBack.LoadBitmap(_T("./images/back.bmp"));//背景dcint i = -1;CString str;while (++i<_countof(m_dcFly)){str.Format(_T("./images/%03d.bmp"), i + 1);m_dcFly[i].LoadBitmap(str);//7张蝴蝶dc}SetTimer(1, 20, NULL);SetIcon(m_hIcon, TRUE);          // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CHitFlyDlg::OnPaint()
{CPaintDC dc(this); // 用于绘制的设备上下文CRect rect;GetClientRect(rect);//dc.BitBlt(0, 0, m_dcBack.GetWidth(), m_dcBack.GetHeight(), &m_dcBack, 0, 0, SRCCOPY);m_dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &m_dcBack, 0, 0, m_dcBack.GetWidth(), m_dcBack.GetHeight(), SRCCOPY);if (m_pos != m_des)rePosition();CPoint point = m_pos-CPoint(m_dcFly->GetWidth() / 2, m_dcFly->GetHeight() / 2);m_dcFly[m_nIndex].BitTrans(point.x,point.y, m_dcFly->GetWidth(), m_dcFly->GetHeight(), &m_dc, 0, 0, 0);dc.BitBlt(0, 0, rect.Width(), rect.Height(), &m_dc, 0, 0, SRCCOPY);if (++m_nIndex > 6)m_nIndex = 0;
}
void CHitFlyDlg::OnTimer(UINT_PTR nIDEvent)
{Invalidate(FALSE);CDialogEx::OnTimer(nIDEvent);
}BOOL CHitFlyDlg::OnEraseBkgnd(CDC* pDC)
{return TRUE;
}void CHitFlyDlg::OnNcPaint()
{}void CHitFlyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{m_des = point;CDialogEx::OnLButtonDown(nFlags, point);
}void CHitFlyDlg::rePosition()
{int cx = m_des.x - m_pos.x;int cy = m_des.y - m_pos.y;int r = sqrt(cx*cx + cy*cy);if (r < 5)m_pos = m_des;else{m_pos.x += cx * 5 / r;m_pos.y += cy * 5 / r;}
}

24.3 QQ宠物静止版

void MakeRgn(CRgn& r, COLORREF clTrans)//假设背景颜色是:0,0,0{if (r.GetSafeHandle())r.DeleteObject();r.CreateRectRgn(0, 0, 0, 0);//空RGNint x=0, y=0;int cx = m_size.cx,cy=m_size.cy;while (y < cy){x = 0;while (x < cx){if (GetPixel(x, y) != clTrans){CRgn r1;//一个像素大小的RGNr1.CreateRectRgn(x, y, x + 1, y + 1);//面积为1x1的RGNr.CombineRgn(&r, &r1,RGN_OR);}++x;}++y;}}
BOOL CQQDlg::OnInitDialog()
{CDialogEx::OnInitDialog();m_dcFly.LoadBitmap(_T("./images/001.bmp"));MoveWindow(500, 500, m_dcFly.GetWidth(), m_dcFly.GetHeight(), FALSE);CRgn r;m_dcFly.MakeRgn(r, 0);this->SetWindowRgn(r,FALSE);SetIcon(m_hIcon, TRUE);            // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CQQDlg::OnPaint()
{CPaintDC dc(this); // 用于绘制的设备上下文dc.BitBlt(0, 0, m_dcFly.GetWidth(), m_dcFly.GetHeight(), &m_dcFly, 0, 0, SRCCOPY);/*CRect rect;GetClientRect(rect);dc.FillSolidRect(rect, RGB(255, 0, 0));*/
}
HCURSOR CQQDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}BOOL CQQDlg::OnEraseBkgnd(CDC* pDC)
{return TRUE;
}
void CQQDlg::OnNcPaint()
{}LRESULT CQQDlg::OnNcHitTest(CPoint point)
{return HTCAPTION;
}

24.4 QQ宠物动画版

class CQQDlg : public CDialogEx
{// 构造enum {FLY_COUNT=7};CMemoryDC m_dcFly[FLY_COUNT];CRgn m_rs[FLY_COUNT];int m_nIndex;//当前第几帧BOOL CQQDlg::OnInitDialog()
{CDialogEx::OnInitDialog();CString str;int i = 0;while (i < _countof(m_dcFly)){str.Format(_T("./images/%03d.bmp"),i+1);m_dcFly[i].LoadBitmap(str);m_dcFly[i].MakeRgn(m_rs[i], 0);++i;}int x = GetSystemMetrics(SM_CXSCREEN), y = GetSystemMetrics(SM_CYSCREEN);MoveWindow(x/2, y/2, m_dcFly->GetWidth(), m_dcFly->GetHeight(), FALSE);CRgn r;r.CreateRectRgn(0, 0, 0, 0); //必须得先创建一个空白的进行初始化r.CopyRgn(m_rs);//m_rs 等价于 &m_rs[0]this->SetWindowRgn(r,FALSE); //CRgn对象只能设置一次,设置后失效,因此先复制到新对象r中SetIcon(m_hIcon, TRUE);           // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标SetTimer(1, 16, NULL);// TODO: 在此添加额外的初始化代码return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CQQDlg::OnPaint()
{CPaintDC dc(this); // 用于绘制的设备上下文//&m_dcFly[m_nIndex]等价于m_dcFly+m_nIndexdc.BitBlt(0, 0, m_dcFly->GetWidth(), m_dcFly->GetHeight(), m_dcFly+m_nIndex, 0, 0, SRCCOPY);/*CRect rect;GetClientRect(rect);dc.FillSolidRect(rect, RGB(255, 0, 0));*/
}
HCURSOR CQQDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}BOOL CQQDlg::OnEraseBkgnd(CDC* pDC)
{// TODO: 在此添加消息处理程序代码和/或调用默认值return TRUE;
}void CQQDlg::OnNcPaint()
{}LRESULT CQQDlg::OnNcHitTest(CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值return HTCAPTION      ;
}void CQQDlg::OnTimer(UINT_PTR nIDEvent)
{CRgn r;r.CreateRectRgn(0, 0, 0, 0);r.CopyRgn(&m_rs[m_nIndex]);SetWindowRgn(r, TRUE);//Invalidate(FALSE);if (++m_nIndex > 6)m_nIndex = 0;CDialogEx::OnTimer(nIDEvent);
}

24.5 单文档应用程序——绘图软件

24.5.1 矢量图和非矢量图:

矢量图,也称为面向对象的图像或绘图图像,在数学上定义为一系列由线连接的点。

矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。

矢量图是根据几何特性来绘制图形,矢量可以是一个点或一条线,矢量图只能靠软件生成,文件占用内在空间较小,因为这种类型的图像文件包含独立的分离图像,可以自由无限制的重新组合。

它的特点是放大后图像不会失真,和分辨率无关,适用于图形设计、文字设计和一些标志设计、版式设计等。

矢量图软件包括:

corel draw
adobe flash(HTM5取代)

非矢量图形软件包括:

adobe Photoshop。
windows画笔

24.5.2 图形软件的设计:

a)每个层可是圆形、矩形、圆角矩形、直线、铅笔画等等;

b)如果是圆形或矩形层,就需要记录矩形数据(RECT);

c)如果是直线层,就需要记录两个点;

d)如果是铅笔话,就需要记录动态多个点;

【MFC系列-第24天】梯形分页和蝴蝶QQ宠物的实现相关推荐

  1. 【MFC系列-第22天】GDI算法实战——过渡色

    关注公号[逆向通信猿]更精彩!!! 第22天 GDI算法实战 CDC(HDC)绘图类: 五大GDI对象类:CPen,CBrush,CFont,CBitmap,CRgn 22.1 走马灯 设置定时器 S ...

  2. STM32 基础系列教程 24 - USB_HID_key

    前言 学习stm32 USB接口使用,学会用CUBE工具快速创建USB设备工程及调试,关于usb的相关知道请读者提前准备并学习,当然如果不想深究其中原理的话,跟着本文来操作就可以实现基于USB的设备开 ...

  3. mfc 监控文件操作_商务办公好伴侣 兄弟MFC系列多功能一体机

    谈到多功能一体机产品,大家应该对兄弟品牌旗下的MFC系列并不陌生,该系列产品线跨度广,无论是中小型企业或是政府机关.事业单位等用户都有覆盖,凭借着MFC系列一体机高速.高质量.低成本等特点,MFC系列 ...

  4. 【Git 教程系列第 24 篇】Support for password authentication was removed on August 13, 2021. Please use a

    这是[Git 教程系列第 24 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:问题描述 二:使用 SSH 方式拉取远端代码 一:问题描述 今天从 GitHub 上拉取一个项目时,报出如下图所示 ...

  5. 【Android 教程系列第 24 篇】在 Android Studio 中清理缓存的两种方式

    这是[Android 教程系列第 24 篇],如果觉得有用的话,欢迎关注专栏. 一:问题描述 昨天的安卓项目还好好的,今天早上打开的时候说我引入 R 文件还有其它的类出现了错误,然后点击任意一个类几乎 ...

  6. VTK+MFC 系列教程 非常强大

    虽然QT才是王道!MFC的懂一些也是好的. 原文链接:http://blog.csdn.net/www_doling_net/article/details/8939115 之前介绍了基于VTK的单文 ...

  7. MFC系列 - 第一个MFC入门程序

    MFC,多年开发和教学,这门课程,新课改决定将它砍掉,Qt也是我们的趋势,同时在我的Qt系列中详细讲解了Qt的系列教学.MFC虽然很古老,但是还是得佩服微软搞得这套框架,让一代又一代Windows程序 ...

  8. 飞思卡尔MC9S12系列单片机地址影射以及分页问题

    对于用MCU的人来说,不一定要明白HCS12(x) memory map的机制和联系.因为如果没有系统地学习操作系统和编译原理之类的课程,确实有些难度.并且,对于DG128 XS128这样的MCU,默 ...

  9. 【MySQL性能优化系列】百万数据limit分页优化

    背景 众所周知,在使用limit分页过程中,随着前端传过来的PageSize越来越大,查询速度会越来越慢.那有什么优化的办法呢? 本文将通过百万数据表进行演示和优化, 欲知详情,请看下文分解. lim ...

最新文章

  1. android打开项目更换版本,android1.6项目,换成其他包的方法,及修改默认启动虚拟机的版本...
  2. C#实现对指定文件夹中文件按修改时间排序
  3. element ui表单校验prop的链式写法----源码分析
  4. 初学Oracle的一点心得
  5. opencv 矫正图片
  6. 计算机与计算机视觉史话
  7. Eclipse手动添加dtd文件使xml能自动提示
  8. 狗汪汪玩转嵌入式——I2C 协议分析
  9. 【无标题】数据安全相关法律法规学习记录
  10. Ubuntu 16.04 安装iNode客户端
  11. Win10插入U盘无反应,但是U盘是正常的解决方法
  12. win7 java 开发环境搭建教程_Java开发环境配置教程(win7 64bit)
  13. 在线 服务器 web,web服务器是什么?
  14. 魔童降世-暴走的哪吒
  15. php sybase存储过,SYBASE存储过程详解
  16. 电脑通过热点共享网络,手机连接热点可以访问其他内网
  17. 微信小程序中如何将数据保存到内存中并且读取的同步写法
  18. react指定ref的三种方式
  19. 《孤岛危机》游戏系统需求列表出炉 您的机器还行吗?
  20. Oracle高级查询之over(partition by..)

热门文章

  1. Spring Data Solr教程:向所有存储库添加自定义方法
  2. 用Jackson进行Java JSON处理
  3. 声明定义存储过程或者函数时,其中的 delimiter 关键字是干嘛的呢?
  4. JSP动作元素/活动元素
  5. 算法提高 日期计算c语言,算法提高 日期计算
  6. 将serversocket 写在按钮事件中连接不上_Java服务器的模型—TCP连接/流量优化
  7. excel未完全加载怎么办_你知道如何改变Excel的打开姿势吗?
  8. python mysql 连接6_寒假学习进度-6(Python连接MySQL数据库)
  9. 学java专科_专科学历可以学习java开发吗
  10. 光纤转CAN总线在消防报警主机联网中的应用