一、文字绘制函数
字体属性结构体:logfont
struct LOGFONT { LONG lfHeight;//指定高度(逻辑单位) LONG lfWidth //指定字符的平均宽度(逻辑单位)。如果为0,则比例自适应 LONG lfEscapement;//字符串的书写角度,单位0.1度,默认为0 LONG lfOrientation;//每个字符的书写角度,单位 0.1 度,默认为 0。 LONG lfWeight;//字符的笔画粗细,范围 0~1000,0 表示默认粗细,使用数字或下表中定义的宏均可。PS:宏太多就不写了 BYTE lfItalic;//指定字体是否是斜体。 BYTE lfUnderline;//指定字体是否有下划线 BYTE lfStrikeOut;//指定字体是否有删除线 BYTE lfCharSet;//指定字符集 BYTE lfOutPrecision;//指定文字的输出精度 BYTE lfClipPrecision;//指定文字的剪辑精度。 BYTE lfQuality;//指定文字的输出质量。 BYTE lfPitchAndFamily;//指定以常规方式描述字体的字体系列。字体系列描述大致的字体外观。字体系列用于在所需精确字体不可用时指定字体。 TCHAR lfFaceName[LF_FACESIZE];//字体名称,名称不得超过 31 个字符。如果是空字符串,系统将使用第一个满足其它属性的字体。 };
文字输出
- 在指定位置输出文字,两个同名的函数,会自动根据参数调用。
void outtextxy(int x,int y,LPCTSTR str);
void outtextxy(int x,int y,char c);
- 设置文字颜色
void settextcolor(COLORREF color);
- 设置背景模式
- TRANSPARENT 背景透明
void setbkmode(int mode);
- 设置文字样式(大小、字体)
- height 文字的高度,width字符的宽度(如果为0则表示自适应),face字体
void settextstyle(int height,int width,LPCTSTR face);
- 获取文字占用的像素高度和宽度
int textheight(LPCTSTR str);
int textwidth(LPCTSTR str);
- 文字居中显示在某一个区域
int rectx,recty,rectw,recth; //矩形区域左上角坐标和大小
int x = rectx + (rectw - textwidth(str))/2;
int y = recty + (recth - textheight(str))/2;
//x y 即最终文字所在的位置
outtextxy 在指定位置输出字符串。
void outtextxy(
int x, //字符串输出头字母的 x 轴的坐标值
int y, //头字母的 y 轴的坐标值
TCHAR c //待输出的字符
);
字符串常见的编码有两种:MBCS 和 Unicode。VC6 新建的项目默认为 MBCS 编码,VC2008 及高版本的 VC 默认为 Unicode 编码。LPCTSTR 可以同时适应两种编码。为了适应两种编码,请使用 TCHAR 字符串及相关函数。
默认情况下,输出字符串的背景会用当前背景色填充。使用函数 setbkmode 可以设置文字的背景部分保持透明或使用背景色填充。
settextstyle(48, 0, "微软雅黑"); //设置文字颜色 settextcolor(BROWN); //绘制文字 outtextxy(10, 20, "Hello World");
但如果直接使用,可能有以下报错:
C2665:"outtextxy":2个重载没有一个可以转换所有参数类型
原因:EasyX与字符串相关的函数,都有字符集问题 UNICODE 多字节字符集
三种解决方案:
1.在字符串的前面使用L进行转换 强制转换
2.用带参宏(_T(),_TEXT())把字符串包裹起来 自适应转换 推荐使用
3.菜单栏->项目->属性->高级->字符集->把UNICODE改成多字节字符集 大力推荐
将一个int类型的分数,输出到图形界面上
如果直接使用:
void draeTest() { settextstyle(48, 0, "微软雅黑"); //设置文字颜色 settextcolor(BROWN); settextstyle(30, 0, "微软雅黑"); //现在有一个int类型的分数,需要输出到图形界面上 int score = 66; //直接使用 outtextxy(getwidth() - 100, 0, score);//把score输入进去转成了字符 }
会把score输入进去根据ASCII转成了字符,如下:
正确做法:
使用sprintf_s(str,"Score:%d", score);把score格式化成字符串
void drawTest() { settextstyle(48, 0, "微软雅黑"); //设置文字颜色 settextcolor(BROWN); settextstyle(30, 0, "微软雅黑"); //现在有一个int类型的分数,需要输出到图形界面上 int score = 66; //直接使用 //outtextxy(getwidth() - 100, 0, score);//把score输入进去转成了字符 //要格式化成字符串 char str[50] = ""; //格式字符串 sprintf_s(str,"Score:%d", score); outtextxy(getwidth() - 100, 0, str); }
void drawTest() { printf("hello,EasyX!"); //设置文字大小 settextstyle(48, 0, "微软雅黑"); //设置文字颜色 settextcolor(BROWN); //绘制文字 outtextxy(10, 20, "Hello World"); //error C2665:"outtextxy":2个重载没有一个可以转换所有参数类型 //EasyX与字符串相关的函数,都有字符集问题 UNICODE 多字节字符集 /* 三种解决方法 * 1.在字符串的前面使用L进行转换 强制转换 * 2.用带参宏(_T(),_TEXT())把字符串包裹起来 自适应转换 推荐使用 * 3.菜单栏->项目->属性->高级->字符集->把UNICODE改成多字节字符集 大力推荐 */ settextstyle(30, 0, "微软雅黑"); //现在有一个int类型的分数,需要输出到图形界面上 int score = 66; //直接使用 //outtextxy(getwidth() - 100, 0, score);//把score输入进去转成了字符 //要格式化成字符串 char str[50] = ""; //格式字符串 sprintf_s(str,"Score:%d", score); outtextxy(getwidth() - 100, 0, score); }
二、文字居中
int rx = 130; // 矩形左上角x坐标
int ry = 380; // 矩形左上角y坐标
int rw = 300; // 矩形宽度
int rh = 60; // 矩形高度
int hSpace = (rw - textwidth(str1)) / 2; // 计算水平居中的间距
int vSpace = (rh - textheight(str1)) / 2; // 计算垂直居中的间距
textwidth
该字符串实际占用的像素宽度。
textheight
该字符串实际占用的像素高度。
void centerText() //文字居中 { //来一个矩形 int rx = 130; int ry = 380; int rw = 300; int rh = 60; setfillcolor(RGB(230, 231, 232)); fillrectangle(rx,ry,rx+rw,ry+rh); //绘制文字 settextcolor(RED); char str1[] = "Centet Text"; int hSpace = (rw - textwidth(str1)) / 2; int vSpace = (rh - textheight(str1)) / 2; outtextxy(rx+hSpace, ry+vSpace, str1); }
三、VS中如何使用正常使用scanf(慎用)
打开项目->属性->C/C++常规->SDL检查->否->应用
或者在加入#define _CRT_SECURE_NO_WARNINGS 1
今天就先到这了!!!
看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。