本文章适用于,有一定C++基础,大概看过一部分EasyX文档中的函数,的人。
什么是EasyX
按照我的理解:EasyX是一个函数库(当然,里面不止有函数,这么说可能会让初学者更好理解),就像我们的基本输入输出函数库(iosteam)一样,EasyX的所有功能也是在函数库中实现的,官网下载的EasyX安装程序所安装的主要文件就是两个函数库: easyx.h 以及graphics.h ,所有的函数功能均在这两个函数库中实现.
优点:简单,便捷,我们只需要会使用其中的函数画图就行了. 吐槽:内容少,难以开发大项目,难以有沉浸式体验,部分函数可能用起来不是那么符合你的习惯.
关于开发环境
EasyX的官方安装器只支持VS, 本来用的是Codeblocks,至于为什么这两个头文件不能运行,网上说不支持编译器gcc,看兼容教程要改EasyX里的一些东西,为了防止改错(主要是绝对麻烦)干脆用vs2017了
EasyX的使用教程
EasyX的官网 具有详细的参考文档,包含了一切函数的具体用法说明,下面仅介绍我的观看思路,遇到的问题与解决方案
基础原理
三个基本概念:颜色,坐标,设备;
颜色, 采用了RGB颜色方案,即:红,蓝,绿,三种颜色按不同比例混合后的颜色,如果我们不知道某个颜色的取值,可以使用网上的一些取色工具。
坐标,从窗口的左上角开始为0,向右为x方向,向下为y方向,单位为像素
设备,即绘图窗口,也就是用户可以看见的窗口,以后的绘图都在这个窗口上进行
宽字符
UNICODE编码字符,叫宽字节字符。
UNICODE编码,每个字符占二个字节。也叫万国码(一种国际标准字符集,为世界上绝大多数已知的字符集定义了唯一的16位数值)
EasyX所有的字符使用的均为宽字符,也就是 wchar_t ,需要在字符串前面加L来表示这是一个宽字符集 比如 L"我是一个字符串" 就是一个宽字符集的字符串;
关于宽字符集与字符串之间的转化,(该部分 转载至该博客 ),如果会,可跳过
1.MultiByteToWideChar函数
函数功能:该函数将一个字符串到转换成一个宽字符(unicode)的字符串。
函数原型:
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cchMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
第一个参数CodePage:指定执行转换的字符集,这个参数可以为系统已安装或有效的任何字符集所给定的值。 可选值:
CP_ACP:ASCII字符集;
CP_UTF7:使用UTF-7转换;
CP_UTF8:使用UTF-8转换;
第二个参数dwFlags:一般用 0
第三个参数lpMultiByteStr: ASCII 字符串的地址, 这个字符串是第一个参数指定的语言的 ASCII 字符串
第四个参数cchMultiByte: ASCII 字符串的长度,如果用 -1, 就表示是用 '\0' 作为结束符的字符串
第五个参数 lpWideCharStr,:转化生成的 unicode 字符串 (WideString) 的地址, 如果为 NULL, 就是代表计算生成的字符串的长度
第六个参数cchWideChar:转化生成的 unicode 字符串缓存的容量,也就是有多少个UNICODE字符,若此值为零,函数将返回缓冲区所必需的宽字符数。
因此该函数一般使用两次:
第一次获取转换成unicode所需要的长度
第二次才是真正的把一个字符串转换为unicode,代码如下:
char* mbs = "中国,你好!I Love You!";
int length = MultiByteToWideChar( CP_ACP, 0, mbs, -1, NULL, 0 );
wchar_t* wcs = new wchar_t[ length ];
MultiByteToWideChar( CP_ACP, 0, mbs, -1, wcs, length );
delete wcs;
wcs = NULL;
2.WideCharToMultiByte函数
函数功能:该函数将一个宽字符(unicode)转换为字符串的函数。
函数原形:
int WideCharToMultiByte(
UINT *CodePage*, //指定执行转换的代码页
DWORD *dwFlags*, //允许你进行额外的控制,它会影响使用了读音符号(比如重音)的字符,一般设置为NULL
LPCWSTR *lpWideCharStr*, //指定要转换为宽字节字符串的缓冲区
int *cchWideChar*, //指定由参数lpWideCharStr指向的缓冲区的字符个数
LPSTR *lpMultiByteStr*, //指向接收被转换字符串的缓冲区
int *cchMultiByte*, //指定由参数lpMultiByteStr指向的缓冲区最大值
LPCSTR *lpDefaultChar*, //当WideCharToMultiByte函数遇到一个宽字节字符,而该字符在CodePage参数标识的代码页中并没有它的表示法时,WideCharToMultiByte函数才使用这两个参数。如果宽字节字符不能被转换,该函数便使用lpDefaultChar参数指向的字符。如果该参数是NULL(这是大多数情况下的参数值),那么该函数使用系统的默认字符。该默认字符通常是个问号。
LPBOOL *pfUsedDefaultChar* //至少有一个字符不能转换为其多字节形式,函数就会把这个变量设为TRUE
);
代码如下:
Wchar_t* wcs = _T("中国,你好!I Love You!");
int length = WideCharToMultiByte( CP_ACP, 0, wcs, -1, NULL, 0, NULL, NULL);
char* mbs = new char[ length ];
WideCharToMultiByte( CP_ACP, 0, wcs, -1, mbs, length, NULL, NULL);
delete mbs;
mbs = NULL;
以上方法只适用于char数组与wchar_t数组的转化 ,更多的,如果我们用到了字符串(string),那么我们还需要: 字符串与char数组的转化 :
一、string 转 char*
主要有三种方法可以将 str 转换为 char* 类型,分别是:data(); c_str(); copy;
1、data() 方法:
string str = "hello world";