工程模板:https://www.cnblogs.com/eternalmoonbeam/p/10793080.html

安全的文本输出方式:

需要额外包含头文件strsafe.h

依次使用以下三个函数:

1.StringCchPrintf

2.StringCchLength

3.TextOut

StringCchPrintf:

STRSAFEAPI StringCchPrintfA
(
STRSAFE_LPSTR pszDest,
size_t cchDest,
STRSAFE_LPCSTR pszFormat,
...
);

将格式化数据写入指定的字符串。向函数提供目标缓冲区的大小,以确保它不会写入超过该缓冲区的结尾。

第一个参数是待写入的字符串,可使用TCHAR定义(不可省略长度);

第二个参数是缓冲区大小,尽量使用合适的长度,可稍大于字符串长度,使用size_t定义;

第三个参数规定了文本的输入方式,并可引入其它变量进行输入通过转换修饰符“%”,可直接通过TEXT(" ")进行编辑;

添加的参数要与转换修饰符一一对应。

StringCchLength:

STRSAFEAPI StringCchLengthW
(
STRSAFE_PCNZWCH psz,
size_t cchMax,
size_t *pcchLength
);

确定字符串是否超过指定的长度(以字符为单位)。

第一个参数使用与上个函数相同的字符串名;

第二个参数是字符串最大长度;

第三个参数是存储字符串实际长度的变量,使用size_t进行定义,但传入的是其地址,要使用地址运算“&”。

TextOut:

BOOL TextOutA(
HDC hdc,
int x,
int y,
LPCSTR lpString,
int c
);

第一个参数是获取设备环境上下文的句柄,在模板中已经定义过;

第二、第三个参数是目标显示位置的坐标,即文本矩形的左上角,默认单位像素点;

第四个参数与前二个函数的第一参数一样;

第五个参数使用上一个函数第四个参数的内容,为目标字符串的实际长度。

输入到下一行:

使用GetTextMetrics:

BOOL GetTextMetrics
(
HDC hdc,
LPTEXTMETRIC lptm
);

为此需要定义一个

TEXTMETRIC的结构:

typedef struct tagTEXTMETRICA {
LONG tmHeight;
LONG tmAscent;
LONG tmInternalLeading;
LONG tmExternalLeading;
LONG tmAveCharWidth;
LONG tmMaxCharWidth;
LONG tmWeight;
LONG tmOverhang;
LONG tmDigitizedAspectX;
LONG tmDigitizedAspectY;
BYTE tmFirstChar;
BYTE tmLastChar;
BYTE tmDefaultChar;
BYTE tmBreakChar;
BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut;
BYTE tmPitchAndFamily;
BYTE tmCharSet;
} TEXTMETRICA, *PTEXTMETRICA, *NPTEXTMETRICA, *LPTEXTMETRICA;

Windows字符结构:

因此tmHeight + tmExternalLeading就是两行文本基准点的高度差。

一个例子:

#include<Windows.h>
#include<strsafe.h> const int STRSIZE = 16;
const int X = 0;
const int Y = 0; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdshow, int iCmdshow)
{
……
} LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect; int xstr = X;
int ystr = X; TCHAR szstr[STRSIZE];
size_t strsize;
TEXTMETRIC tm; static int cxchar;
static int cychar; switch (message)
{
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cxchar = tm.tmAveCharWidth;
cychar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC(hwnd, hdc);
return 0; case WM_PAINT:
hdc = BeginPaint(hwnd, &ps); StringCchPrintf(szstr, STRSIZE, TEXT("%s: %u"), TEXT("Output"), 1);
StringCchLength(szstr, STRSIZE, &strsize);
TextOut(hdc, xstr, ystr, szstr, strsize);
StringCchPrintf(szstr, STRSIZE, TEXT("%s: %u"), TEXT("Output"), 2);
StringCchLength(szstr, STRSIZE, &strsize);
TextOut(hdc, xstr, ystr + cychar, szstr, strsize); EndPaint(hwnd, &ps);
return 0; …… case WM_DESTROY:
PostQuitMessage(0);
return 0; default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
}

  

Win32API文本处理的更多相关文章

  1. python通过win32api轻松获取控件的属性值

    1.如何利用句柄操作windows窗体 首先,获得窗体的句柄  win32api.FindWindows() 第二,获得窗体中控件的id号,spy++ 第三,根据控件的ID获得控件的句柄(hwnd)  ...

  2. Python文本数据互相转换(pandas and win32com)

    (工作之后,就让自己的身心都去休息吧) 今天介绍一下文本数据的提取和转换,这里主要实例的转换为excel文件(.xlsx)转换world文件(.doc/docx),同时需要使用win32api,同py ...

  3. 对于pycharm和vscode下,从外部复制文本内容为python字符串内容是会自动加\u202a解决办法

    先来看下这个python3源代码,表面上看没有语法毛病,如果源代码字符串内容是手动复制过来的文本内容,在pycharm和vscode下始终提示: pywintypes.error: (2, 'Shel ...

  4. 【转】python win32api win32gui win32con 简单操作教程(窗口句柄 发送消息 常用方法 键盘输入)

    作者:https://blog.csdn.net/qq_16234613/article/details/79155632 附:https://www.programcreek.com/python/ ...

  5. python webdriver api-操作富文本框

    操作富文本框-就是邮件正文部分,可以选字体啥的 第一种方式: 一般都是在iframe里,要切进去,一般是”html/body”,编辑之后,再切出来,然后再send_keys就完事儿 #encoding ...

  6. win32api win32gui win32con 窗口句柄 发送消息 常用方法

    Pywin32是一个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量.接口.线程以及COM机制等等. 1.通过类名和标题查找窗口句柄,并获得窗口位置和 ...

  7. webdriver高级应用- 操作富文本框

    富文本框的技术实现和普通的文本框的定位存在较大的区别,富文本框的常见技术用到了Frame标签,并且在Frame里面实现了一个完整的HTML网页结构,所以使用普通的定位模式将无法直接定位到富文本框对象. ...

  8. python---win32gui、win32con、win32api:winAPI操作

    python操作winAPI 窗口操作: import sys from PyQt5.QtWidgets import QApplication, QWidget from lianxi import ...

  9. pywin32 获取 windows 的窗体内文本框的内容

    用 spy++去确认找到了文本框的句柄了. 用函数 win32gui.SendMessage 获取不了文本框的文本内容,用 str 类型的参数接收获取的内容的话没有获取到东西,而用 PyBuffer ...

随机推荐

  1. 关于System.MissingMethodException异常

    什么是MissingMethodException 试图动态访问不存在的方法时引发的异常. 继承 Object Exception SystemException MemberAccessExcept ...

  2. 【loj2339】【WC2018】通道

    题目 三棵带边权的树,求 \[ dis1(u,v) + dis2(u,v) + dis3(u,v) \] 的最大值 \(1 \le n \le 10^5\) 题解 对\(T_1\)做边分治,把分治边的 ...

  3. 【luoguP2995】[USACO10NOV]牛的照片Cow Photographs

    题目链接 首先求出原序列的逆序对个数, 然后考虑每次将目标序列最前面的数放在最后,即最小的数变为最大 设最小数的位置是\(p\),那么逆序对的个数增加了\(n-p\),减少了\(p-1\) #incl ...

  4. git dev分支合并线上master

    1.本地dev新建/切换本地master 新建 git checkout -b master 切换 git checkout  master 2.本地dev与本地master合并 git merge ...

  5. 多语言编程必备的十大 Vim 插件

    原文地址:http://www.linuxeden.com/a/58769 使用这 10 个 Vim 插件,可以让你在写代码或运维时,感觉更棒. 我使用 Vim 文本编辑器大约 20 年了.有一段时间 ...

  6. 生成一个字母数字组合的n位随机码、随机数、随机字符串

    package com.cms.util; /** * 生成一个字母数字组合的n位随机码 * @author abc * */ public class CodeUtil { // private f ...

  7. gulp&sass安装配置

    首先需要nodejs和npm 然后安装Gulp及其Sass预处理器 在主题目录的根目录中,创建一个空的package.json并复制粘贴以下代码: { "author": &quo ...

  8. ES6继承小实例

    ES6继承小实例 一.总结 一句话总结: js中的类和继承可以多用es6里面的,和其它后端语言的使用方法一样 class Animal { constructor(name) { this.name ...

  9. Java_jdbc 基础笔记之八 数据库连接(写一个查询Student对象的方法)

    public Student getStudent(String sql, Object... args) { // 查询Student对象 Student stu = null; Connectio ...

  10. Springboot单元测试Junit深度实践

    Springboot单元测试Junit深度实践 前言 单元测试的好处估计大家也都知道了,但是大家可以发现在国内IT公司中真正推行单测的很少很少,一些大厂大部分也只是在核心产品推广单测来保障质量,今天这 ...