2009-05-30 13 views
3

Der gemeinsame Weg, um eine Schriftart mit GDI erstellen, um die gewünschte Punktgröße und dem Zielgerät die vertikale Auflösung (DPI) wie folgt zu verwenden:Wie lege ich die Schrifthöhe in verschiedenen Ausrichtungen fest?

LOGFONT lf = {0}; 
lf.lfHeight = -MulDiv(point_size, GetDeviceCaps(hdc, LOGPIXELSY), 72); 
... 
HFONT hfont = CreateFontIndirect(&lf); 

den Modus Standard MM_TEXT Mapping Angenommen, diese wandelt point_size in die Pixel Höhe für das gewünschte Gerät. (Dies ist eine gemeinsame Annäherung. Es gibt tatsächlich 72,27 Punkte in einem Zoll, nicht 72) (Das Minuszeichen bedeutet, dass ich die aktuelle Zeichenhöhe angeben will, nicht die Zellenhöhe.)

Wenn ich will, eine erstellen Seitliche Schrift - das heißt, eine mit einer Orientierung und Hemmung von 90 Grad - verwende ich LOGPIXELSX statt LOGPIXELSY? Für einige der Drucker, auf die ich ausgerichtet bin, sind die horizontalen und vertikalen Auflösungen unterschiedlich. Wenn ich einen Winkel von theta möchte, kombiniere ich LOGPIXELSX und LOGPIXELSY? Ich denke an so etwas wie diese:

// 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); 
... 

Dieser intuitiven macht Sinn für mich, aber ich frage mich, ob das wirklich ist, wie die GDI Schriftart-Zuordnung und Druckertreiber arbeiten.

+0

Haben Sie diesen Code tatsächlich auf einem solchen Drucker ausprobiert? Du wirst jede Lösung testen wollen, oder? –

+0

Die Ergebnisse variieren von Drucker zu Drucker, vermutlich sind die Treiber also fehlerhaft. Ich frage mich, wie es funktionieren soll. –

Antwort

0

1) Es gibt 72 Punkte/Zoll. (Es war 72.27, wurde aber geändert.) 2) Die Kombination von LOGPIXELSX und LOGPIXELSY in der Art und Weise, wie Sie es tun, ist in Ordnung, aber 3) Der Font-Mapper schaut nicht auf Hemmung und Ausrichtung beim Mappen von Schriften. Die LOGPIXELS-Werte werden nur als Teil der Koordinatentransformation verwendet.

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

Nicht sicher, wie die „Druckertreiber arbeiten“, weil die Aussage viele mögliche Treiber und Drucker enthalten könnten.

Sie könnten mit quadratischen Pixeln zu rasterisieren, dann zu nicht-Quadrat zu strecken. Sie könnten Glyphenkurven transformieren. Sie könnten etwas anderes machen.

+0

Danke für den Link zum Artikel zum Font Mapper. Leider ist es in dieser Frage nicht spezifisch genug. Angenommen, ich verwende einen Drucker, der vertikal 72 Pixel pro Zoll und horizontal 144 Pixel pro Zoll hat. Wenn ich lfHeight von 10 für eine normale Schriftart festlege, erhalte ich einen Text, der 10 Punkte hoch ist. Aber wenn ich eine Orientierung und eine Hemmung von 90 Grad vorschlage, dann ist unklar, ob die Zeichen 5 Punkte hoch oder 10 sein werden. Es hängt davon ab, ob der Mapper und/oder Rasterizer die Drehung bei der Anwendung von lfHeight berücksichtigt. –

Verwandte Themen