2009-05-30 51 views
3

的常用方法來創建與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,我是否合併了LOGPIXELSXLOGPIXELSY?我想的是這樣的:

// 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字體映射器和打印機驅動程序是如何工作的。

+0

你真的在這樣的打印機上試過這段代碼嗎?你會想測試你得到的任何解決方案,對吧? – 2009-09-21 22:38:28

+0

結果因打印機而異,所以推測驅動程序是越野車。我想知道它是如何工作的。 – 2010-07-20 16:31:09

回答

0

1)有72點/英寸。 (它曾經是72.27,但被改變了。) 2)以你所做的方式合併LOGPIXELSX和LOGPIXELSY很好,但是 3)字體映射器在映射字體時沒有看擒縱和定位。 LOGPIXELS值將僅用作座標轉換的一部分。

http://msdn.microsoft.com/en-us/library/ms969909(loband).aspx

不能確定如何「打印機驅動程序的工作」,因爲聲明可能包括許多可能的驅動器和打印機。

它們可以用方形像素進行光柵化,然後拉伸到非方形。他們可以轉換字形曲線。他們可以做別的事情。