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;
}

目录
相关文章
|
3月前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
125 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
7天前
|
前端开发 JavaScript 测试技术
使用ChatGPT生成登录产品代码的测试用例和测试脚本
使用ChatGPT生成登录产品代码的测试用例和测试脚本
60 35
|
3月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
7天前
|
JavaScript 前端开发 Java
使用ChatGPT生成关于登录产品代码的单元测试代码
使用ChatGPT生成关于登录产品代码的单元测试代码
36 16
|
4月前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
1月前
|
算法 Java 测试技术
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
59 13
|
1月前
|
安全 Ubuntu Linux
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
57 9
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
85 1
|
2月前
|
人工智能 测试技术 Windows
Windows 竞技场:面向下一代AI Agent的测试集
【10月更文挑战第25天】随着人工智能的发展,大型语言模型(LLMs)在多模态任务中展现出巨大潜力。为解决传统基准测试的局限性,研究人员提出了Windows Agent Arena,一个在真实Windows操作系统中评估AI代理性能的通用环境。该环境包含150多个多样化任务,支持快速并行化评估。研究团队还推出了多模态代理Navi,在Windows领域测试中成功率达到19.5%。尽管存在局限性,Windows Agent Arena仍为AI代理的评估和研究提供了新机遇。
62 3
|
4月前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
94 6
基于Python访问Hive的pytest测试代码实现

热门文章

最新文章