Fragen zu CreateFontIndirect und TextOut



  • Itachi schrieb:

    Und wie bereits oben beschrieben funktioniert das mehrmalige Verwenden von TextOut auch nicht.

    Die Parameter nXStart und nYStart von TextOut () sind gewissermassen in "Pixel" (Bildschirmkoordinaten).
    Der zweite Aufruf von TextOut () setzt seinen Text nur 20 Pixel rechts vom ersten Aufruf hin.
    Dadurch liegen sie fast übereinander und sehen deshalb verschmiert aus.

    Meinst Du das ?



  • CreateFont() und CreateFontIndirect() legen "logische" Schriften an (sie "erzeugen" also keine neuen, wie ihr Name vermuten lässt). Schriftart, -größe, usw. werden bei CreateFont() durch 14 (!) Parameter festgelegt, CreateFontIndirect() erwartet die Adresse einer LOGFONT-Struktur, die ebenfalls 14 Felder hat. Zur ausführlichen Beschreibung dieser Felder ist die MSDN hilfreich.

    Und so könnte CreateFontIndirect() in der Praxis aussehen:

    LOGFONT LFArial = { 
    16, 0, 0, 0, 400, FALSE, FALSE, FALSE, ANSI_CHARSET, 
    OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 
    VARIABLE_PITCH, "Arial"}, 
    HFONT hFont; 
    
    ... 
    
    WM_PAINT: 
         hdc = BeginPaint (hwnd, &ps); 
         lpLFArial.lfHeight = 22; 
         lpLFArial.lfWeight = FW_BOLD; 
         hFont = SelectObject (hDC, CreateFontIndirect (&lpLFArial)); 
         TextOut (hDC, 4, [b]10[/b], "FontTest", 8); 
         TextOut (hDC, 4, [b]40[/b], "2. Zeile", 8); 
         DeleteObject (SelectObject (hDC, hFont)); 
         EndPaint (hwnd, &ps); 
         return 0;
    

    Beachte auch den 3. Parameter in TextOut() 😃



  • Hallo,

    vielen Dank an euch für die Hilfe ^^

    Leider spuckt mir der Compiler einen Fehler aus. So habe ich das (wohl falsch) gemacht:

    #include <windows.h>
    //---------------------------------------------------------------------------
    #define ID_BUTTON    1
    #define ID_BUTTON2   2
    #define ID_BUTTON3   3
    //---------------------------------------------------------------------------
    
    LPCTSTR    g_lpszAppTitle = TEXT("Blubb");
    LPCTSTR    g_lpszAppClass = TEXT("WindowClass");
    HINSTANCE  g_hInstance; 
    HWND       g_hAppWindow, g_hButton, g_hButton2, g_hButton3;
    //---------------------------------------------------------------------------
    LOGFONT LFArial           = {
                              16, 0, 0, 0, 400, FALSE, FALSE, FALSE, ANSI_CHARSET,
                              OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
                              VARIABLE_PITCH, "Arial"};
    HFONT hFont;
    //--------------------------------------------------------------------------- 
    
    VOID              RegisterAppWindow(); 
    VOID              Create_GUI_Interface(HWND hwndParent); 
    LRESULT CALLBACK  AppWndProc(HWND, UINT, WPARAM, LPARAM); 
    VOID              ShowMessage(LPCTSTR); 
    //---------------------------------------------------------------------------
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int) 
    { 
       MSG  msg;
    
       g_hInstance = hInstance; 
    
       RegisterAppWindow(); 
    
       // Hauptfenster erzeugen.
       g_hAppWindow = CreateWindow(g_lpszAppClass,                                 
                                   g_lpszAppTitle,                                 
                                   WS_VISIBLE,
                                   100, 100, 425, 500,                             
                                   NULL,                                           
                                   NULL,                                           
                                   g_hInstance,                                    
                                   NULL);                                         
    
       // Das erzeugt eine Trennlinie im Fenster.                            
       g_hAppWindow = CreateWindowEx(WS_EX_STATICEDGE,
                      "STATIC", "",
                      WS_CHILD | WS_VISIBLE,
                      35,                                                          
                      410,                                                         
                      350,                                                        
                      2,                                                          
                      g_hAppWindow,
                      NULL,
                      hInstance,
                      NULL);
    
    //---------------------------------------------------------------------------
    
       while( GetMessage(&msg, NULL, 0, 0) ) 
       { 
          TranslateMessage(&msg);                                                 
          DispatchMessage(&msg);                                                  
       } 
    
       return msg.wParam ; 
    } 
    //--------------------------------------------------------------------------- 
    
    VOID RegisterAppWindow() 
    { 
       WNDCLASSEX wndclass; 
       wndclass.cbSize        = sizeof(WNDCLASSEX); 
       wndclass.style         = CS_NOCLOSE;                                       
       wndclass.lpfnWndProc   = AppWndProc;                                       
       wndclass.cbClsExtra    = 0; 
       wndclass.cbWndExtra    = 0; 
       wndclass.hInstance     = g_hInstance;                                      
       wndclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);                  
       wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);                      
       wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);                      
       wndclass.lpszMenuName  = NULL;                                             
       wndclass.lpszClassName = g_lpszAppClass;
       wndclass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);                   
    
       RegisterClassEx(&wndclass); 
    } 
    //--------------------------------------------------------------------------- 
    
    VOID Create_GUI_Interface(HWND hwndParent) 
    {
       // Erster Button 
       g_hButton = CreateWindow(TEXT("BUTTON"),                                    
                                TEXT("Beenden"),                                   
                                WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,         
                                90, 360, 75, 23,                                   
                                hwndParent,                                        
                                (HMENU)ID_BUTTON,                                 
                                g_hInstance,                                      
                                NULL); 
    
       SendMessage(g_hButton, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));
    
    //-----------------------------------------------------------------------
    
       // Zweiter Button
       g_hButton2 = CreateWindow(TEXT("BUTTON"),                                  
                                TEXT("Infos"),                                    
                                WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,         
                                310, 430, 75, 23,                                 
                                hwndParent,                                       
                                (HMENU)ID_BUTTON2,                                
                                g_hInstance,                                      
                                NULL); 
    
       SendMessage(g_hButton2, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));
    
    //-----------------------------------------------------------------------
    
       // Dritter Button
       g_hButton3 = CreateWindow(TEXT("BUTTON"),                                  
                                TEXT("Minimieren"),                                
                                WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,         
                                260, 360, 75, 23,                                 
                                hwndParent,                                        
                                (HMENU)ID_BUTTON3,                                 
                                g_hInstance,                                      
                                NULL); 
    
       SendMessage(g_hButton3, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));
    } 
    //---------------------------------------------------------------------------
    
    LRESULT CALLBACK AppWndProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) 
    {
    
       HDC hdc;
       PAINTSTRUCT ps;
    
       switch(uiMsg) 
       { 
          case WM_CREATE:
             Create_GUI_Interface(hwnd);
    
             // Erzeugt im Fenster ein Editfeld.
             g_hAppWindow = CreateWindowEx(WS_EX_CLIENTEDGE,
                      "EDIT",
                      "Hier ist Platz für gaaaaanz viel Text...",
                      WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,
                      10,                                                        
                      10,                                                          
                      400,                                                        
                      300,                                                        
                      hwnd,
                      NULL,
                      g_hInstance,
                      NULL);
             return 0;
    
          case WM_PAINT:
             hdc = BeginPaint (hwnd, &ps); 
                   lpLFArial.lfHeight = 22; 
                   lpLFArial.lfWeight = FW_BOLD; 
                   hFont = SelectObject (hdc, CreateFontIndirect (&lpLFArial)); 
                   TextOut (hdc, 4, 10, "FontTest", 8); 
                   TextOut (hdc, 4, 40, "2. Zeile", 8); 
                   DeleteObject (SelectObject (hdc, hFont)); 
                   EndPaint (hwnd, &ps); 
         return 0;
    
          case WM_COMMAND: 
             switch( LOWORD(wParam) ) 
             {
                case ID_BUTTON:
                   if( HIWORD(wParam) == BN_CLICKED )
                   {
                      int Confirm = MessageBox (NULL, "Programm wirklich beenden?", "Blubb", MB_YESNO | MB_ICONEXCLAMATION);
                      {
                          if (IDYES == Confirm)
                          {
                                    SendMessage(hwnd, WM_CLOSE, 0, 0);
                          }
                      } 
                   } 
                   break;
    
                case ID_BUTTON2:
                   if( HIWORD(wParam) == BN_CLICKED )
                   { 
                      ShowMessage("Blubber");
                   } 
                   break;
    
                case ID_BUTTON3:
                   if( HIWORD(wParam) == BN_CLICKED )
                   { 
                      ShowWindow(hwnd, SW_MINIMIZE);
                   } 
                   break;
             } 
             return 0;
    
          case WM_DESTROY: 
             PostQuitMessage(0);
             return 0; 
       } 
    
       return DefWindowProc(hwnd, uiMsg, wParam, lParam); 
    } 
    //--------------------------------------------------------------------------- 
    
    VOID ShowMessage(LPCTSTR str) 
    { 
       MessageBox(g_hAppWindow, str, g_lpszAppTitle,  MB_OK); 
    }
    

    Mein Compiler (Dev-C++ 4.9.9.2) sagt: "lpLFArial undeclared (first use this function)" 😞

    Ich weiß zwar, was er mir sagen will, da ich ja des Englischen mächtig bin, jedoch weiß ich nicht, wo ich lpLFArial deklarieren muss.



  • ersetz das mal zu LFArial, so wie du das auch declared hast, durch C&P kopiert man auch so kleine Fehler mit, welche aber auch wieder sofort auffallen sollten.



  • Itachi schrieb:

    ...jedoch weiß ich nicht, wo ich lpLFArial deklarieren muss.

    Nirgendwo. Der Bezeichner für die Font heisst "LFArial" und nicht "lpLFArial".
    Und probier mal als 3. Parameter für TextOut () statt 10 und 30 lieber 410 und 430. Sonst liegt der Text im Edit-Feld.
    🙂

    /edit : zitat reingesetzt



  • @ orr lol:
    Ich gehöre nicht zu denen, die Copy & Paste verwenden. Ich schreibe alle Codezeilen selbst.

    @ merker:
    Das Editfeld habe ich natürlich vorher entsprechend angepasst, das passt 😉

    Nachdem ich jedoch die Parameter angepasst habe, bekomme ich folgende Fehlermeldung: "invalid conversion from `void' to `HFONT__'" 😞



  • Poste mal die Codezeile, die diese Fehlermeldung verursacht hat. Die folgende dürfte keine Probleme machen :

    ...
     hFont = SelectObject (hdc, CreateFontIndirect (&LFArial));
    ...
    

    🙂



  • Hallo,

    es war diese Zeile:

    hFont = SelectObject (hdc, CreateFontIndirect (&LFArial));
    

    Die, die du mir gerade gegeben hast. Jetzt steige ich da gar nicht mehr durch. Wo steckt nur der Wurm? 😞



  • Casten Freunde, casten casten casten

    SelectObject gibt ein Objekt zurück und dieses kann vieles sein, HBRUSH, HFONT etc.

    Daher

    hFont = (HFONT)SelectObject (hdc, CreateFontIndirect (&LFArial));
    


  • Itachi schrieb:

    Wo steckt nur der Wurm?

    Im Dev-C++ 4.9.9.2. Probier mal den Cast von orr lol (HFONT).
    🙂



  • Ich danke euch, jetzt funzt alles und ich habe einen wirklich schicken Texteditor vor mir 😃

    Gruß


Anmelden zum Antworten