前言:

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. win10win7office系列激活工具 KMSAuto Net 2016 v1.5.4 绿色便携版

    下载地址:点我 KMSpico又称KMS激活工具,KMSpico是目前成功且经常更新的Windows激活工具,可以激活任何版本的window系统和任何版本的Office软件,即使是win8和offic ...

  2. vue项目缓存最佳实践

    需求 在开发vue的项目中有遇到了这样一个需求:一个视频列表页面,展示视频名称和是否收藏,点击进去某一项观看,可以收藏或者取消收藏,返回的时候需要记住列表页面的页码等状态,同时这条视频的收藏状态也需要 ...

  3. 哈工大计算机网络Week2-网络应用数据交换

    目录 网络应用数据交换 P2P应用:原理与文件分发 纯P2P架构 文件分发:客户机/服务器 vs. P2P CS 为什么是这样的?不应该传送和发出难道是并行的??? P2P P2P文件分发典型例子:B ...

  4. Apache Dubbo已不再局限于Java语言

    2017 年 9 月 7 日,在沉寂了4年之后,Dubbo 悄悄的在 GitHub 发布了 2.5.4 版本.随后又迅速发布了 2.5.5.2.5.6.2.5.7 等release.在 2017年 1 ...

  5. 手动启动log4j|nginx实现http https共存

    手动加载log4j.xml文件 DOMConfigurator.configure("src/main/resources/log4j.xml"); log4j.propertie ...

  6. Jenkins构建部署jar/war后,服务无法在后台持续运行的解决方案

    jenkins中自动构建helpcenter.jar文件,然后以在server上以shell脚本的形式启动jar服务.jenkins构建后,手动执行sh脚本,服务启动异常.但jenkins结合shel ...

  7. [PTA] 数据结构与算法题目集 6-10 二分查找

    Position BinarySearch(List L, ElementType X) { int beg = 1; int end = L->Last; while (beg <= e ...

  8. js - 使用jquery发送前台请求给服务器,并显示数据

    1.使用jquery发送前台请求给服务器,并显示数据 <%@ page contentType="text/html;charset=UTF-8" language=&quo ...

  9. springMVC保存数据到mysql数据库中文乱码问题解决方法

    1.web.xml中添加过滤器 <filter> <filter-name>CharacterEncodingFilter</filter-name> <fi ...

  10. DH、RSA与ElGamal非对称加密算法实现及应用

    1.对称加密与非对称加密概述 关于对称加密与非对称加密的概念这里不再多说,感兴趣可以看下我之前的几篇文章,下面说一说两者的主要区别. 对称加密算法数据安全,密钥管理复杂,密钥传递过程复杂,存在密钥泄露 ...