8.向窗口输出文字 : TextOut 和 DrawText 函数

article/2025/10/4 17:07:25

使用 DrawText() 向客户区的中间位置输出了一段文本,说一下文字的输出。

设备环境(DC)

在Windows中,一切能在显示器上看到的都是图形,不但包括点、线、矩形、圆等,也包括文字、字体。对用户来说文字和图片是不同的,但它们在本质上都是图形,都需要在显示器上画出来。这也是Windows被称作图形操作系统的原因。

Windows不允许我们直接访问硬件,如键盘、显示器、打印机等,在与这些硬件通信前要获得设备环境(Device Context,简称 DC),进而间接的访问硬件。

设备环境有时也被称为设备上下文或设备描述表。

所谓设备环境,就是与当前硬件设备有关的各种信息,它是硬件设备的抽象。也就是说,设备环境就代表当前的硬件。

与文字输出、图形绘制有关的函数,在使用时大都需要传入一个参数,就是设备环境句柄。获取设备环境句柄有多种方式,常用的是 BeginPaint 函数。绘图完成后,还要释放句柄,使用 EndPaint 函数。

BeginPaint 和 EndPaint 函数

当发生 WM_PAINT 事件时,应用程序开始绘图。绘图之前需要先调用 BeginPaint 函数通知 Windows,告诉它当前程序需要使用显示器,你安排一下吧。BeginPaint 函数执行完毕就返回设备环境句柄,接下来就可以使用 GDI 函数绘图了。

绘图结束后,也需要调用 EndPaint 函数通知Windows,告诉它绘图结束了,可以继续后面的工作了。

TextOut 函数

TextOut 函数可以在客户区输出一段文本,原型为:

BOOL TextOut(HDC hdc,  //设备环境句柄int nXStart,  //开始输出位置的x坐标int nYStart,  //开始输出位置的y坐标LPCTSTR lpString,  //要输出的字符串int cbString  //字符串的长度
);

每当发生WM_PAINT事件时,窗口就会发生重绘,这个时候需要向窗口输出文字:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC hdc;		  //设备环境句柄PAINTSTRUCT ps;   //存储绘图环境的相关信息TCHAR szText[20] = TEXT("欢迎来到北京!");switch (message){//窗口绘制消息case WM_PAINT:hdc = BeginPaint(hwnd, &ps);    //开始绘图并返回环境句柄//输出文字TextOut(hdc, 50, 50, szText, wcslen(szText));EndPaint(hwnd, &ps);       //结束绘图并释放环境句柄return 0;//窗口销毁消息case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);
}

运行效果:
在这里插入图片描述
几点说明:

  1. PAINTSTRUCT 结构体用来保存与绘图环境有关的信息。

  2. BeginPaintEndPaint 函数用来开始绘图和结束绘图,必须成对出现,输出文字或绘制图形的代码也必须放在两个函数之间。

  3. 字符串一般使用宽字符,对应的计算字符串长度的函数为 wcslen()

DrawText函数

TextOut 在一个起点开始输出文本,可以精确定位,不能自动换行;DrawText 在指定区域内输出文本,可以控制格式对齐(居左、居中、居右),可以换行。

DrawText 在内部其实也是调用TextOut ,不过它作了很多处理,比如 DrawText 无需知道输出多少个字符。更重要的是,DrawText 可以处理换行符而 TextOut 不能,从这个角度看,DrawText 应该是一种更高级的用法,是在TextOut基础上的封装。

DrawText 的原型是:

int DrawText(HDC hDC,  //设备环境句柄LPCTSTR lpString,  //将要输出的字符串int nCount,  //字符串的长度LPRECT lpRect,  //指向一个矩形区域的结构体 RECT 的指针UINT uFormat  //输出格式
);

两点说明:

  1. 如果 nCount 为 -1,则表明 lpString 指向的字符串是以'\0'结束的,DrawText 会自动计算字符数。

  2. 参数 uFormat 有四种取值,它们可以任意组合:

	 - DT_CALCRECT:这个参数比较重要,可以使 DrawText 函数计算出输出文本的尺寸。如果输出文本有多行,DrawText函数使用 lpRect 定义的矩形的宽度,并扩展矩形的底部以容纳输出文本的最后一行。如果输出文本只有一行,则 DrawText函数改变矩形的右边界,以容纳下正文行的最后一个字符。出现上述任何一种情况。 - DT_CENTER:指定文本水平居中显示。- DT_VCENTER:指定文本垂直居中显示。该标记只在单行文本输出时有效,所以它必须与DT_SINGLELINE结合使用。- DT_SINGLELINE:单行显示文本,回车和换行符都不断行。

DrawText 示例:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC hdc; 	//设备环境句柄PAINTSTRUCT ps;RECT rect;switch (message){//窗口绘制消息case WM_PAINT:hdc = BeginPaint(hwnd, &ps);GetClientRect(hwnd, &rect);DrawText(hdc,TEXT("欢迎你!"),- 1,&rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);EndPaint(hwnd, &ps);return 0;//窗口销毁消息case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);
}

运行结果:
在这里插入图片描述
改变窗口大小时,文本会自动调整位置,一直处于窗口中间。

GetClientRect 函数用来获得窗口客户区的坐标,也就是获得客户区这个矩形。


http://chatgpt.dhexx.cn/article/yM31I3T3.shtml

相关文章

pdc-textout(_PDC-结论

pdc->textout( Oh, yes, PDC was the shiznit. We learned about the Pillars of Longhorn: 哦,是的,PDC真是愚蠢。 我们了解了Longhorn的Struts: Lornhorn - Its ALPHA, but its real. Feel free to peruse the SDK. Theres 3 years of…

封印(TextOut函数实际应用)

C中有一个函数:TextOut,这个函数有很多分枝,TextOutA,TextOutW。。。。都在windows.h头文件里面 这个函数干嘛用呢?就是在给定的HDC中显示文字。。 结果被我们坑人党知道了 嘿嘿嘿,于是我们写了个东西&am…

windows文本绘制 TextOut、DrawText、CreateFont、SetTextColor、SetBkColor、SetBkMode

文本绘制 TextOut-将文字绘制在指定坐标位置 DrawText-在矩形区域绘制字符串 int DrawText(HDC hdc, //DC句柄LPCSTR lpString, //字符串int nCount, //字符串长度LPRECT lpRect, //绘制文字的矩形框UINT uFormat //绘制的方式,重点,花样繁多的关键点 );绘制文字样…

MFC textout()输出字体设置

//设置字体 CFont font; font.CreateFont(33, // 字体的高度 0, // 字体的宽度 0, // nEscapement 0, // nOrientation FW_NORMAL, // nWeight 字体的粗细FALSE, // bItalic 字体是否斜体 FALSE, …

gdi 编程c语言pdf,二、Windows编程GDI—TextOut细节

TextOut是用于显示文字的最常用的GDI函数。语法是: TextOut (hdc, x, y, psText, iLength) ; 以下将详细地讨论这个函数。 第一个参数是设备内容句柄,它既可以是GetDC的传回值,也可以是在处理WM_PAINT消息时BeginPaint的传回值。 设备内容的属…

中年人学C语言Windows程序设计,3 窗口中文本的输出TextOut

中年人学C语言Windows程序设计,3 文本的输出TextOut 函数功能 TextOut 函数使用当前选择的字体、背景颜色和文本颜色,将一个字符串绘制于窗口的指定位置。 API 函数原型: 注释:In 说明该参数是输入的,opt 说明该参…

c语言textout字体大小,《WINDOWS程序设计》第四章关于TEXTOUT的小问题

《WINDOWS程序设计》第四章关于TEXTOUT的小问题 文章原文是这样说的: 您会发现常常需要显示格式化的数字跟简单的字符串。我在第二章讲到过,您不能使惯用的工具(可 爱的printf 函数)来完成这项工作,但是可以使用sprintf 和Windows 版的sprint…

c语言textout字体大小,textout函数怎么用

MFC里 用pDC->TextOut 这个函数怎么实现未知数据输我最近刚开始学计算机图形学还是个纯小白…… 不大懂 想问各路大神。比如欢迎来到CSS布局HTML,TextOut 是用来输出文本的;你说的问题,我看了半天没看懂,你可以是想先格式化字符串再输出是吧,可以如下: 用CString格式化…

Windows API——TextOut()函数学习

1.函数功能 The TextOut function writes a character string at the specified location, using the currently selected font, background color, and text color. TextOut函数使用当前选定的字体、背景颜色和文本颜色在指定位置写入字符串。 2.函数原型 BOOL TextOutA( …

35.文本输出函数TabbedTextOut、ExtTextOut、TextOut、SetBkColor

TextOut和TabbedTextOut、ExtTextOut的区别 TextOut是简单文本输出,不带格式的,可以控制文本的对齐方式 TabbedTextOut是可以控制带\t(制表符号)的文本 ExtTextOut是在TextOut的基础上,增加字符间距、背景颜色和剪裁框…

windows编程之TextOut与DrawText -- 文本输出实验

文章目录 windows编程之TextOut与DrawText -- 文本输出实验实验名称实验目的实验要求实验源码思考题 windows编程之TextOut与DrawText – 文本输出实验 实验名称 实验3-2-文本输出实验 实验目的 1.掌握常用的文本输出函数TextOut、DrawText的使用,熟悉其…

Monkey的测试

1.Monkey介绍 顾名思义,Monkey就是猴子, Monkey测试,就像一只猴子, 在电脑面前,乱敲键盘在测试。 猴子什么都不懂, 只知道乱敲 通过Monkey程序模拟用户触摸屏幕、滑动Trackball、 按键等操作来对设备上的…

MonkeyTest——简单无脑的移动端自动化测试(初级篇)

MonkeyTest-操作步骤: 1.下载Android sdk X64位,必须和你的电脑操作系统一致。 2.安装完成后,增加adb的系统环境。 A.找到sdk路径。 默认路径:C:\Users\ZSD\AppData\Local\Android\android-sdk\platform-tools B.打开系统环境设置…

【转】指定页面进行Monkey测试

偶然在网上查看到这个技术,感兴趣,就记录下【感谢博主分享】 1.原文再此:https://blog.csdn.net/liyu520131414/article/details/69357777?utm_sourceblogxgwz3 原理原文博主已经讲清楚了,就不粘贴了,下面&#xff…

Android测试-Monkey Test

APP开发过程中,开人员往往自己做一些功能测试和稳定性测试,使用MonkeyTest做压力测试是常用方法,及时修复ANR、CRASH提高项目组整体的开发效率。 一、Monkey简介 Monkey是一种命令行工具,这个工具存在于Android系统/system/frame…

Monkey测试(一)

简介常见参数日志分析简单脚本编写 一:简介 Monkey测试是Android平台自动化测试的一种手段, 通过Monkey程序模拟用户触摸屏幕、滑动,Trackball(轨迹球)、按键等操作来对设备上的程序进行压力测试, 检测程序…

App之Monkey测试

作为初入测试行业的小白,了解一些Monkey测试是很有必要的,在此小编整理了一些App方面Monkey测试的基础以及Monkey脚本的编写,希望可以帮助到大家。 1. Monkey的概念 Monkey测试又称"猴子测试",是指没有测试经验的人对产品进行乱点…

随机测试 Monkey Test

今天说一说随机测试,Monkey Test。翻译成中文就是猴子测试。 你可以想象一只猴子趴在电脑面前,拿着鼠标随便乱点的样子。 一,什么是随机测试? 软件测试中的Monkey测试是测试人员对应用程序随机输入以验证其功能的一种方法。这是…

墨者学院-Bash漏洞分析溯源

Bash漏洞分析溯源 难易程度:★★ 题目类型:命令执行 使用工具:FireFox浏览器、wwwscan 1.打开靶场,根据题目思路找poc.cgi。 2.使用wwwscan扫一下 发现有目录/cgi-bin 3.打开burpsuite,访问/cgi-bin/poc.cgi,截包。 send to repeater&…

vulhub漏洞复现之bash(Shellshock CVE-2014-6271)

Shellshock 破壳漏洞 CVE-2014-6271 1.漏洞概述: GNU Bash 4.3及之前版本在评估某些构造的环境变量时存在安全漏洞,向环境变量值内的函数定义后添加多余的字符串会触发此漏洞,攻击者可利用此漏洞改变或绕过环境限制,以执行shell命…