EasyX图形库学习(二、文字输出)

目录

一、文字绘制函数

字体属性结构体:logfont

文字输出

[outtextxy 在指定位置输出字符串。](#outtextxy 在指定位置输出字符串。)

​编辑

但如果直接使用,可能有以下报错:

三种解决方案:

将一个int类型的分数,输出到图形界面上

如果直接使用:

会把score输入进去根据ASCII转成了字符,如下:

正确做法:

二、文字居中

三、VS中如何使用正常使用scanf(慎用)


一、文字绘制函数

字体属性结构体: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

今天就先到这了!!!

看到这里了还不给博主扣个:

⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!

有问题可以评论或者私信呢秒回哦。

相关推荐
内核程序员kevin1 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
网易独家音乐人Mike Zhou3 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
‘’林花谢了春红‘’4 小时前
C++ list (链表)容器
c++·链表·list
----云烟----4 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024064 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it5 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神5 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式