Fragen zu CreateFontIndirect und TextOut



  • Nein, das ist schon richtig so. Da stand vorher etwas Anderes. Nach dem Reinstellen hab ich die Zahl einfach nicht mehr angepasst ^^

    Hat vielleicht irgendjemand eine Idee, wie ich meine beiden Probleme lösen kann?



  • Solche Flüchtigkeitsfehler rächen sich meist ...

    Zu deinem Problem: Wie sehen denn deine Aufrufe für TextOut() und CreateFontIndirect() aus? In deinem Code-Abschnitt sind sie nicht zu finden.



  • schmidt-webdesign.net schrieb:

    Solche Flüchtigkeitsfehler rächen sich meist ...

    Ich sage es dir noch mal: Das war kein Flüchtigkeitsfehler. Ich habe dort lediglich meinen Namen durch meinen Usernamen ersetzt, als ich den Codeabschnitt hier reingestellt habe. Mein richtiger Name geht schließlich niemanden etwas an 😉

    schmidt-webdesign.net schrieb:

    Zu deinem Problem: Wie sehen denn deine Aufrufe für TextOut() und CreateFontIndirect() aus? In deinem Code-Abschnitt sind sie nicht zu finden.

    Gut, wenn es nicht stört, poste ich halt den ganzen Quellcode:

    #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;
    
    //--------------------------------------------------------------------------- 
    
    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);
                            SetBkMode (hdc, TRANSPARENT);                         
                            SetTextColor (hdc, RGB(0, 0, 0));                     
                            TextOut (hdc,
                            10,                                                   
                            445,                                                  
                            "Copyright by Itachi",
                            19);
    
                            TextOut (hdc,
                            30,                                                   
                            445,                                                  
                            "Zweiter Aufruf von TextOut (anscheinend falsch)",
                            46);                        
                            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); 
    }
    

    Bei CreateFontIndirect(); verstehe ich erst gar nicht, wie ich es anzuwenden habe. Alle verweisen immer bloß auf die Funktion bzw. zur MSDN. Doch die MSDN ist für mich leider so nichtssagend wie ein Buch mit sieben Siegeln. Wäre also klasse, wenn du mir das kurz erläutern könntest.

    MfG



  • 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