Schriftgröße ändern



  • Du solltest entwender alle Elemente füllen oder die Struktur vorher nullen, also z.B. ZeroMemory, memset oder = {0} verwenden!



  • @Flenders,

    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. 😉

    1. in WM_PAINT möglichst nur zeichnen (also die Schrift schon vorher erstellen, nicht bei jeder WM_PAINT Nachricht)
    2. (fast) alles, was erstellt wird muss wieder gelöscht werden (DeleteObject für Brushs, Pens, Fonts, usw.)
    3. 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)
    4. DCs immer so hinterlassen, wie man sie vorgefunden hat (altes FONT Handle speichern und am Ende wieder hineinselectieren)


  • @Daniel,

    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.



  • @WebFritzi,

    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.



  • @WebFritzi,

    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.


Anmelden zum Antworten