VC/Windows字体度量测试代码

简介: VC/Windows字体度量测试代码

VC/Windows字体度量参数研究及绘制效果_柳鲲鹏的博客-CSDN博客


看了上一篇博文,也许有人想看看代码,自己调试一下。这是代码:


// FontTest.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
//#include <atltypes.h>
//#include <afxwin.h>
#include "FontTest.h"
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE hInst;        // 当前实例
TCHAR szTitle[MAX_LOADSTRING];      // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];    // 主窗口类名
// 此代码模块中包含的函数的前向声明:
ATOM    MyRegisterClass(HINSTANCE hInstance);
BOOL    InitInstance(HINSTANCE, int);
LRESULT CALLBACK  WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK  About(HWND, UINT, WPARAM, LPARAM);
HFONT               CreateMyFont(TCHAR *fontName, int height);
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
  UNREFERENCED_PARAMETER(hPrevInstance);
  UNREFERENCED_PARAMETER(lpCmdLine);
  // TODO: 在此放置代码。
  MSG msg;
  HACCEL hAccelTable;
  // 初始化全局字符串
  LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  LoadString(hInstance, IDC_FONTTEST, szWindowClass, MAX_LOADSTRING);
  MyRegisterClass(hInstance);
  // 执行应用程序初始化:
  if (!InitInstance (hInstance, nCmdShow))
  {
  return FALSE;
  }
  hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_FONTTEST));
  // 主消息循环:
  while (GetMessage(&msg, NULL, 0, 0))
  {
  if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  }
  return (int) msg.wParam;
}
//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
  WNDCLASSEX wcex;
  wcex.cbSize = sizeof(WNDCLASSEX);
  wcex.style    = CS_HREDRAW | CS_VREDRAW;
  wcex.lpfnWndProc  = WndProc;
  wcex.cbClsExtra  = 0;
  wcex.cbWndExtra  = 0;
  wcex.hInstance  = hInstance;
  wcex.hIcon    = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_FONTTEST));
  wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);
  wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
  wcex.lpszMenuName = MAKEINTRESOURCE(IDC_FONTTEST);
  wcex.lpszClassName  = szWindowClass;
  wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
  return RegisterClassEx(&wcex);
}
//
//   函数: InitInstance(HINSTANCE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   hInst = hInstance; // 将实例句柄存储在全局变量中
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
   if (!hWnd)
   {
      return FALSE;
   }
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
   return TRUE;
}
HFONT CreateMyFont(TCHAR *fontName, int size)
{
  //size = MulDiv(-size,GetDeviceCaps(GetDC(NULL),LOGPIXELSX),72); 
  return CreateFont        //创建自定义字体
( size,    //字体的高度
  0, //由系统根据高宽比选取字体最佳宽度值
  0, //文本的倾斜度为,表示水平
  0,  //字体的倾斜度为
  FW_HEAVY,   
  0,      //非斜体字
  0,      //无下划线
  0,      //无删除线
  GB2312_CHARSET, //表示所用的字符集为ANSI_CHARSET
  OUT_DEFAULT_PRECIS, //输出精度为默认精度
  CLIP_DEFAULT_PRECIS,  //剪裁精度为默认精度
  DEFAULT_QUALITY,  //输出质量为默认值
  DEFAULT_PITCH|FF_DONTCARE,
//字间距和字体系列使用默认值
  fontName    //字体名称
  );
}
LRESULT paint(HWND hWnd, HDC hDC)
{
  HFONT metricsFont;  
  HFONT tipFont;
  HPEN hPen;
  LPWSTR title=L"泰山OFFICE";
  LPWSTR fontName = L"宋体";
  //LPWSTR fontName = L"Times New Roman";
  int    fontHeight = 100;
  LPWSTR testText = L"泰山Office";
  RECT clientDimension;    //存放客户区的尺寸
  POINT begin; //保存点的信息,org表示圆心坐标
  hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
  SelectObject(hDC,hPen); 
  GetClientRect(hWnd,&clientDimension); //获取客户区的尺寸
  if((clientDimension.right-clientDimension.left)<400|| (clientDimension.bottom-clientDimension.top)<300) //判断屏幕尺寸
  {
  MessageBox(hWnd,L"屏幕尺寸太小,无法绘图!",L"错误信息",0);
  return 0;
  }
  TCHAR buffer[100] = {0};
  begin.x = 100;
  begin.y = 150;
  // {{{{{{{{{{
  metricsFont=CreateMyFont(fontName, fontHeight);  //创建字体
  SelectObject(hDC,metricsFont); //将创建的字体句柄选入设备环境
  TEXTMETRIC tm;
  GetTextMetrics(hDC, &tm);
  wsprintf(buffer, testText);
  TextOut(hDC,begin.x,begin.y, buffer, lstrlen(buffer));
  // }}}}}}}}}}
  // {{{{{{{{{{
  int x = begin.x;
  int y = begin.y;
  int length = 500;
  int yPos[10] = {0};
  yPos[0] = begin.y;
  //leading, tmInternalLeading=0;
  yPos[1] = begin.y + tm.tmExternalLeading;
  //baseline
  yPos[2] = begin.y + tm.tmAscent;
  //tmHeight=tmDescent+tmAscent
  yPos[3] = begin.y + tm.tmAscent+ tm.tmDescent;
  tipFont=CreateMyFont(fontName, 14);
  SelectObject(hDC,tipFont); //将创建的字体句柄选入设备环境
  for (int i=0; i<10; i++)
  {
  y = yPos[i];
  if (y==0)
  {
    break;
  }
  wsprintf(buffer, L"%d", i);
  TextOut(hDC,x-10, y-7, buffer, lstrlen(buffer));
  MoveToEx(hDC, x, y, NULL);
  LineTo(hDC, x+length, y);
  }
  // }}}}}}}}}}
  // {{{{{{{{{{
  wsprintf(buffer, L"tmExternalLeading=%d, tmInternalLeading=%d",
  tm.tmExternalLeading, tm.tmInternalLeading);
  begin.x = 100;
  begin.y = 280;
  TextOut(hDC,begin.x,begin.y, buffer, lstrlen(buffer));
  wsprintf(buffer, L"tmAscent=%d, tmDescent=%d, tmHeight=%d",
  tm.tmAscent, tm.tmDescent,
  tm.tmHeight);
  begin.y += 20;
  TextOut(hDC,begin.x,begin.y, buffer, lstrlen(buffer));
  // }}}}}}}}}}
  DeleteObject(metricsFont);
  DeleteObject(tipFont);
  return 0;
}
//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT  - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  int wmId, wmEvent;
  PAINTSTRUCT ps;
  HDC hDC;
  switch (message)
  {
  case WM_COMMAND:
  wmId    = LOWORD(wParam);
  wmEvent = HIWORD(wParam);
  // 分析菜单选择:
  switch (wmId)
  {
  case IDM_ABOUT:
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    break;
  case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
  default:
    return DefWindowProc(hWnd, message, wParam, lParam);
  }
  break;
  case WM_PAINT:
  hDC = BeginPaint(hWnd, &ps);
  paint(hWnd, hDC);
  EndPaint(hWnd, &ps);
  break;
  case WM_DESTROY:
  PostQuitMessage(0);
  break;
  default:
  return DefWindowProc(hWnd, message, wParam, lParam);
  }
  return 0;
}
// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
  UNREFERENCED_PARAMETER(lParam);
  switch (message)
  {
  case WM_INITDIALOG:
  return (INT_PTR)TRUE;
  case WM_COMMAND:
  if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
  }
  break;
  }
  return (INT_PTR)FALSE;
}

目录
相关文章
|
1月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
203 0
|
2月前
|
安全 生物认证 网络安全
windows10无法设置默认保存位置怎么办?显示错误代码0x80070002怎么解决?
Win10系统下载文件时,默认会保存在特定位置,但用户可自行修改。若更改后仍无效,可通过删除目标磁盘中的特定文件夹、修改注册表权限、“干净启动”排除干扰软件或使用第三方修复工具等方式解决此问题。
475 0
|
2月前
|
安全 Linux iOS开发
Burp Suite Professional 2025.7 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
Burp Suite Professional 2025.7 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
287 0
Burp Suite Professional 2025.7 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
|
3月前
|
安全 Linux 网络安全
Metasploit Pro 4.22.7-2025061201 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.7-2025061201 (Linux, Windows) - 专业渗透测试框架
104 3
Metasploit Pro 4.22.7-2025061201 (Linux, Windows) - 专业渗透测试框架
|
1月前
|
Windows
office出现0xc0000142错误?windows错误代码为0xc0000142?
office出现0xc0000142错误?windows错误代码为0xc0000142?
81 0
|
1月前
|
SQL 安全 Linux
Metasploit Pro 4.22.8-2025073001 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.8-2025073001 (Linux, Windows) - 专业渗透测试框架
77 0
|
2月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
101 0
|
4月前
|
安全 Unix Linux
Metasploit Pro 4.22.7-2025052201 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.7-2025052201 (Linux, Windows) - 专业渗透测试框架
112 5
Metasploit Pro 4.22.7-2025052201 (Linux, Windows) - 专业渗透测试框架
|
4月前
|
安全 前端开发 Linux
Immunity CANVAS Professional 7.27 (macOS, Linux, Windows) - 渗透测试和漏洞利用平台
Immunity CANVAS Professional 7.27 (macOS, Linux, Windows) - 渗透测试和漏洞利用平台
149 3
Immunity CANVAS Professional 7.27 (macOS, Linux, Windows) - 渗透测试和漏洞利用平台
|
4月前
|
安全 测试技术 Linux
Flawnter 5.9.1 (macOS, Linux, Windows) - 应用程序安全测试软件
Flawnter 5.9.1 (macOS, Linux, Windows) - 应用程序安全测试软件
127 2
Flawnter 5.9.1 (macOS, Linux, Windows) - 应用程序安全测试软件