前言:

GDI+从Windows XP操作系统(大概2002-2003年)开始引入的,现在都9102年了,再学习这么古老的技术肯定是过时了。windows桌面程序没落了,随着移动的兴起,用户被惯坏了,现在,用户对界面的要求不只是可以用,

而且天生(自发、自然而然)的希望界面能够顺滑、流畅、微动画、抽屉效果、淡入淡出等等。使用GDI+去实现这些高端的界面需求是十分困难而工作量巨大的。因此,建议转前端学习html5,跨平台,效果又炫。如果硬要在windows

上开发,可以关注下NUI(natural user interface)。

那,我为什么仍然写这个博客呢。额,一言难尽,个人目前面临转型的困难。一直都在windows平台上开发与工作,去转个前端新手肯定不太乐意。而且,也没系统得学习过GDI+,觉得花一个月系统学习下还是值得的吧。人,

往往想的太多,做的太少。写这个系列也为了督促自己。如果对他人有益就更好了。

我接触GDI+是因为最近的两个需求,项目是基于网易云信Duilib开发的。

一个是圆角矩形(GDI+抗锯齿比较好)  github:https://github.com/netease-im/NIM_Duilib_Framework/pull/98

另外个是圆形进度条。   github:https://github.com/netease-im/NIM_Duilib_Framework/pull/105

ok,废话不多说,开始学习吧。(本文的源码可以参考github:https://github.com/xuhuajie-NetEase/GDI-Study/

GDI+ 提供二维的矢量图形,改进旧有的GDI,加强的可视化属性,例如边界,渐变和透明。通过GDI+,能够直接将BMP转成JPG或其它格式的图片,还能够生成SVG、Flash等。GDI+ 使用ARGB的值来表示颜色。GDI+的双缓

冲技术可以提高绘图效率,可避免屏幕闪烁。关于GDI的详细使用可以参考《windows程序设计》一书,该书非常的有质量。也是我从事windows客户端开发的启蒙书。最重要的就是DC的概念(一般翻译成设备上下文), 通过往DC里

面加画笔、画刷、字体等等元素,然后就可以画画了。对,整个窗口(准确的说是窗口有效区域【额,更准确的说是刷新区域】)可以理解为一张画布,你可以通过DC(提前准备好笔【粗细、颜色】)然后在合适的位置做画。GDI+

最重要的概念则是Graphics对象(所以这个UI模型称为GUI,注意与目前流行的NUI的区别),再新建额外的笔(pen)对象,通过Graphics去画画。

void GDIDrawLine(HDC hdc)
{
HPEN hPen, hPenOld;
hPen = CreatePen(PS_SOLID,3,RGB(255,0,0));
hPenOld=(HPEN)::SelectObject(hdc, hPen); //往DC放画笔对象
::MoveToEx(hdc, 50, 50, NULL);
::LineTo(hdc, 700, 50);
::SelectObject(hdc, hPenOld); //这是个好习惯
::DeleteObject(hPen); //释放画笔
hPen = CreatePen(PS_SOLID, 3, RGB(0, 255, 0));
hPenOld = (HPEN)::SelectObject(hdc, hPen); //往DC放画笔对象
::MoveToEx(hdc, 50, 100, NULL);
::LineTo(hdc, 700, 100);
::SelectObject(hdc, hPenOld); //这是个好习惯
::DeleteObject(hPen); //释放画笔
}
void GDIPlusDrawLine(HDC hdc)
{
Graphics graphics(hdc);
Pen blue(Color(255/*不透明*/, 255, 0, 0), 3);
graphics.DrawLine(&blue, 50, 150, 700, 150);
Pen green(Color(255/*不透明*/, 0, 255, 0), 3);
graphics.DrawLine(&green, 50, 200, 700, 200);
}

如上可见,GDI+对于复杂地绘画,逻辑简单了很多,GDI的DC与各类绘画工具强绑定,而 GDI+则取消了这种关联。

我们先来简单的试试吧。1、打开vs工具,新建一个窗口程序(win32),点击确定。再点击完成。

2、 在cpp上加上引用项与库文件

#include <objidl.h>
#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;

3、在合适地方加上GDI+的初始化

    // Initialize GDI+
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

4、 在WM_PAINT方法下面非常加上GDI与GDI+的函数

5、编译运行看下效果吧。

从零开始学习GDI+ (一)的更多相关文章

  1. 从零开始学习GDI+ (二) 基本概念与基本操作

    从零开始学习GDI+ (一)我的第一个GDI+程序 上文给新手学习GDI+讲述了vs环境等的准备工作,并且可以直接用GDI+绘图了.本文开始,讲述的可能偏理论,建议学习的过程中大胆尝试,多使用API. ...

  2. 从零开始学习GDI+ (三) 画笔与画刷

  3. ASP.NET从零开始学习EF的增删改查

           ASP.NET从零开始学习EF的增删改查           最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...

  4. 从零开始学习jQuery (五) 事件与事件对象

    本系列文章导航 从零开始学习jQuery (五) 事件与事件对象 一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解 ...

  5. 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式

    本系列文章导航 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 一.摘要 本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得 ...

  6. 从零开始学习jQuery (三) 管理jQuery包装集

    本系列文章导航 从零开始学习jQuery (三) 管理jQuery包装集 一.摘要 在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着 ...

  7. 从零开始学习jQuery (二) 万能的选择器

    本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...

  8. 从零开始学习jQuery (一) 入门篇

    本系列文章导航 从零开始学习jQuery (一) 入门篇 一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些 ...

  9. 从零开始学习jQuery(转)

    本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery ( ...

随机推荐

  1. c++学习书籍推荐《深度探索C++对象模型》下载

    百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...

  2. 剑指offer第二版-总结:排序算法

    1.排序算法比较: 2.java实现 快排: /** * 快排 * * @since 2019年2月26日 下午1:37:34 * @author xuchao */ public class Qui ...

  3. mybatis基础配置

    我这个写的比较简略,是自己短时间记录的可能只适合自己看,新手或者不懂的建议看看下面大神这篇: https://www.cnblogs.com/homejim/p/9613205.html 1.MyBa ...

  4. C# 管道式编程

    受 F# 中的管道运算符和 C# 中的 LINQ 语法,管道式编程为 C# 提供了更加灵活性的功能性编程.通过使用 扩展函数 可以将多个功能连接起来构建成一个管道. 前言 在 C# 编程中,管道式编程 ...

  5. R语言矩阵

    矩阵是元素布置成二维矩形布局的R对象. 它们包含相同原子类型的元素. R创建矩阵的语法: matrix(data, nrow, ncol, byrow, dimnames) 参数说明: data - ...

  6. [JavaWeb] Ubuntu下载eclipse for ee

    进入网站进行下载 https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/2019- ...

  7. Excel催化剂100+大主题功能梳理导读

    Excel催化剂历经1年4个月的开发时间,终于荣登100+个大主题功能,完成数据领域的功能大矩阵,可以说在日常的数据处理及分析上,绝大部分的共性场景已经囊括其中,是数据工作者难得一遇的优秀作品之一.因 ...

  8. IIS短文件名漏洞复现

    IIS短文件名漏洞复现 一.漏洞描述 此漏洞实际是由HTTP请求中旧DOS 8.3名称约定(SFN)的代字符(~)波浪号引起的.它允许远程攻击者在Web根目录下公开文件和文件夹名称(不应该可被访问). ...

  9. RabbitMQ(三):RabbitMQ与Spring Boot简单整合

    RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.Spring Boot的兴起,极大地简化了Spring的开发,本文将使用Spring Boot与RabbitM ...

  10. 15款好用超赞的chrome插件, 开发者们的必备~

    今天推荐一波Chrome插件干货.这些插件带给我开发效率上的提升.所以在这里整理一下,分享给朋友们. 作为一名程序开发者,推荐一波常用的chrome插件,用了就舍不得丢,包括免费FQ工具,github ...