Schriftgröße ändern
-
Hallo erstmal,
ich weiß nicht, ob Ihr es schon wußtet, aber Herr Petzold schreibt häufig nur die Hälfte und teilweise das, was man schon weiß, aber gerade nicht braucht.
Ich suche nach einer Möglichkeit einen mit TextOut geschriebenen Text größer darzustellen, damit er besser in mein als Bitmap geladenes Formular hineinpasst. Petzold schreibt da nur was von dieser Textmetrik-Struktur und einer Funktion "GetTextMetrics" und das die Schriftformate beim Gerätekontext angegeben werden, aber wie ich die Textmetrik ändern kann (z.B. SetTextMetrics oder sowas ...) steht da nicht. Weiß da jemand was dazu? Vielleicht welche Funktion ich mir da ansehen muss?
Wie immer bin ich dankbar für alle Antworten.
Gruß
Oliver
P.S Einen guten Rutsch für Alle ins Jahr 2003
-
Schau mal auf Seite 85, wenn du die 5. Auflage hast :). Wenn nicht, guck dir mal TEXTMETRIC an. Ich schreib schnell noch Beispielcode, muss das vorher aber noch ausprobieren
!
cya
EDIT: Ich war wohl etwas voreilig, da steht wirklich nur was über GetTextMetrics() drin... ich schau mal in der MSDN.
[ Dieser Beitrag wurde am 31.12.2002 um 11:41 Uhr von MagiC Creator editiert. ]
-
Ok, hab was gefunden: Im Petzold auf Seite 925 ist ein riesen Kapitel über Schriftarten. Diese Funktion wirst du wahrscheinlich brauchen, um deine Textgröße zu verändern: CreateFontIndirect (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_4rw4.asp)
cya
-
@MagicCreator,
Danke schaue ich mir direkt mal an. Habe übrigens in der Tat die 5. Auflage.
Gruß
Oliver
-
Man fühlt sich einfach sicherer, wenn der neueste Petzold schön brav neben einenm liegt :D!
cya
-
Hi nochmal,
ich habe mir inzwischen die Funktion mal angesehen und meine, dass diese nicht das ist, was ich suche. Ich habe mich vielleicht auch etwas missverständlich ausgedrückt. Was ich suche, ist eine Funktion, mit der ich die Darstellung einer gegebenen Schrift zum Beispiel von 10 Punkt auf 12 oder 14 Punkt ändern kann. Ich glaube das leistet die Funktion nicht, da hier offensichtlich ein neuer Font kreiert wird, oder??
Gruß
Oliver
-
doch, genau das leistet die Funktion!
Du kannst ja nicht einfach die vorhandene Schrift größen machen, sondern musst immer einen neuen Font in der gewünschten Schriftgröße erstellen.
-
Hallo Zusammen,
also, ich habe mir jetzt nochmal den Herrn Petzold zur Brust genommen und möchte über die LOGFONT-Struktur eine 18 Punkt Schrift erzeugen. Ich hatte das mit folgendem Code probiert, das Programm bricht aber ab mit der Bemerkung ESP-Irgendwas und Parameterübergabe an Funktion oder so würde nicht funktionieren. Vielleicht wird an dem folgenden Code schon sichtbar, was ich falsch gemacht habe. Wenn nicht, könnte dann vielleicht jemand ein kurzes Beispiel geben, wie man die Logfont-Struktur für eine solche Schriftart füllen und übergeben muss, um dann in der GDI mit der neuen Schrift zu schreiben??!!??
Hier jetzt also mein Code:// Dialogprozeduren #include <windows.h> #include <windowsx.h> #include "resource.h" #include "importiert.h" // 9. Automatische Verbuchung ausführen BOOL CALLBACK DlgProc9 (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { // Lokale Variablen deklarieren static char buffer[BUFFERGROESSE]; // Globaler Fehlercode/Returncode int retcode = 0; int retcodeDB = 0; int index = 1; // Position static HBITMAP hBitmap ; static BITMAP bitmap ; static HFONT font; long pos = 0; HDC hdc, hdcMem; HINSTANCE hInstance ; HFONT hfont; static LOGFONT lf; static TEXTMETRIC tm; PAINTSTRUCT ps; DWORD lastError; char str[256]; switch(message) { case WM_PAINT: hdc = BeginPaint(hDlg, &ps); // Auswahl der erstellten Schrift retcode = SelectObject(hfont, sizeof(HFONT), &font); hdcMem = CreateCompatibleDC(hdc); SelectObject(hdcMem,hBitmap); BitBlt (hdc, 10, 10, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY) ; // Hier nun den Text eintragen wsprintf(str, tabDatensaetze[index].empfaenger); TextOut(hdc,90,150,str,lstrlen(str)); // usw usw. DeleteDC(hdcMem); EndPaint(hDlg, &ps); return TRUE; case WM_SIZE: return 0; case WM_INITDIALOG: hInstance = GetModuleHandle(0); hBitmap = (HBITMAP) LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP1)); if(!hBitmap) { lastError = GetLastError(); wsprintf(str, "Fehler beim Bitmapladen.\nFehler-Code: %d", lastError); MessageBox(hDlg, str, "Fehler", MB_ICONERROR); } GetObject(hBitmap, sizeof(BITMAP), &bitmap); // Neuen Font erstellen lf.lfHeight = 18; hfont = (HFONT) CreateFontIndirect(&lf); if (hfont == 0) { lastError = GetLastError(); wsprintf(str, "Fehler beim Erstellen eines neuen Fonts.\nFehler-Code: %d", lastError); MessageBox(hDlg, str, "Fehler", MB_ICONERROR); } GetObject(hfont, sizeof(HFONT), &font); // Datenbank oeffnen retcodeDB = connectDB(); pos = FillDatensatz(hDlg); return TRUE; case WM_COMMAND: { switch (LOWORD(wParam)) // OK / Abbrechen { // Zum Anfang case IDC_BUTTON1: { index = 0; return TRUE; } // Zurück case IDC_BUTTON10: { index--; if (index < 1) index = 1; // Update des Dialoges SendMessage(hDlg,WM_INITDIALOG,wParam,lParam); return TRUE; } // vor case IDC_BUTTON9: { index++; if (index > pos) index = pos; // Update des Dialoges SendMessage(hDlg,WM_INITDIALOG,wParam,lParam); return TRUE; } // Zum Ende case IDC_BUTTON11: { index--; return TRUE; } // OK case IDOK: { retcodeDB = disconnectDB(); if(retcodeDB != 0) MessageBox(hDlg, "Schließen der Datenbank hat nicht geklappt!", "Datenbankzugriff", 0); EndDialog(hDlg,0); return TRUE; } // Cancel case IDCANCEL: { retcodeDB = disconnectDB(); if(retcodeDB != 0) MessageBox(hDlg, "Schließen der Datenbank hat nicht geklappt!", "Datenbankzugriff", 0); EndDialog(hDlg,0); return TRUE; } } // Switch LOWORD } // Switch Message } return FALSE; }
Gruß
Oliver, der für den der Anfang schwer ist
-
Ich bin mir nicht sicher, aber ich glaub du musst bei der LOGFONT-Struktur mehr Elemente füllen, nicht nur lfHeight.
cya
EDIT: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_1wmq.asp
Du musst glaub ich noch lfFaceName füllen.
[ Dieser Beitrag wurde am 02.01.2003 um 12:22 Uhr von MagiC Creator editiert. ]
-
Du solltest entwender alle Elemente füllen oder die Struktur vorher nullen, also z.B. ZeroMemory, memset oder = {0} verwenden!
-
ich hatte gelesen das, wenn man die Struktur LOGFONT als static definiert, dass dann alles Null ist. Ist das nicht so?
Gruß
Oliver
-
Hi,
Eine alte Programmiererweisheit: Kaum macht man es richtig, schon funktionierts. :p
Also hier nochmal der funktierende Code für das Erstellen einer anderen Schriftgröße bei derselben Schriftart. Vielleicht hat ja nochmal einer ähnliche Probleme.
// Dialogprozeduren #include <windows.h> #include <windowsx.h> #include "resource.h" #include "importiert.h" // 9. Automatische Verbuchung ausführen BOOL CALLBACK DlgProc9 (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { // Lokale Variablen deklarieren static char buffer[BUFFERGROESSE]; // Globaler Fehlercode/Returncode int retcode = 0; int retcodeDB = 0; int index = 1; // Position static HBITMAP hBitmap ; static BITMAP bitmap ; static HFONT font; long pos = 0; HDC hdc, hdcMem; HINSTANCE hInstance ; HFONT hfont; static LOGFONT lf = {0}; static TEXTMETRIC tm; PAINTSTRUCT ps; DWORD lastError; char str[256]; LONG yLogPixelsPerInch; switch(message) { case WM_PAINT: hdc = BeginPaint(hDlg, &ps); // Neuen Font erstellen yLogPixelsPerInch = GetDeviceCaps(hdc, LOGPIXELSY); lf.lfHeight = -MulDiv(14,yLogPixelsPerInch, 72); lf.lfWidth = 0; hfont = (HFONT) CreateFontIndirect(&lf); if (hfont == 0) { lastError = GetLastError(); wsprintf(str, "Fehler beim Erstellen eines neuen Fonts.\nFehler-Code: %d", lastError); MessageBox(hDlg, str, "Fehler", MB_ICONERROR); } GetObject(hfont, sizeof(HFONT), &font); // Auswahl der erstellten Schrift retcode = SelectObject(hdc,hfont); hdcMem = CreateCompatibleDC(hdc); SelectObject(hdcMem,hBitmap); BitBlt (hdc, 10, 10, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY) ; // Hier nun den Text eintragen wsprintf(str, "Commerzbank Aachen"); TextOut(hdc, 60,70,str,lstrlen(str)); DeleteDC(hdcMem); EndPaint(hDlg, &ps); return TRUE; case WM_SIZE: return 0; case WM_INITDIALOG: hInstance = GetModuleHandle(0); hBitmap = (HBITMAP) LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP1)); if(!hBitmap) { lastError = GetLastError(); wsprintf(str, "Fehler beim Bitmapladen.\nFehler-Code: %d", lastError); MessageBox(hDlg, str, "Fehler", MB_ICONERROR); } GetObject(hBitmap, sizeof(BITMAP), &bitmap); // Datenbank oeffnen retcodeDB = connectDB(); pos = FillDatensatz(hDlg); return TRUE; case WM_COMMAND: { switch (LOWORD(wParam)) // OK / Abbrechen { // Zum Anfang case IDC_BUTTON1: { index = 0; return TRUE; } // Zurück case IDC_BUTTON10: { index--; if (index < 1) index = 1; // Update des Dialoges SendMessage(hDlg,WM_INITDIALOG,wParam,lParam); return TRUE; } // vor case IDC_BUTTON9: { index++; if (index > pos) index = pos; // Update des Dialoges SendMessage(hDlg,WM_INITDIALOG,wParam,lParam); return TRUE; } // Zum Ende case IDC_BUTTON11: { index--; return TRUE; } // OK case IDOK: { retcodeDB = disconnectDB(); if(retcodeDB != 0) MessageBox(hDlg, "Schließen der Datenbank hat nicht geklappt!", "Datenbankzugriff", 0); EndDialog(hDlg,0); return TRUE; } // Cancel case IDCANCEL: { retcodeDB = disconnectDB(); if(retcodeDB != 0) MessageBox(hDlg, "Schließen der Datenbank hat nicht geklappt!", "Datenbankzugriff", 0); EndDialog(hDlg,0); return TRUE; } } // Switch LOWORD } // Switch Message } return FALSE; }
-
Eine alte Programmiererweisheit: Auch wenn es funktioniert, muss noch nicht alles richtig sein.
- in WM_PAINT möglichst nur zeichnen (also die Schrift schon vorher erstellen, nicht bei jeder WM_PAINT Nachricht)
- (fast) alles, was erstellt wird muss wieder gelöscht werden (DeleteObject für Brushs, Pens, Fonts, usw.)
- beim Aufruf von GetObject ist der letzte Parameter falsch, außerdem hast du den Sinn der Funktion nicht verstanden (den Aufruf kannst du dir sparen)
- DCs immer so hinterlassen, wie man sie vorgefunden hat (altes FONT Handle speichern und am Ende wieder hineinselectieren)
-
Noch ne Weisheit:
Es ist noch kein Meister vom Himmel gefallen, aber trotzdem Danke für die Hinweise!
Gruß
Oliver
-
Ich verstehe auch nicht genau, was du da machst.
Wenn du ein Font (HFONT) erstellen willst, der genauso ist wie ein anderer, bloß mit ner anderen Schriftgröße, dann benutzt du GetObject(), um dir die Daten des Fonts zu holen. Heraus kommt ein LOGFONT - kein HFONT, wie in deinem (ehrlich gesagt) schrecklichen Code. In dieser LOGFONT-Struktur änderst du die entsprechenden Werte und benutzt CreateFontIndirect(), um das neue Font zu erstellen.
-
danke für den Hinweis. Es geht also auch einfacher. Ich werde das mal ausprobieren.
Aber: Mein - ehrlich gesagt - schrecklicher Code. Was findest Du denn daran so schrecklich?Daniel hat ja schon einige Anregungen gegeben, vielleicht fällt Dir ja auch noch ein bisschen ein, um Deine Kritik etwas konstruktiver zu gestalten?
Gruß
Oliver
-
Jo, erstens: siehe Daniels Anmerkungen, zweitens: Nicht nachvollziehbare Einrückungen im Code; drittens: viel zu viel Code für das eine Thema. Die relevanten Stellen hätten genügt.
-
ach so, Du meintest weniger meine Programmiererkünste als mehr, dass ich die Sache etwas überladen im Forum gepostet habe. Bin ich ja beruhigt.
-
Naja, die Punkte 1 und 2 sind nicht zu vernachlässigen.