Schriftgröße ändern
-
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.