SimpleCG文字输出基础

news2024/12/30 3:05:15

前言

        前面已经介绍了图形绘制,本篇将介绍简单的文字输出操作方法。其实文字在计算机中也是作为图形处理的,只是一种特殊的图形,是按固定预设字模图形来绘制的,称为字体。文字输出就是按文字所在字体中的对应图形绘制出来,因此同一个文字可以有不同字体输出,显示出来的文字图形就不一样。

一、文字输出方法

        SimpleCG支持以下输出函数:


//在规定的位置绘制文本。其中x和y为坐标
void outtextXY(int x, int y, const CHAR *pText);
//在规定的矩形框内绘制文本
void outtextRect(int nLeft, int nTop, int nWidth, int nHeight, const CHAR *pText);
//在规定的矩形框内按格式绘制文本
void outtextRectEx(int nLeft, int nTop, int nWidth, int nHeight, const CHAR *pText, UINT nFormat );


//格式化输出文本
//在规定的位置绘制格式化文本。其中x和y为坐标
void printfXY(int x, int y, const CHAR *pFormat, ...);
//在规定的矩形框内绘制格式化文本
void printfRect(int nLeft, int nTop, int nWidth, int nHeight, const CHAR *pFormat, ... );
//在规定的矩形框内绘制格式化文本
void printfRectEx(int nLeft, int nTop, int nWidth, int nHeight, UINT nFormat, const CHAR *pFormat, ... );

最简单的绘制方式就是直接在指定位置绘制文字,使用outtextXY函数,位置参数指定文字左上角的坐标。

例如

outtextXY( 0,0, _T("测试文字输出"));

在窗口左上角用默认字体,默认大小绘制“测试文字输出”几个字。

outtextXY很简单,但只能输出到指定位置,无法限制在指定区域内,如果要自动裁切区域,就要使用另外一个函数--outtextRect。下面看看一个绘制按钮的例子


	setbackmode(enumBKM_TRANSPARENT);
	setfillcolor(RGB(0xAA,0xAA,0xFF));
	int nY=0;
	fillroundrect( 50,50+nY*50,150,60+nY*50, 5,5);
	outtextRectEx(50,50+nY*50,100,10,_T("新建测试"),SCG_TEXT_MIDDLE);
	nY++;
	fillroundrect( 50,50+nY*50,150,80+nY*50, 5,5);
	outtextRectEx(50,50+nY*50,100,30,_T("打开测试"),SCG_TEXT_MIDDLE);
	nY++;
	fillroundrect( 50,50+nY*50,150,80+nY*50, 5,5);
	outtextRectEx(50,50+nY*50,100,30,_T("保存测试"),SCG_TEXT_MIDDLE);

对于有区域限制的文本绘制,非常有用

效果如图

可以看到第一个按钮由于按钮高度设置不够,文字无法完全显示在按钮上,出现了自动裁剪,不至于文字绘制出格。 

        此外对于C语言初学者,可能习惯于使用printf函数输出文字,那么可以选择对应的


//格式化输出文本
//在规定的位置绘制格式化文本。其中x和y为坐标
void printfXY(int x, int y, const CHAR *pFormat, ...);
//在规定的矩形框内绘制格式化文本
void printfRect(int nLeft, int nTop, int nWidth, int nHeight, const CHAR *pFormat, ... );
//在规定的矩形框内绘制格式化文本
void printfRectEx(int nLeft, int nTop, int nWidth, int nHeight, UINT nFormat, const CHAR *pFormat, ... );

使用方法与printf差不多,就是需要提供绘制位置。

二、与文字输出相关设置

1、颜色设置

//获取文字颜色
COLORREF gettextcolor();
//设置文字颜色
COLORREF settextcolor(COLORREF color);

这个前面的例子已经介绍了,直接提供颜色参数就可以了。

2、字体设置


//字体设置
void settextfont( LONG nHeight, LONG nWidth, LPCSTR lpszFace );
void settextfontEx( const LOGFONTW* pLogFont );
//设置字体样式enumSFS_NORMAL=正常, enumSFS_ITALIC=倾斜, enumSFS_UNDERLINE=下划线, enumSFS_STRIKEOUT=划线
void settextfontStyle( int nStyle );
//按字号设置大小
void settextfontPointSize( LONG nPoint );
//设置字体粗细
void settextfontWeight( int nWeight );

下面看看不同的字体设置绘制出的文字区别如何

//默认
	int nY=0;
	int nHeight = 35;
	LOGFONT lf = *gettextfont();
	outtextXY( 10,10+nY*nHeight,_T("SimpleCG测试效果"));

	settextfont( 20, 30, _T("隶书"));
	nY++;
	outtextXY( 10,10+nY*nHeight,_T("SimpleCG测试效果"));

	settextfont( 20, 10, _T("宋体"));
	nY++;
	outtextXY( 10,10+nY*nHeight,_T("SimpleCG测试效果"));

	settextfontStyle( enumSFS_ITALIC );
	nY++;
	outtextXY( 10,10+nY*nHeight,_T("SimpleCG测试效果"));

	settextfontStyle( enumSFS_UNDERLINE );
	nY++;
	outtextXY( 10,10+nY*nHeight,_T("SimpleCG测试效果"));

	settextfontStyle( enumSFS_STRIKEOUT );
	nY++;
	outtextXY( 10,10+nY*nHeight,_T("SimpleCG测试效果"));

	settextfontStyle( enumSFS_NORMAL );
	nY++;
	outtextXY( 10,10+nY*nHeight,_T("SimpleCG测试效果"));

	settextfontEx(&lf);
	settextfontPointSize( 12 );
	nY++;
	outtextXY( 10,10+nY*nHeight,_T("SimpleCG测试效果"));

	settextfontPointSize( 24 );
	nY++;
	outtextXY( 10,10+nY*nHeight,_T("SimpleCG测试效果"));

	int i=0;
	nY++;
	for(i=0;i<1000;i+=100)
	{
		settextfontWeight( i );
		outtextXY( 10+i/2,10+nY*nHeight,_T("测"));
	}

效果如图

 总结

        以上就是文字输出的基本方法,要想进一步掌握windows的文字输出,可以进一步研究windows的字体相关知识,加上一些想象力就可以做出酷炫的文字特效。对于一般的文本输出则只要掌握基本的知识已经够用了。欢迎有兴趣的同学下载simplecg库来进一步学习研究。

        最后用一个古时有名的遇仙桥碑刻演示文字输出的用法。

        代码如下:

// Text.cpp : 定义控制台应用程序的入口点。
//

#include "../import/include/CGBoard.h"
#include "math.h"
#ifdef _DEBUG
#pragma comment(lib,"../import/lib/SimpleCG_MDd.lib")
#else
#pragma comment(lib,"../import/lib/SimpleCG_MD.lib")
#endif

#define C_CHAR_HEIGHT 30

enum ENUM_DIRECTION
{
	enumDIR_UP,
	enumDIR_RIGHT,
	enumDIR_DOWN,
	enumDIR_LEFT,
};
int g_nWidth = 500;		//画面宽度
int g_nHeight= 400;		//画面高度
int g_pIsOn[9][9] = {0};

void DrawCharacter( int nX, int nY, WCHAR pText, COLORREF nColor, int nDir )
{
	WCHAR pOutput[2]={0};
	pOutput[0] = pText;
	setfillcolor(nColor);

	setbackmode(enumBKM_TRANSPARENT);
	solidrectangle(nX * C_CHAR_HEIGHT, nY*C_CHAR_HEIGHT, nX * C_CHAR_HEIGHT+C_CHAR_HEIGHT, nY*C_CHAR_HEIGHT+C_CHAR_HEIGHT);
	
	outtextRectExW( nX * C_CHAR_HEIGHT, nY*C_CHAR_HEIGHT, C_CHAR_HEIGHT, C_CHAR_HEIGHT, pOutput, DT_CENTER|DT_VCENTER|DT_SINGLELINE );
	
}
void DrawPoem()
{
	int nDir = enumDIR_DOWN;
	WCHAR pPoemTitle[] = L"题遇仙桥";
	WCHAR pPoem[] = L"牛郎织女会佳期下弹琴又赋诗静忽闻钟鼓響停始觉月光移少黄冠归道观机而作尽忘机时得到桃源洞彼仙人下象棋";
	WCHAR *pPoemSrc[] = { L"牛郎织女会佳期",L"月下弹琴又赋诗",L"寺静忽闻钟鼓響",L"音停始觉月光移",L"多少黄冠归道观",L"见机而作尽忘机",L"几时得到桃源洞",L"同彼仙人下象棋"};
	int nIndex = 0;
	int nX = 5;
	int nY = 5;
	POINT ptDir[] = { {0,-1}, {1,0},{0,1},{-1,0}};
	int nCount = 0;
	srand(GetTickCount());
	COLORREF nColor = RGB(200+rand()%56,200+rand()%56,200+rand()%56);
	for(nIndex=0; nIndex<sizeof(pPoem)/sizeof(pPoem[0])-1;++nIndex)
	{
		DrawCharacter( nX, nY, pPoem[nIndex],nColor,nDir);
		g_pIsOn[nY][nX] = 1;
		nX += ptDir[nDir].x;
		nY += ptDir[nDir].y;
		++nCount;
		if(nCount>=7)
		{
			nColor = RGB(200+rand()%56,200+rand()%56,200+rand()%56);
			nCount = 1;
		}
		int nNew=nDir+1;
		if( nNew>enumDIR_LEFT )
			nNew = enumDIR_UP;
		if( g_pIsOn[nY +ptDir[nNew].y][nX + ptDir[nNew].x] == 0 )
			nDir = nNew;
	}
	outtextXYW(200,30,pPoemTitle);
	for(nIndex=0; nIndex<sizeof(pPoemSrc)/sizeof(pPoemSrc[0]);++nIndex)
	{
		nColor = RGB(rand()%200,rand()%200,rand()%200);
		settextcolor(nColor);
		outtextXYW(300,60+nIndex*30,pPoemSrc[nIndex]);
	}
	ReflushWindow();
}
void DrawProcess()
{
	DrawPoem();
}
int _tmain(int argc, _TCHAR* argv[])
{
	//初始化
	if( !ShowingBoard(g_nWidth,g_nHeight, DrawProcess))
		return 1;
	//关闭图库
	CloseBoard();
	return 0;
}

演示如下:

这首碑刻从中间开始读,然后首位相连,思维的巧妙,令人赞叹。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1050905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【golang】调度系统之整体介绍

调度系列 调度系列之goroutine 调度系列之m 调度系列之p 调度系列之sysmon 前面几篇对调度体系的G、M、P、sysmon分别进行了介绍。拆分的介绍有助于聚焦单一的角色&#xff0c;比较快地建立认识&#xff0c;同时也能更深入细节&#xff0c;但是不足以建立全局的认知。本篇在前面…

C理解(五):编译,链接库,宏,关键字,变量

编译 编译过程 文件.c->(预处理)->文件.i->(编译)->文件.S->(汇编)->文件.o->(链接)->elf程序 预处理 内容:加载头文件(#include),清除注释(//,./*),替换条件编译(#if #elif #endif #ifdef),替换宏定义(#define) …

[杂谈]-ESP32中的无线通信协议

ESP32中的无线通信协议 文章目录 ESP32中的无线通信协议1、ESP32 无线通信协议简介2、Bluetooth Low Energy (BLE)3、**Bluetooth Classic**4、**ESP-NOW**5、Wi-Fi&#xff08;客户端-服务器通信协议&#xff09;6、MQTT7、**LoRa**8、**GSM/GPRS/LTE**9、总结 ESP32是一个基于…

BL808学习日志-0-概念理解

一、主核心的介绍 1.三个核心在FREERTOS系统中相互独立&#xff0c;各负责各自的外设和程序&#xff1b;其中M0和LP核心在一个总线上&#xff0c;D0单独在一个总线上&#xff0c;两个总线使用AXI4.0(??)通讯&#xff1f; CPU0(M0)-E907架构&#xff0c;320MHz; CPU1(LP)-E9…

基于微信小程序的高校宿舍管理系统设计与实现(亮点:选择宿舍、宿舍评分、宿舍报修)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

【中秋节快乐】Matplotlib:3d绘图合集

目录 一、环境介绍 二、Matplotlib绘图&#xff08;3d&#xff09; 0. 设置中文字体 1. 3D线框图&#xff08;3D Wireframe Plot&#xff09; 2. 3D散点图&#xff08;3D Scatter Plot&#xff09; 3. 3D条形图&#xff08;3D Bar Plot&#xff09; 4. 3D曲面图&#xff0…

微信小游戏从零到上线系列文章整理,建议收藏

引言 本系列是《从零开始开发贪吃蛇小游戏到上线系列》&#xff0c;欢迎大家关注分享收藏订阅。 大家中秋快乐&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。前面笔者给大家讲解了微信小游戏如何从零到上线的流程。可能很多小伙伴都还没有看到。 本…

【深度学习_TensorFlow】卷积神经网络(CNN)

写在前面 这篇文章的行文思路如下&#xff1a; 先根据视频了解卷积和卷积神经网络的整体框架 接着了解卷积神经网络构建过程中的一些重要操作&#xff0c;包括内积、填充、池化。 然后介绍卷积层如何实现。 最后用卷积神经网络的开山之作&#xff08;LeNet-5&#xff09;来…

22 mysql range 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

奶茶果饮外卖配送小程序商城的作用是什么

奶茶果饮商家众多&#xff0c;有加盟品牌也有独立自创品牌或小店等&#xff0c;奶茶果饮已经成为众多年轻人群体喜爱的饮品&#xff0c;在实际消费方面&#xff0c;普遍以到店外卖为主&#xff0c;市场需求较高&#xff0c;但同样的竞争压力也不小。 同行竞争激烈&#xff0c;…

【教学类-35-03】学号+姓名+班级(小3班)学号字帖(A4竖版2份)

图片展示: 背景需求: 本周排到小3班&#xff0c;还没有来得及设计小班主题活动书的内容&#xff0c;于是就把小2班的学号字帖微调一下&#xff0c;做一份竖版2份的学号字帖。 让幼儿熟悉自己的学号&#xff0c;让我也熟悉幼儿的名字和学号 材料准备&#xff1a; 描字写&#…

Excel 使用 ctrl + E 快捷键进行数据提取、合并、添加前后缀等操作

使用组合键【Ctrl E】&#xff0c;你可以对数据进行合并、数据提取、添加前后缀等操作。 合并 提取 加前后缀或单位

KNN(上):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

day09_数组进阶

今日内容 零、 复习昨日 一、作业 二、引用类型[重要] 三、数组拷贝 四、数组扩容 五、数组排序[面试|笔试] 六、Arrays 零、 复习昨日 1数组创建后能否改变长度 不能 2数组创建后能否存储不同类型的数据 不能 √能,能默认转型的可以存储 double[] arr2 new double[3]; arr2[0…

TouchGFX之动态位图

标准位图会被编译到应用中&#xff0c;因此必须在编译时提供。在运行时间在RAM中创建位图&#xff0c;被称为动态位图。 动态位图的使用与编译到应用中的静态位图相同。 动态位图配置 必须先配置位图缓存&#xff0c;然后才能创建动态位图。 FrontendApplication.hpp#inclu…

基于PHP+MySQL的养老院管理系统

摘要 随着21世纪互联网时代的兴起&#xff0c;我们见证了人们生活方式的巨大改变。这个时代不仅深刻影响了我们的生活&#xff0c;还改变了我们对信息科学的看法。社会的各个领域都在不断发展&#xff0c;人们的思维也在不断进步&#xff0c;与此同时&#xff0c;信息的需求也与…

开具数电票如何减少认证频次?

“数电票”开具需多次刷脸认证&#xff0c;如何减少认证频次&#xff1f; 法定代表人、财务负责人可以在“身份认证频次设置”功能自行设置身份认证时间间隔&#xff0c;方法如下&#xff1a; 第一步 登录电子税务局。企业法定代表人或财务负责人通过手机APP“扫一扫”&#x…

jupyter notebook可以打开,但无法打开.ipynb文件,报错500 : Internal Server Error

1、错误信息 2、解决办法 打开Anaconda Promt界面&#xff0c;进入自己的虚拟环境。在命令行输入以下指令&#xff1a; pip install --upgrade nbconvert

全国排名前三的直播公司无锋科技入驻天府蜂巢成都直播产业基地

最近&#xff0c;全国排名前三的直播公司——无锋科技&#xff0c;正式宣布入驻位于成都的天府蜂巢直播产业基地&#xff0c;这一消息引起了业内人士的高度关注。成都直播产业基地一直是中国直播产业的重要地标之一&#xff0c;其强大的技术和资源优势为众多直播公司提供了广阔…

TouchGFX之二进制字体

将字体链接到应用的基本原则的主要优势是应用始终会自动包含应用中使用的更新文本和字体排印。 因此&#xff0c;使用起来十分容易和安全。 其缺点在于字体会使应用的体积变大。 为了缓解这个问题&#xff0c;TouchGFX允许应用使用二进制字体。 这些字体不链接到应用&#xff…