的常用方法來創建與GDI的字體是使用這樣的期望點尺寸和目標設備的垂直分辨率(DPI):如何指定不同方向的字體高度?
LOGFONT lf = {0};
lf.lfHeight = -MulDiv(point_size, GetDeviceCaps(hdc, LOGPIXELSY), 72);
...
HFONT hfont = CreateFontIndirect(&lf);
假設默認MM_TEXT
映射模式,將其轉換POINT_SIZE到像素所需設備的高度。 (這是一個常見的近似值,實際上有72.27點在一英寸,而不是72.)(減號表示我想指定實際字符高度,而不是單元格高度。)
如果我想創建一個橫向字體 - 也就是說,一個具有90度的方向和擒縱系統 - 我是否使用LOGPIXELSX
而不是LOGPIXELSY
?對於我所定位的一些打印機,水平和垂直分辨率不同。
一般來說,如果我想要一個角度theta
,我是否合併了LOGPIXELSX
和LOGPIXELSY
?我想的是這樣的:
// Given theta in degrees (e.g., theta = 45.0) ...
double theta_radians = theta * 2.0 * pi/360.0;
int dpi = static_cast<int>(GetDeviceCaps(hdc, LOGPIXELSX) * sin(theta_radians) +
GetDeviceCaps(hdc, LOGPIXELSY) * cos(theta_radians) +
0.5);
LOGFONT lf = {0};
lf.lfHeight = -MulDiv(point_size, dpi, 72);
// Set escapement and orientation to theta in tenths of a degree.
lf.lfEscapement = lf.lfOrientation = static_cast<LONG>(theta * 10.0 + 0.5);
...
這使得直觀的感覺給我,但我不知道如果這是真正的GDI字體映射器和打印機驅動程序是如何工作的。
你真的在這樣的打印機上試過這段代碼嗎?你會想測試你得到的任何解決方案,對吧? – 2009-09-21 22:38:28
結果因打印機而異,所以推測驅動程序是越野車。我想知道它是如何工作的。 – 2010-07-20 16:31:09