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

目录
相关文章
|
11天前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
102 1
|
2月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
267 0
|
6天前
|
安全 Linux 网络安全
Metasploit Pro 4.22.8-2025091701 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.8-2025091701 (Linux, Windows) - 专业渗透测试框架
90 2
Metasploit Pro 4.22.8-2025091701 (Linux, Windows) - 专业渗透测试框架
|
3月前
|
安全 生物认证 网络安全
windows10无法设置默认保存位置怎么办?显示错误代码0x80070002怎么解决?
Win10系统下载文件时,默认会保存在特定位置,但用户可自行修改。若更改后仍无效,可通过删除目标磁盘中的特定文件夹、修改注册表权限、“干净启动”排除干扰软件或使用第三方修复工具等方式解决此问题。
664 0
|
6天前
|
Linux 网络安全 iOS开发
Metasploit Framework 6.4.90 (macOS, Linux, Windows) - 开源渗透测试框架
Metasploit Framework 6.4.90 (macOS, Linux, Windows) - 开源渗透测试框架
119 1
Metasploit Framework 6.4.90 (macOS, Linux, Windows) - 开源渗透测试框架
|
16天前
|
安全 Linux 网络安全
Metasploit Framework 6.4.88 (macOS, Linux, Windows) - 开源渗透测试框架
Metasploit Framework 6.4.88 (macOS, Linux, Windows) - 开源渗透测试框架
277 0
|
安全 Linux 测试技术
OpenText Static Application Security Testing (Fortify) 25.3 (macOS, Linux, Windows) - 静态应用安全测试
OpenText Static Application Security Testing (Fortify) 25.3 (macOS, Linux, Windows) - 静态应用安全测试
83 0
|
16天前
|
人工智能 边缘计算 搜索推荐
AI产品测试学习路径全解析:从业务场景到代码实践
本文深入解析AI测试的核心技能与学习路径,涵盖业务理解、模型指标计算与性能测试三大阶段,助力掌握分类、推荐系统、计算机视觉等多场景测试方法,提升AI产品质量保障能力。
|
24天前
|
缓存 安全 Linux
Metasploit Pro 4.22.8-2025082101 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.8-2025082101 (Linux, Windows) - 专业渗透测试框架
87 0

热门文章

最新文章