当前位置: 首页 > news >正文

输出文字的综合使用例子

书籍:《windows程序设计(第五版)》

环境:visual studio 2022

内容:输出文字->综合使用

说明:以下内容大部分来自腾讯元宝

1.建立空项目

编写第一个WINDOWS程序_visual studio,创建一个新的 windows应用程序-CSDN博客https://blog.csdn.net/qq_20725221/article/details/146255703?spm=1001.2014.3001.55022.SYSMETS.h

结构体定义(未显式命名,直接定义并初始化数组。)->数组初始化(每项应为 (iIndex, szLabel, szDesc))

/*-----------------------------------------------
   SYSMETS.H -- System metrics display structure
  -----------------------------------------------*/
#pragma once

#include <Windows.h>

#define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))


//此代码定义了一个匿名结构体数组 sysmetrics,用于存储 ​Windows 系统度量(System Metrics)​ 的索引、标签和描述。
//其目的是将系统度量常量(如屏幕宽度、高度)与对应的文本信息关联,便于后续动态查询和界面适配。
struct
{
    int     iIndex;
    TCHAR* szLabel;
    TCHAR* szDesc;
}
sysmetrics[] =
{
     SM_CXSCREEN,             TEXT("SM_CXSCREEN"),
                              TEXT("Screen width in pixels"),
     SM_CYSCREEN,             TEXT("SM_CYSCREEN"),
                              TEXT("Screen height in pixels"),
     SM_CXVSCROLL,            TEXT("SM_CXVSCROLL"),
                              TEXT("Vertical scroll width"),
     SM_CYHSCROLL,            TEXT("SM_CYHSCROLL"),
                              TEXT("Horizontal scroll height"),
     SM_CYCAPTION,            TEXT("SM_CYCAPTION"),
                              TEXT("Caption bar height"),
     SM_CXBORDER,             TEXT("SM_CXBORDER"),
                              TEXT("Window border width"),
     SM_CYBORDER,             TEXT("SM_CYBORDER"),
                              TEXT("Window border height"),
     SM_CXFIXEDFRAME,         TEXT("SM_CXFIXEDFRAME"),
                              TEXT("Dialog window frame width"),
     SM_CYFIXEDFRAME,         TEXT("SM_CYFIXEDFRAME"),
                              TEXT("Dialog window frame height"),
     SM_CYVTHUMB,             TEXT("SM_CYVTHUMB"),
                              TEXT("Vertical scroll thumb height"),
     SM_CXHTHUMB,             TEXT("SM_CXHTHUMB"),
                              TEXT("Horizontal scroll thumb width"),
     SM_CXICON,               TEXT("SM_CXICON"),
                              TEXT("Icon width"),
     SM_CYICON,               TEXT("SM_CYICON"),
                              TEXT("Icon height"),
     SM_CXCURSOR,             TEXT("SM_CXCURSOR"),
                              TEXT("Cursor width"),
     SM_CYCURSOR,             TEXT("SM_CYCURSOR"),
                              TEXT("Cursor height"),
     SM_CYMENU,               TEXT("SM_CYMENU"),
                              TEXT("Menu bar height"),
     SM_CXFULLSCREEN,         TEXT("SM_CXFULLSCREEN"),
                              TEXT("Full screen client area width"),
     SM_CYFULLSCREEN,         TEXT("SM_CYFULLSCREEN"),
                              TEXT("Full screen client area height"),
     SM_CYKANJIWINDOW,        TEXT("SM_CYKANJIWINDOW"),
                              TEXT("Kanji window height"),
     SM_MOUSEPRESENT,         TEXT("SM_MOUSEPRESENT"),
                              TEXT("Mouse present flag"),
     SM_CYVSCROLL,            TEXT("SM_CYVSCROLL"),
                              TEXT("Vertical scroll arrow height"),
     SM_CXHSCROLL,            TEXT("SM_CXHSCROLL"),
                              TEXT("Horizontal scroll arrow width"),
     SM_DEBUG,                TEXT("SM_DEBUG"),
                              TEXT("Debug version flag"),
     SM_SWAPBUTTON,           TEXT("SM_SWAPBUTTON"),
                              TEXT("Mouse buttons swapped flag"),
     SM_CXMIN,                TEXT("SM_CXMIN"),
                              TEXT("Minimum window width"),
     SM_CYMIN,                TEXT("SM_CYMIN"),
                              TEXT("Minimum window height"),
     SM_CXSIZE,               TEXT("SM_CXSIZE"),
                              TEXT("Min/Max/Close button width"),
     SM_CYSIZE,               TEXT("SM_CYSIZE"),
                              TEXT("Min/Max/Close button height"),
     SM_CXSIZEFRAME,          TEXT("SM_CXSIZEFRAME"),
                              TEXT("Window sizing frame width"),
     SM_CYSIZEFRAME,          TEXT("SM_CYSIZEFRAME"),
                              TEXT("Window sizing frame height"),
     SM_CXMINTRACK,           TEXT("SM_CXMINTRACK"),
                              TEXT("Minimum window tracking width"),
     SM_CYMINTRACK,           TEXT("SM_CYMINTRACK"),
                              TEXT("Minimum window tracking height"),
     SM_CXDOUBLECLK,          TEXT("SM_CXDOUBLECLK"),
                              TEXT("Double click x tolerance"),
     SM_CYDOUBLECLK,          TEXT("SM_CYDOUBLECLK"),
                              TEXT("Double click y tolerance"),
     SM_CXICONSPACING,        TEXT("SM_CXICONSPACING"),
                              TEXT("Horizontal icon spacing"),
     SM_CYICONSPACING,        TEXT("SM_CYICONSPACING"),
                              TEXT("Vertical icon spacing"),
     SM_MENUDROPALIGNMENT,    TEXT("SM_MENUDROPALIGNMENT"),
                              TEXT("Left or right menu drop"),
     SM_PENWINDOWS,           TEXT("SM_PENWINDOWS"),
                              TEXT("Pen extensions installed"),
     SM_DBCSENABLED,          TEXT("SM_DBCSENABLED"),
                              TEXT("Double-Byte Char Set enabled"),
     SM_CMOUSEBUTTONS,        TEXT("SM_CMOUSEBUTTONS"),
                              TEXT("Number of mouse buttons"),
     SM_SECURE,               TEXT("SM_SECURE"),
                              TEXT("Security present flag"),
     SM_CXEDGE,               TEXT("SM_CXEDGE"),
                              TEXT("3-D border width"),
     SM_CYEDGE,               TEXT("SM_CYEDGE"),
                              TEXT("3-D border height"),
     SM_CXMINSPACING,         TEXT("SM_CXMINSPACING"),
                              TEXT("Minimized window spacing width"),
     SM_CYMINSPACING,         TEXT("SM_CYMINSPACING"),
                              TEXT("Minimized window spacing height"),
     SM_CXSMICON,             TEXT("SM_CXSMICON"),
                              TEXT("Small icon width"),
     SM_CYSMICON,             TEXT("SM_CYSMICON"),
                              TEXT("Small icon height"),
     SM_CYSMCAPTION,          TEXT("SM_CYSMCAPTION"),
                              TEXT("Small caption height"),
     SM_CXSMSIZE,             TEXT("SM_CXSMSIZE"),
                              TEXT("Small caption button width"),
     SM_CYSMSIZE,             TEXT("SM_CYSMSIZE"),
                              TEXT("Small caption button height"),
     SM_CXMENUSIZE,           TEXT("SM_CXMENUSIZE"),
                              TEXT("Menu bar button width"),
     SM_CYMENUSIZE,           TEXT("SM_CYMENUSIZE"),
                              TEXT("Menu bar button height"),
     SM_ARRANGE,              TEXT("SM_ARRANGE"),
                              TEXT("How minimized windows arranged"),
     SM_CXMINIMIZED,          TEXT("SM_CXMINIMIZED"),
                              TEXT("Minimized window width"),
     SM_CYMINIMIZED,          TEXT("SM_CYMINIMIZED"),
                              TEXT("Minimized window height"),
     SM_CXMAXTRACK,           TEXT("SM_CXMAXTRACK"),
                              TEXT("Maximum draggable width"),
     SM_CYMAXTRACK,           TEXT("SM_CYMAXTRACK"),
                              TEXT("Maximum draggable height"),
     SM_CXMAXIMIZED,          TEXT("SM_CXMAXIMIZED"),
                              TEXT("Width of maximized window"),
     SM_CYMAXIMIZED,          TEXT("SM_CYMAXIMIZED"),
                              TEXT("Height of maximized window"),
     SM_NETWORK,              TEXT("SM_NETWORK"),
                              TEXT("Network present flag"),
     SM_CLEANBOOT,            TEXT("SM_CLEANBOOT"),
                              TEXT("How system was booted"),
     SM_CXDRAG,               TEXT("SM_CXDRAG"),
                              TEXT("Avoid drag x tolerance"),
     SM_CYDRAG,               TEXT("SM_CYDRAG"),
                              TEXT("Avoid drag y tolerance"),
     SM_SHOWSOUNDS,           TEXT("SM_SHOWSOUNDS"),
                              TEXT("Present sounds visually"),
     SM_CXMENUCHECK,          TEXT("SM_CXMENUCHECK"),
                              TEXT("Menu check-mark width"),
     SM_CYMENUCHECK,          TEXT("SM_CYMENUCHECK"),
                              TEXT("Menu check-mark height"),
     SM_SLOWMACHINE,          TEXT("SM_SLOWMACHINE"),
                              TEXT("Slow processor flag"),
     SM_MIDEASTENABLED,       TEXT("SM_MIDEASTENABLED"),
                              TEXT("Hebrew and Arabic enabled flag"),
     SM_MOUSEWHEELPRESENT,    TEXT("SM_MOUSEWHEELPRESENT"),
                              TEXT("Mouse wheel present flag"),
     SM_XVIRTUALSCREEN,       TEXT("SM_XVIRTUALSCREEN"),
                              TEXT("Virtual screen x origin"),
     SM_YVIRTUALSCREEN,       TEXT("SM_YVIRTUALSCREEN"),
                              TEXT("Virtual screen y origin"),
     SM_CXVIRTUALSCREEN,      TEXT("SM_CXVIRTUALSCREEN"),
                              TEXT("Virtual screen width"),
     SM_CYVIRTUALSCREEN,      TEXT("SM_CYVIRTUALSCREEN"),
                              TEXT("Virtual screen height"),
     SM_CMONITORS,            TEXT("SM_CMONITORS"),
                              TEXT("Number of monitors"),
     SM_SAMEDISPLAYFORMAT,    TEXT("SM_SAMEDISPLAYFORMAT"),
                              TEXT("Same color format flag")
};

3.SYSMETS1.c

主要看WndProc()函数。


#include <Windows.h>
#include "SYSMETS.h"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	PSTR szCmdLine, int iCmdShow)
{
	static TCHAR szAppName[] = TEXT("SysMets1");
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;
	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = szAppName;

	if (!RegisterClass(&wndclass))
	{
		MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
		return 0;
	}

	hwnd = CreateWindow(szAppName, TEXT("Get System Metrics No. 1"),
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL, NULL, hInstance, NULL);

	ShowWindow(hwnd, iCmdShow);
	UpdateWindow(hwnd);

	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

//此代码实现了一个系统度量信息展示窗口,通过 WndProc 处理窗口消息,动态获取并显示系统度量值(如屏幕尺寸、滚动条宽度等)。其核心功能包括:
//
//​初始化系统度量参数​(字符宽度、行高等)。
//​绘制系统度量表​(标签、描述、数值)。
//​响应窗口销毁事件。
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	//cxChar(字符平均宽度)、cxCaps(大写字符宽度)、cyChar(行高),仅在窗口生命周期内有效。
	static int cxChar, cxCaps, cyChar;
	HDC hdc;
	int i;
	PAINTSTRUCT ps;
	TCHAR	szBuffer[10];
	TEXTMETRIC tm;

	switch (message)
	{
	case WM_CREATE:
		hdc = GetDC(hwnd);				// 获取设备上下文
		GetTextMetrics(hdc, &tm);		// 获取字体度量
		cxChar = tm.tmAveCharWidth;		// 平均字符宽度
		//tm.tmPitchAndFamily & 1:判断字体是否为变宽字体(如等宽字体为0)。
		//cxCaps 计算:变宽字体为 3 / 2 cxChar,等宽字体为 2 / 2 cxChar。
		cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;		// 大写字符宽度
		//cyChar 包含行高和行间距,确保文本垂直对齐。
		cyChar = tm.tmHeight + tm.tmExternalLeading;					// 行高(含行间距)
		ReleaseDC(hwnd, hdc);			// 释放设备上下文
		return 0;

	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);				// 开始绘制

		/*布局逻辑:
			​标签列:X = 0,Y = cyChar * i(每行间距为行高)。
			​描述列:X = 22 * cxCaps(固定偏移),Y同上。
			​数值列:X = 22 * cxCaps + 40 * cxChar(标签宽度 + 固定偏移),右对齐。
			​数值格式化: % 5d 表示5位右对齐整数,适应不同数值长度。*/
		for (i = 0; i < NUMLINES; i++)				// 遍历系统度量数组
		{
			// 绘制标签(左对齐)
			TextOut(hdc, 0, cyChar * i, sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel));
			// 绘制描述(左对齐)
			TextOut(hdc, 22 * cxCaps, cyChar * i, sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc));

			SetTextAlign(hdc, TA_RIGHT | TA_TOP);		// 设置右对齐

			// 绘制数值(右对齐,带格式化)
			TextOut(hdc, 22 * cxCaps + 40 * cxChar, cyChar * i, szBuffer,
				wsprintf(szBuffer, TEXT("%5d"),
					GetSystemMetrics(sysmetrics[i].iIndex)));
			SetTextAlign(hdc, TA_LEFT | TA_TOP);		// 恢复左对齐
		}
		EndPaint(hwnd, &ps);		// 结束绘制
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);			// 发送退出消息
		return 0;

	}

	return DefWindowProc(hwnd, message, wParam, lParam);
}

4.运行效果

详细介绍TEXTMETRIC结构体-CSDN博客https://blog.csdn.net/qq_20725221/article/details/146535803?sharetype=blogdetail&sharerId=146535803&sharerefer=PC&sharesource=qq_20725221&spm=1011.2480.3001.8118 

相关文章:

  • 本地部署仓库管理工具 Gitlab 并实现外部访问
  • 从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.2.2文本生成逻辑:Top-k采样与温度控制
  • 级联FFT(超采样FFT架构)的MATLAB代码及原理
  • 前端技巧第十期JavaScript作用域链
  • 【银河麒麟系统常识】命令:dotnet --list-sdks(列出已安装的 .NET SDK 版本)
  • matlab打开两个工程
  • Redis 基础篇笔记
  • Android系统Launcher启动流程学习(三)Launcher启动流程
  • Windows 10 ARM64平台MFC串口程序开发
  • 前端知识点---事件委托和机制-阻止冒泡机制-阻止默认行为机制(javascript)
  • JavaScript描述Object.create()方法的原理及作用,如何利用它创建一个具有指定原型的对象?
  • java: 无法访问org.springframework.web.bind.annotation.GetMapping
  • 正则表达式-笔记
  • Transformer的理解
  • 7.2 分治-快排:LeetCode 912. 排序数组
  • Debezium日常分享系列之:Debezium 3.1.0.CR1发布
  • 01STM32时钟树
  • 【redis】哨兵节点作用演示和重选主节点详细流程
  • Vue $bus被多次触发
  • Android 删除aar中的一个类 aar包冲突 aar类冲突 删除aar中的一个包
  • 网站做视频怎么赚钱的/小程序推广50个方法
  • 中山 网站关键词优化/seo外链在线工具
  • 建设高端网站的公司/苏州百度推广服务中心
  • 建建建设网站/磁力宅
  • 做网站中app客户端/关键词点击排名系统
  • 江苏建设工程招标网站/首页排名seo