GDI+编程的肤浅使用及Char ,CString,WCHAR 之间的转换小结

 一,建立GDI+的VC&VS开发环境

先下了这个库的头文件和库文件,然后在VC工程配置添加库和头文件。具体的操作是这样的:

VC6.0下面的操作:

在菜单项:Project->settings->Link->Object/Library Module里面填入gdiplus.lib.这个静态库文件应该拷到工程的文件夹下,不然应该填入全整路径。

在stdafx.h中我添加了如下代码:

#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#include "./GDIPlus/Includes/GdiPlus.h"
using namespace Gdiplus;

#include "./GDIPlus/Includes/GdiPlus.h"这儿是因为我解压的路径在工程文件夹下。网上也有人把include文件夹内容直接拷到VC的安装文件里面的include里面的。

VS2005下面的配置与上面略有不同。没有定义宏ULONG_PTR。其余也就是界面不一样而已。

接下来,在工程应用程序类(C*App类)里面添加成员变量 :

ULONG_PTR m_gdiplusToken;

重载CWinApp成员函数:

virtual int ExitInstance();

在C*App::InitInstance()添加语句装载gdiplus

 Gdiplus::GdiplusStartupInput gdiplusStartupInput;
 Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);

在C*App::ExitInstance()中缷载:

 Gdiplus::GdiplusShutdown(m_gdiplusToken);
 return CWinApp::ExitInstance();

如此即可以在View或Fram类里面使用gdiplus相应的类了

二,如何在一张图片(常见的几种格式)上作图

我在网上学到的方法大致如此:

首先定义一个Bitmap或Image的对象

如Image img(L"example.jpg");

然后由Image或Bitmap 的一个静态函数FromImage();

得到一个Graphics 的对象指针。Graphics是一个有作图接口的类,支持常见的如画点,线,矩形,椭圆,字符串,填充等操作。显然这儿作图的所谓有的DC应该是内存DC,也就是图片文件的数据区内存。所以做图后img对象调用其保存函数

img.Save(....);后打开保存后的图片,就能看见作图的效果了。

另外,还有一个问题在于如何将一个小图片复制到一张大图片,或者说几张图片一起拼接成一大图片。应该是网上的资源是挺丰富的,但是人应该是学以致用的。学会理解,活用,才是在网上学习的最好方法吧。我对此问题的大致操作如下:

先建立一个大图片的对象,并指定其宽高:Bitmap bigBmp(width,height);

获取小图片对象:Bitmap smallBmp(L"resource.jpg");

由上面总结的在图片上绘图的方法得到Graphics *并在smallBmp完成相应字符串等的绘制。

同样的得到一个指向bigBmp的Graphics*,将完成做图后的小图片smallBmp画到指定的位置就OK了。即:

Bitmap::FromImage(bigBmp)->DrawImage(&smallBmp,x,y);

三:关于Char* ,CString ,WCHAR*之间的转换问题

GDI+所有类的接口函数如果要传递字符串作为参数的话,似乎都用UNICODE串,即WCHAR*。我开始也被整得晕头转向,因为窗口编程所用往往是CString,用IO流读文件数据又得到char *。得益于网上牛人们的总结,我用到以下几种基本方法去实现三者间的转换:

char * 转WCHAR *:

::MultiByteToWideChar(CP_ACP,0,(const char *)res,int count,char * dest,int count);

类似地,WCHAR *转char *:

WideCharToMultiByte(CP_ACP,   0,.........);

CString 转WCHAR *:

wchar_t * p=str.AllocSysStrinig()

也有A2W(str)的,但是要包括ATL转换头文件#include ;

并且在A2W前使用USES_CONVERSION宏。

其它:

char*转CString:

除了直接赋值外,还可使用CString::Format进行。

如char * p="sfdasf";

CString str=p; 或者str.Format("%s",p);

CString 转char *

1.直接强制类型转换:

 CString ss="sfasf";
  char *p=(LPSTR)(LPCSTR)ss;

2.CString::GetBuffer或LockBuffer

char * p=str.GetBuffer();

char * pt=str.LockBuffer();

WCHAR *转CString

在网上没有找到相关的文档,想想应该是可以直接赋值的

但是试验发现虽无编译错误,但是用中文的时候却生乱码,用字母的时候却是正常,想其中肯定没有错误,只是用MessageBox显示的时候乱码应该有其它原因,比如说使用了双字节字符集DBCS来显示汉字(纯属猜测而已)。总体来说在Windows编程中:#define UNICODE

则CString .TCHAR,等均用的是UNICODE码,一个字符占两个字节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值