您的位置:首页 > 编程语言

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

2011-07-28 21:31 218 查看
一,建立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码,一个字符占两个字节。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: