// ** 初始化GDI+
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
// ** 该成员变量用来保存GDI+被初始化后在应用程序中的GDI+标识。
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); Image image( imagePath ); //加载图片
Graphics imageGraphics(&image); //通过Image对象创建一个绘图句柄,使用这个句柄对图片进行操作
imageGraphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
WCHAR string[ ] = L"Wishful Thinking"; //要写的字
FontFamily fontFamily(L"Calibri");
Gdiplus::Font myFont(&fontFamily, , FontStyleRegular, UnitPoint); //第二个是字体大小
//SolidBrush blackBrush(Color(255, 0, 0, 0)); //半透明+文字RGB颜色
SolidBrush whiteBrush(Color(, , , )); //半透明+文字RGB颜色
PointF school_site((REAL), (REAL));//文字放置的像素坐标
StringFormat format;
format.SetAlignment(StringAlignmentNear); //文本排列方式,即在对应位置居中、靠左、靠右
//wcscpy_s(string, CT2CW(str)); //如果使用MFC中的CString,需要这样转换成WCHAR
imageGraphics.DrawString(string, wcslen(string), &myFont, school_site, &format, &whiteBrush );//把string绘制到图上
CLSID pngClsid;
GetEncoderClsid( L"image/jpeg", &pngClsid);
imagePath.Replace(_T(".jpg"), _T("-note.jpg"));
image.Save(imagePath, &pngClsid, NULL );//保存添加了汉字的图像 // ** 卸载GDI+
Gdiplus::GdiplusShutdown(gdiplusToken);

先看这段典型的GDI+代码,似乎是没有什么问题。把这段代码放在一个main函数中编译可以正确运行,但如果将这段代码放到一个函数中被调用时却会出现崩溃。

跟踪了一下,调试时bug很容易发现,但平时却是不被人注意的,所以有必要记录一下,避免下次掉在同一个坑里。

注意: 最后卸载GDI+后,image对象其实并没有被析构。当image对象无效析构时会用到GDI+资源,但此时GDI+时已经被卸载所以程序会崩溃。

总结:对于这类需要使用时需要先加载、用完要卸载的类库,最好利用c++简单封装一下,利用类特性进行管理资源。

封装GDI+很简单,就不把代码贴上来了。

GDIPlus非典型误用一例的更多相关文章

  1. 毕业季offer怎么拿?收下这份非典型求职面试指南

    摘要:求职面试莫慌,先自我评估一下 ,华为云专家手把手为你指导. 本文分享自华为云社区<毕业季offer怎么拿?收下这份非典型求职面试指南>,原文作者:技术火炬手 . 又是一年毕业季,对于 ...

  2. C-Lodop 非典型应用

    Lodop是什么? 有人说她是报表打印工具,因为那个add_print_table语句把报表统计的那点事弄了个明明白白: 有人说她是条码打印工具,因为用了她再也不用后台生成条码图片了,前端一行指令就动 ...

  3. openerp 经典收藏 workflow中的‘非典型’自动触发器trigger_model(转载)

    workflow中的‘非典型’自动触发器trigger_model 原文:http://cn.openerp.cn/workflow%E4%B8%AD%E7%9A%84%E9%9D%9E%E5%85% ...

  4. workflow中的‘非典型’自动触发器trigger_model

    Openerp中workflow的设计机制 工作流程系统在OpenERP里是非常有用的机制,可以用于即时描述单据(模型)状态的演进过程.工作流实现了状态流转的可配置,通过迁移的 condition代替 ...

  5. SAP成都研究院非典型程序猿,菜园子小哥:当我用UI5诊断工具时我用些什么

    身边有些年轻同事曾经向我表达过这种困扰:尽管完成日常工作没有任何问题,但是还想更进一步,把代码写得更好些,做到精益求精.现在写的代码能实现功能,但是不知道可以怎样写得更好. 除了阅读优秀的开源库开源框 ...

  6. 一次非典型的SQL报错

    昨天调试一个表值函数,结果出现了这个错误. mplicit conversion of varchar value to varchar cannot be performed because the ...

  7. 一个非典型的Linux路由配置方案

    上周帮人解决了一个问题,这个问题绝对是非典型性的,采用了非常规的方法.虽然最终的方案非常不符合常规,非常不通用,充满了各种藏得很深的技巧或者说是trick,但是这个问题却是一个学习Linux路由的绝好 ...

  8. 非典型的scala程序及其编译后的结果

    初学Scala Folder structure以及部分代码 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2xldmVyd3lx/font/5a6L5L ...

  9. 非典型T_SQL的总结

      ------over的两种常用的用法--- --第一种分组 当然要注意了,这里的分组并不是实际的分组,而是根据你的业务需求而坐的临时分组   select roomguid,Room, avg(t ...

随机推荐

  1. BIO | NIO | AIO (Java版)

    几篇解释的不错的文章: BIO NIO AIO NIO.2 入门,第 1 部分: 异步通道 API 使用异步 I/O 大大提高应用程序的性能

  2. java基础面试题常出现(一)

    1.”==“和equals方法的区别? 1.   ==操作符,对于基本数据类型变量,比较的是两个值是否相等,而对于引用类型,比较的是引用的内存的首地址,即引用同一个对象.1 Obeject的equal ...

  3. FastReport 套打全攻略

    http://blog.csdn.net/jinzhili/article/details/500263 FastReport 套打全攻略  2005-7-13 22:10  原创//以设计套打行为6 ...

  4. TCP/IP详解 卷1 第十八章 TCP的建立与终止

    第十八章 TCP的建立与终止 tcpdump Tcpdump可以将网络中传送的数据报完截获下来进行分析.它支持针对网络层.协议.主机.网络或端口的过滤,并提供and.or.not等逻辑语句来帮助你去掉 ...

  5. sock_ntop.c

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netinet/in ...

  6. luogu 1314 欧拉回路

    欧拉路径:一笔画的路径 欧拉回路:一笔画的回路 两者判断方法一样但是输出略有不同.并且还有Fleury(弗罗莱)算法,但是我不会.. 这里就用dfs就好 判断条件: 1)图的连通性(可用并查集判断) ...

  7. 多文档界面QMdiArea

    当使用多文档界面功能时,我们是将QMdiArea作为主窗口的中央部件,然后在这个中央部件中,我们可以同时打开很多个子窗口QMdiSubWindow 样式: import sys from PyQt5. ...

  8. UE4中Component和Subobject的区别

    Component是Subobject的一种. 其中, Subobject是一种Outer不是一个UPackage的UObject,而UPackage是整个层次结构中的最上层,指向磁盘上的一个.uas ...

  9. Spring-boot:快速搭建微框架服务

    前言: Spring Boot是为了简化Spring应用的创建.运行.调试.部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置. 简单来说,它提供了一堆依赖打包,并 ...

  10. 【转】Python中的eval()、exec()及其相关函数

    [转]Python中的eval().exec()及其相关函数 刚好前些天有人提到eval()与exec()这两个函数,所以就翻了下Python的文档.这里就来简单说一下这两个函数以及与它们相关的几个函 ...