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

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



一、文字绘制函数

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

今天就先到这了!!!

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

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

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

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

相关文章
|
缓存 网络协议 安全
计算机网络 TCP、RPC、GRPC、HTTP 对比
【1月更文挑战第1天】计算机网络 TCP、RPC、GRPC、HTTP 对比
|
人工智能 IDE Java
全面开测:AI智能编码辅助工具通义灵码
全面开测:AI智能编码辅助工具通义灵码
65145 7
全面开测:AI智能编码辅助工具通义灵码
|
10月前
|
小程序 Java 关系型数据库
基于微信小程序的智慧养老服务系统
本系统基于Java、MySQL和Spring Boot技术,构建高效、安全的养老院管理系统,提升信息处理速度与管理规范性,实现数据自动化备份与网络化管理,助力养老机构信息化升级。
|
机器学习/深度学习 算法 决策智能
北大领衔,多智能体强化学习研究登上Nature子刊
北京大学研究团队近日在《Nature》子刊上发布了一篇关于多智能体强化学习(MARL)的论文,提出了一种高效且可扩展的MARL框架,旨在解决大规模网络控制系统中的决策问题。该框架实现了智能体间的局部通信,减少了通信成本与计算复杂度,并在交通、电力及疫情防控等多个真实场景实验中,显著提升了决策性能。论文链接:https://www.nature.com/articles/s42256-024-00879-7。尽管该研究仍存局限,但为MARL的应用提供了新思路。
602 2
|
Python 容器
AutoDL Python实现 自动续签 防止实例过期释放 小脚本 定时任务 apscheduler requests
AutoDL Python实现 自动续签 防止实例过期释放 小脚本 定时任务 apscheduler requests
799 0
|
人工智能 搜索推荐 机器人
grok官网是什么?这次一定要记好了!GROK3官网入口
grok官网是什么?这次一定要记好了!GROK3官网入口
|
SQL 数据处理 API
10分钟了解Flink SQL使用
Flink 是一个流处理和批处理统一的大数据框架,专门为高吞吐量和低延迟而设计。开发者可以使用SQL进行流批统一处理,大大简化了数据处理的复杂性。本文将介绍Flink SQL的基本原理、使用方法、流批统一,并通过几个例子进行实践。
10分钟了解Flink SQL使用
|
编译器 C语言 C++
C/C++数字与字符串互相转换
C/C++数字与字符串互相转换
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
2210 2