在 C++ 中使用 TextOut() 更新文本
C++ 中的 TextOut()
函数使用选定的字体、背景颜色和文本颜色在指定位置写入字符串。 它属于`#include <wingdi.h>`。
在本文中,您将学习如何使用 C++ 中的 TextOut()
函数更新任何文本。
每次 C++ 程序为指定设备调用 TextOut()
函数时,使用和更新当前位置的一个有趣的想法是使用 SetTextAlign 函数,并使用设置为 TA_UPDATECP 的 fMode 参数(它将使您能够允许系统)。 wingdi.h 头文件将 TextOut() 函数定义为别名,可自动检测操作系统或处理器的 ANSI 或 Unicode 版本,以选择该函数的合适版本。
使用 C++ 中的 TextOut() 函数使用文本字符串的源来更新文本
TextOut() 函数可以有五个参数,包括 [in] hdc 来处理设备上下文,[in] x 表示 x 坐标,[in] y 表示 y 坐标,[in] IpString 作为指向 字符串,[in] c 定义字符串的长度。 如果这个函数完美执行,它会返回一个非零值; 否则,将产生 null 或 0。
此外,参考点的解释是成正比的并且依赖于C++程序的最新(当前)文本对齐模式。 但是,您可以通过调用 GetTextAlign 函数来检索当前的文本对齐模式。
//displaying text
#include <windows.h>
// define `#include <wingdi.h>` separately or the `windows.h` is an alternative
DWORD text_repaintcount = 0; // to handle the color_code of the primary text
// a call back to the pre-defined function defined in the `windows.h` header file
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // initialize the handle, `typedef UNIT`, `typedef UNIT_PTR`, and `typeof LONG_PTR`
int WINAPI WinMain(HINSTANCE obj_instance_hi, HINSTANCE hInstance_prevent, LPSTR lp_cmd_imp, int show_cmd_new)
{
WNDCLASSEX obj_windclass;
MSG obj_showmessage;
obj_windclass.cbSize = sizeof(WNDCLASSEX);
obj_windclass.style = 0;
obj_windclass.lpfnWndProc = WndProc;
obj_windclass.cbClsExtra = 0;
obj_windclass.cbWndExtra = 0;
obj_windclass.hInstance = obj_instance_hi;
obj_windclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
obj_windclass.hCursor = LoadCursor(NULL, IDC_ARROW);
obj_windclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
obj_windclass.lpszMenuName = NULL;
obj_windclass.lpszClassName = TEXT("New Window!");
obj_windclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&obj_windclass);
CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("New Window!"), TEXT("Text Output"), WS_VISIBLE | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 850, 350, NULL, NULL, obj_instance_hi, NULL);
while (GetMessage(&obj_showmessage, NULL, 0, 0) > 0)
{
TranslateMessage(&obj_showmessage);
DispatchMessage(&obj_showmessage);
}
return obj_showmessage.wParam;
}
LRESULT CALLBACK WndProc(HWND obj_hwnd_pri, UINT obj_message_show, WPARAM obj_wparma_sec, LPARAM obj_iparma_sec)
{
PAINTSTRUCT obj_paint_structure;
HDC obj_HDC_pri;
SIZE text_updated_size;
TCHAR obj_string[100] = TEXT("\0");
HFONT text_update_font;
HBRUSH text_update_hbrush;
TEXTMETRIC text_metric;
int temp_y = 0;
int temp_x = 0;
int text_update_length;
switch (obj_message_show)
{
case WM_PAINT: // it traps the paint message
// the following outputs the text using the default font and other settings
obj_HDC_pri = BeginPaint(obj_hwnd_pri, &obj_paint_structure);
int obj_hDC_last;
obj_hDC_last=SaveDC(obj_HDC_pri); // save the current operating device context
text_update_length = wsprintf(obj_string, TEXT("Stock font"));
TextOut(obj_HDC_pri, 0, temp_y, obj_string, text_update_length);
// updating text using the `ANSI_FIXED_PONT` and outputting the text
GetTextMetrics(obj_HDC_pri, &text_metric);
temp_y = temp_y + text_metric.tmHeight;//calculate new vertical coordinate using text metric
text_update_hbrush = (HBRUSH)GetStockObject(ANSI_FIXED_FONT);
SelectObject(obj_HDC_pri, text_update_hbrush);
text_update_length = wsprintf(obj_string, TEXT("ANSI_FIXED_FONT") );
TextOut(obj_HDC_pri, 0, temp_y, obj_string, text_update_length);
// changing the primary color of the text and producing it as an output
GetTextMetrics(obj_HDC_pri, &text_metric);
temp_y = temp_y + text_metric.tmHeight;
COLORREF textcolor_new;
textcolor_new = COLORREF RGB(255, 0, 0);
SetTextColor(obj_HDC_pri, textcolor_new);
text_update_length = wsprintf(obj_string, TEXT("ANSI_FIXED_FONT, color red") );
TextOut(obj_HDC_pri, temp_x, temp_y, obj_string, text_update_length);
// changing the background color of the text to blue and producing it as an output
GetTextMetrics(obj_HDC_pri, &text_metric);
temp_y = temp_y + text_metric.tmHeight;
COLORREF text_update_backgroundcolor;
text_update_backgroundcolor = COLORREF RGB(0, 0, 255);
SetBkColor(obj_HDC_pri, text_update_backgroundcolor);
text_update_length = wsprintf(obj_string, TEXT("ANSI_FIXED_FONT, color red with blue background") );
TextOut(obj_HDC_pri, temp_x, temp_y, obj_string, text_update_length);
// set the background of the text transparent and produce it as an output
GetTextMetrics(obj_HDC_pri, &text_metric);
temp_y = temp_y + text_metric.tmHeight;
SetBkMode(obj_HDC_pri, TRANSPARENT);
SelectObject(obj_HDC_pri, text_update_hbrush);
text_update_length = wsprintf(obj_string, TEXT("ANSI_FIXED_FONT,color red transparent background") );
TextOut(obj_HDC_pri, 0, temp_y, obj_string, text_update_length);
// changing the font of the text to `Arial` and changing its size to output
GetTextMetrics(obj_HDC_pri, &text_metric);
temp_y = temp_y + text_metric.tmHeight;
text_update_font = CreateFont(20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("Ariel"));
SelectObject(obj_HDC_pri, text_update_font);
text_update_length = wsprintf(obj_string, TEXT("ANSI_FIXED_FONT, color red, transparent background,arial 20") );
TextOut(obj_HDC_pri, 0, temp_y, obj_string, text_update_length);
// use the saved value to restore the original font size, style, and other settings
GetTextMetrics(obj_HDC_pri, &text_metric);
temp_y = temp_y + text_metric.tmHeight;
RestoreDC(obj_HDC_pri, obj_hDC_last);
text_update_length = wsprintf(obj_string, TEXT("stock font restored using SaveDC/RestoreDC") );
TextOut(obj_HDC_pri, temp_x, temp_y, obj_string, text_update_length);
GetTextMetrics(obj_HDC_pri, &text_metric);
temp_y = temp_y + text_metric.tmHeight; // calculating the vertical co-ordinates using the `text_metric`
//changing font to `new roman` and size to `30` and producing an output
int obj_text_baseline;// calculate the baseline of the font
text_update_font = CreateFont(30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("Times New Roman"));
SelectObject(obj_HDC_pri, text_update_font);
GetTextMetrics(obj_HDC_pri, &text_metric);
obj_text_baseline = text_metric.tmAscent;
text_update_length = wsprintf(obj_string, TEXT("times new roman 30 statement 1") );
TextOut(obj_HDC_pri, temp_x, temp_y, obj_string, text_update_length);
GetTextExtentPoint32(obj_HDC_pri, obj_string, text_update_length, &text_updated_size);
temp_x = temp_x + text_updated_size.cx;
// change the font into `courier new` and the size to `20` and output the updated text
int text_changefont_baselinecourier;
text_update_font = CreateFont(20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("Courier New"));
SelectObject(obj_HDC_pri, text_update_font);
GetTextMetrics(obj_HDC_pri, &text_metric);
text_changefont_baselinecourier = obj_text_baseline-text_metric.tmAscent;
text_update_length = wsprintf(obj_string, TEXT("Courier statement ") );
TextOut(obj_HDC_pri, temp_x, temp_y + text_changefont_baselinecourier, obj_string, text_update_length);
GetTextExtentPoint32(obj_HDC_pri, obj_string, lstrlen(obj_string), &text_updated_size);
temp_x = temp_x + text_updated_size.cx;
// changing the font to `ariel` and size to `20` and output the updated text
int text_fontchange_baselinearial;
text_update_font = CreateFont(10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,TEXT( "Ariel"));
SelectObject(obj_HDC_pri, text_update_font);
GetTextMetrics(obj_HDC_pri, &text_metric);
text_fontchange_baselinearial = obj_text_baseline-text_metric.tmAscent;
text_update_length = wsprintf(obj_string, TEXT("ariel 10 statement 3 ") );
TextOut(obj_HDC_pri, temp_x, temp_y + text_fontchange_baselinearial, obj_string, text_update_length);
EndPaint(obj_hwnd_pri, &obj_paint_structure);
DeleteDC(obj_HDC_pri);
DeleteObject(text_update_font);
DeleteObject(text_update_hbrush);
break;
case WM_CLOSE:
DestroyWindow(obj_hwnd_pri);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(obj_hwnd_pri, obj_message_show, obj_wparma_sec, obj_iparma_sec);
}
return 0;
}
输出:
https://drive.google.com/file/d/1YUs55n-gw1rYgOrBce0RAuuET5UPdTLa/view?usp=sharing
在 Windows C++ 应用程序上处理 WM_PAINT 时,使用 TextOut()
函数声明文本字符串的源以显示更新的文本。 本教程中的 C++ 代码不能单独运行,但可以在适当的 Windows 中使用 Visual Studio 或组合使用 .dsp、.dsw、.ncb 和 .opt 文件的用户界面,以在 Windows 上显示适当的对话框。
Windows API 随着新版本的 Windows 发生变化,当前版本需要 L 修饰符,如 L"wchar_ttext 中。此 C++ 代码是在 Windows 10 上使用 Visual Studio 2019 进行测试的。
此外,使用 wWinMain()
、myRegisterClass()
、InitInstance()
和 WndProc()
生成 Windows 桌面 GUI 应用程序的框架,并使用 HDC 中的字体来绘制文本,并使用 TextOut()
函数来绘制文本。 使用新更新的字体的文本。
相关文章
用 C++ 测试射线三角形相交
发布时间:2023/08/28 浏览次数:76 分类:C++
-
测试光线-三角形相交可能需要数百万次测试,并且被认为是 C++ 中任何光线追踪器的核心操作之一(需要为每种几何基元类型提供不同的函数实现)。 本教程将教您如何用 C++ 编写射线-三角形
在 C++ 中取消引用迭代器
发布时间:2023/08/28 浏览次数:64 分类:C++
-
迭代器是 C++ 中的另一种强大机制,可帮助您迭代复杂的数据结构(例如树)和内部没有元素索引的集合(例如数组)。C++ 中的迭代器是什么 在 C++ 中,迭代器是一个类似于指针的对象,指向数
在 C++ 中实现双向链表的迭代器
发布时间:2023/08/28 浏览次数:193 分类:C++
-
由于双向链接数据结构由一组顺序链接的节点组成,其起始节点和结束节点的上一个和下一个链接都指向一个终止符(通常是哨兵节点或空),以方便链表的遍历。 本教程将教您如何在 C++ 中实
用 C++ 编写系统调用
发布时间:2023/08/28 浏览次数:161 分类:C++
-
本文将讨论从 C++ 编写的程序中调用写入系统的方法。 首先,我们将快速刷新系统调用,特别是 write 系统调用及其原型。稍后,我们将讨论从 C++ 程序调用 write 系统调用。
在 C++ 中获取鼠标位置
发布时间:2023/08/28 浏览次数:137 分类:C++
-
本文讲述如何在 C++ 中获取鼠标位置。在 C++ 中获取鼠标位置 C++ 提供了 GetCursorPos 方法来获取鼠标光标的 x 和 y 位置。
C++ 中的多维向量
发布时间:2023/08/28 浏览次数:152 分类:C++
-
这个简短的编程教程是关于 C++ 中多维向量的介绍。 向量是可以像 C++ 中的动态数组一样存储数据的容器,具有自动调整大小的功能。C++ 中的多维向量
在 C++ 中释放 std::vector 对象
发布时间:2023/08/28 浏览次数:52 分类:C++
-
本文将解释如何在 C++/C 中释放 std::vector 对象。 首先,我们将了解释放的自编码方式,然后,我们将研究如何在 C++ 中动态释放 std::vector 对象。在 C++ 中释放对象
在 C++ 中计算两个向量之间的角度
发布时间:2023/08/28 浏览次数:175 分类:C++
-
矢量数学是处理矢量的数学分支,矢量是具有大小和方向的几何对象。 例如,向量尾部形成的角度等于两个向量形成的角度
调整 2D 矢量大小 C++
发布时间:2023/08/28 浏览次数:138 分类:C++
-
在这篇短文中,我们将重点讨论如何在 C++ 中调整 2d 向量的大小。在 C++ 中调整 2D 矢量大小 要在 C++ 中调整二维向量的大小,我们需要使用名为 resize() 的函数