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.
Haben Sie diesen Code tatsächlich auf einem solchen Drucker ausprobiert? Du wirst jede Lösung testen wollen, oder? –
Die Ergebnisse variieren von Drucker zu Drucker, vermutlich sind die Treiber also fehlerhaft. Ich frage mich, wie es funktionieren soll. –