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

安全的文本输出方式:

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

依次使用以下三个函数:

1.StringCchPrintf

2.StringCchLength

3.TextOut

StringCchPrintf:

  1. STRSAFEAPI StringCchPrintfA
  2. (
  3. STRSAFE_LPSTR pszDest,
  4. size_t cchDest,
  5. STRSAFE_LPCSTR pszFormat,
  6. ...
  7. );

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

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

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

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

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

StringCchLength:

  1. STRSAFEAPI StringCchLengthW
  2. (
  3. STRSAFE_PCNZWCH psz,
  4. size_t cchMax,
  5. size_t *pcchLength
  6. );

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

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

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

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

TextOut:

  1. BOOL TextOutA(
  2. HDC hdc,
  3. int x,
  4. int y,
  5. LPCSTR lpString,
  6. int c
  7. );

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

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

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

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

输入到下一行:

使用GetTextMetrics:

  1. BOOL GetTextMetrics
  2. (
  3. HDC hdc,
  4. LPTEXTMETRIC lptm
  5. );

为此需要定义一个

TEXTMETRIC的结构:

  1. typedef struct tagTEXTMETRICA {
  2. LONG tmHeight;
  3. LONG tmAscent;
  4. LONG tmInternalLeading;
  5. LONG tmExternalLeading;
  6. LONG tmAveCharWidth;
  7. LONG tmMaxCharWidth;
  8. LONG tmWeight;
  9. LONG tmOverhang;
  10. LONG tmDigitizedAspectX;
  11. LONG tmDigitizedAspectY;
  12. BYTE tmFirstChar;
  13. BYTE tmLastChar;
  14. BYTE tmDefaultChar;
  15. BYTE tmBreakChar;
  16. BYTE tmItalic;
  17. BYTE tmUnderlined;
  18. BYTE tmStruckOut;
  19. BYTE tmPitchAndFamily;
  20. BYTE tmCharSet;
  21. } TEXTMETRICA, *PTEXTMETRICA, *NPTEXTMETRICA, *LPTEXTMETRICA;

Windows字符结构:

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

一个例子:

  1. #include<Windows.h>
  2. #include<strsafe.h>
  3.  
  4. const int STRSIZE = 16;
  5. const int X = 0;
  6. const int Y = 0;
  7.  
  8. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  9.  
  10. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdshow, int iCmdshow)
  11. {
  12. ……
  13. }
  14.  
  15. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  16. {
  17. HDC hdc;
  18. PAINTSTRUCT ps;
  19. RECT rect;
  20.  
  21. int xstr = X;
  22. int ystr = X;
  23.  
  24. TCHAR szstr[STRSIZE];
  25. size_t strsize;
  26. TEXTMETRIC tm;
  27.  
  28. static int cxchar;
  29. static int cychar;
  30.  
  31. switch (message)
  32. {
  33. case WM_CREATE:
  34. hdc = GetDC(hwnd);
  35. GetTextMetrics(hdc, &tm);
  36. cxchar = tm.tmAveCharWidth;
  37. cychar = tm.tmHeight + tm.tmExternalLeading;
  38. ReleaseDC(hwnd, hdc);
  39. return 0;
  40.  
  41. case WM_PAINT:
  42. hdc = BeginPaint(hwnd, &ps);
  43.  
  44. StringCchPrintf(szstr, STRSIZE, TEXT("%s: %u"), TEXT("Output"), 1);
  45. StringCchLength(szstr, STRSIZE, &strsize);
  46. TextOut(hdc, xstr, ystr, szstr, strsize);
  47. StringCchPrintf(szstr, STRSIZE, TEXT("%s: %u"), TEXT("Output"), 2);
  48. StringCchLength(szstr, STRSIZE, &strsize);
  49. TextOut(hdc, xstr, ystr + cychar, szstr, strsize);
  50.  
  51. EndPaint(hwnd, &ps);
  52. return 0;
  53.  
  54. ……
  55.  
  56. case WM_DESTROY:
  57. PostQuitMessage(0);
  58. return 0;
  59.  
  60. default:
  61. return DefWindowProc(hwnd, message, wParam, lParam);
  62. }
  63. }

  

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. [PWA] Storage information for PWA application

    Be careful with the storage use cases, free the storage when it is necessary.

  2. [ML] Tensorflow.js + Image segmentPerson

    <!DOCTYPE html> <html> <head> <title>Parcel Sandbox</title> <meta c ...

  3. Docker 安装ubuntu服务器

    ### 1. 安装ubuntu ```docker pull ubuntudocker run -it -d --name ubuntu_test -p 2222:22 ubuntu ``` ### ...

  4. 【luoguP2999】 [USACO10NOV]巧克力牛奶Chocolate Milk

    题目链接 考虑每条路径都经过的一个点,它可以到达每个出度为零点(终点),且每个入读为零点(起点)都能到达它, 拓扑排序记录下每个结点能到达的出度为零点的个数和沿反边能到达的入读为零点个数,判断是否等于 ...

  5. 每日Android一问等你来解答-什么是Activity的生命周期?

    关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 什么是Activity的生命周期? 生命周期: 对于生命周期我们 ...

  6. 设置多个className

    有时候我们需要有选择地设置多个className function myComponent(props) { const myClassName = { 'aaa', {'bbb': props.ne ...

  7. @Aspect注解并不属于@Component的一种

    也就是一个类单纯如果只添加了@Aspect注解,那么它并不能被context:component-scan标签扫描到. 想要被扫描到的话,需要追加一个@Component注解

  8. ORACLE多条件的统计查询(case when)

    前几天要做一个统计查询的功能,因为涉及多张表,多种条件的统计分析.一开始便想到了UNION和IF语句,然后写了1000多行代码,就为了查30条数据觉得不应该. 然后就开始百度,多种条件下的统计.然后有 ...

  9. 如何在 Debian 9 上安装和使用 Docker

    Docker 是一个容器化平台,允许您快速构建,测试和部署应用程序,作为便携式,自给自足的容器,几乎可以在任何地方运行. Docker 是容器技术的事实上的标准,它是 DevOps 工程师及其持续集成 ...

  10. 查询优化 In Oracle

    Cost-based query transformation in Oracle Enhanced Subquery Optimizations in Oracle Cost-based query ...