前言:

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. Event StoryLine Corpus 论文阅读

    Event StoryLine Corpus 论文阅读 本文是对 Caselli T, Vossen P. The event storyline corpus: A new benchmark fo ...

  2. 3. Django每日一码 之 Serializers 源码

    2019-7-6 今日源码:rest-framework 序列化Serializers 序列化组件Serializers 源码分析 首先,它需要 data .many . instance,其中 in ...

  3. PKIX:unable to find valid certification path to requested target

    1.Communications link failure,The last packet successfully received from the server was * **millisec ...

  4. 每日一问:Android 滑动冲突,你们都是怎样处理的

    坚持原创日更,短平快的 Android 进阶系列,敬请直接在微信公众号搜索:nanchen,直接关注并设为星标,精彩不容错过. 在 Android 开发中,滑动冲突总是我们一个无法避免的话题.而对于解 ...

  5. k8s学习 - 概念 - ReplicaSet

    k8s学习 - 概念 - ReplicaSet 首先,ReplicaSet 和 ReplicationController 基本上一样,除了上篇说到的selector有不同之外,没有啥区别.(官网也是 ...

  6. SSAS Tabular 数据表关系与join的映射

    才想起来总结这两天发现的一个有趣的现象: 在SSAS Tabular 模型中建立了关系之后,在excel中分析发现: 产品库龄作为量值:Aging Stock:=sum([DISTRIBUTOR_ST ...

  7. spring boot 整合lombok+tkmapper+mybatis-generator

      1.lombok <dependency>    <groupId>org.projectlombok</groupId>    <artifactId& ...

  8. 怎样在自己的网页中调用百度API

    https://blog.csdn.net/u010251278/article/details/52877370 以下内容转自上述网站,为了以后的学习方便,为此才特地将该网站内容转到自己的博客,多谢 ...

  9. C#5.0新增功能01 异步编程

    连载目录    [已更新最新开发文章,点击查看详细] 如果需要 I/O 绑定(例如从网络请求数据或访问数据库),则需要利用异步编程. 还可以使用 CPU 绑定代码(例如执行成本高昂的计算),对编写异步 ...

  10. java练习---9

    //程序员:罗元昊 2017.10.22 package cn.lyh; import com.rupeng.game.GameCore; public class L implements Runn ...