我有一个将数据打印到打印机的应用程序。现在,我将字体大小硬编码为 18 磅,计算了所有与打印相关的坐标和偏移量(对于某个 18 磅字体),我只是在打印。我这样做只是作为开发我的应用程序的基础。
现在,我希望能够根据字体大小和面孔动态调整所有内容(应该如此)。
我编写了以下测试代码,没有任何错误检查,(C)来获取字体的逻辑大小:
void GetTextSize(char *input, size_t inputSize, char *fontName, size_t fontSize, SIZE *size)
{
if(input == NULL || size == NULL || fontName == NULL)
{
return;
}
else
{
HFONT hFont = NULL;
LOGFONT lf;
HDC hdc = NULL;
memset(&lf, 0, sizeof(lf));
// Get the device context of the entire screen
hdc = GetDC(NULL);
// Set the face-name
strcpy(lf.lfFaceName, fontName);
// Set the font height
lf.lfHeight = -MulDiv(fontSize, GetDeviceCaps(hdc, LOGPIXELSY), 72);
// Set the font weight
lf.lfWeight = FW_NORMAL;
// Create the font
hFont = CreateFontIndirect(&lf);
// Re-associate the obtained device context with the font just created
SelectObject(hdc, hFont);
// Get the required dimensions for the text
GetTextExtentPoint32(hdc, input, inputSize, &size);
// Free resources
ReleaseDC(NULL, hdc);
DeleteObject(hFont);
hFont = NULL;
hdc = NULL;
}
}
基本上,
- 获取整个屏幕的设备上下文。
CreateFontIndirect
使用和LOGFONT
结构创建所需的字体。- 将设备上下文与创建的字体重新关联。
- 使用 以逻辑单位计算字体宽度
GetTextExtentPoint32
。
上面的代码使size
变量包含:cx = 241
, cy = 34
. (我显示器的 DPI 是 96)
我将如何将这些值映射到实际打印尺寸?由于默认文本映射模式是MM_TEXT
,因此这些cx
和cy
值对应于像素。
我需要这样做有两个原因:
- 我需要将长行分成多行。因为我知道以英寸为单位的页面宽度,所以我只需要以英寸为单位的文本宽度。
- 我需要根据字体大小决定从哪里开始打印。
根据打印机的规格,每毫米点数为 8;即DPI约为203.2。