(erledigt) Herausfinden, welche #include benötigt wird



  • Hallöle allerseits,

    Compilen des Codes

    Graphics g = Graphics.FromImage(myBitmap);
             g.DrawString("MyText", new Font("Tahoma", 40), Brushes.White, new PointF(0, 0));
    

    generiert mir die Fehlermeldung, dass "Graphics" nicht deklariert ist. Den Codefetzen habe ich im Internet gefunden, um der Bitmap, mit der ich meinen Button überklebt habe, den ursprünglichen Text meines Buttons hinzuzufügen (und eventuell mit einer neuen Schriftart, Größe, Farbe etc. zu versehen).

    Da der Kram nicht deklariert ist, fehlt mir (denke ich) die passende #include für Graphics. Wie/Wo kann ich danach vernünftig suchen?
    http://msdn.microsoft.com ist groß, ich habe nichts gefunden, aber vielleicht habe ich einfach an der falschen Stelle gesucht ...



  • Wenn mich nicht alles täuscht, ist die Graphics-Klasse Teil des .net-Frameworks (nicht des WinAPI), und der Codefetzen sieht mir nach C# aus. #include gibt es in C# nicht.



  • Ich glaube nicht, dass Dich alles täuscht, aber hier irrst Du Dich wahrscheinlich. Hier geht es wohl um GDI+



  • Hmmm...ja, das könnte wohl sein. Dann leckt der Code, so wie er da steht, aber Speicher, weil niemand die Heap-Objekte mehr aufräumen kann. Deswegen habe ich das für C# gehalten - so macht das nur in Anwesenheit eines Garbage-Collectors Sinn.

    Den Beispielen in der MSDN-Dokumentation entnehme ich, dass GDI+ mit

    #include <gdiplus.h>
    

    eingebunden werden kann.



  • So, wies da oben steht, kann es eh nicht funktionieren, denke ich ...



  • Ja, Graphics::FromImage liefert einen Zeiger, und die Parameter für DrawString passen nicht. Wird wohl doch C# sein; damit passt das zusammen.



  • Hallo cyberleon,

    Deine Tutorial-Resistenz ist beachtlich. Das führt Dich aber immer wieder ins Nirvana.

    DrawText ist das was Du suchst. 😉
    http://msdn.microsoft.com/en-us/library/dd162498(v=vs.85).aspx

    Warum nimmst Du Dir Martin Richters Tip nicht zu Herzen und lernst erst einmal die Sprache Deiner Wahl und anschließend mit dieser die WinAPI zu benutzen ?!
    99% Deiner Fragen hier hätten sich damit erledigt.

    Ja-ja, ich weiß, aus Fehlern lernt man besser. Aber selbst in einem Tutorium wirst Du genug Fehler machen, also tröste Dich. 😉
    Außerdem wüdest Du damit Deine Kekstüte schonen ... 😃
    http://www.henkessoft.de/ ist schon einmal ein guter Anfang.

    Gruß
    Greenhorn



  • Greenhorn__ schrieb:

    Hallo cyberleon,

    Deine Tutorial-Resistenz ist beachtlich. Das führt Dich aber immer wieder ins Nirvana.

    DrawText ist das was Du suchst. 😉
    http://msdn.microsoft.com/en-us/library/dd162498(v=vs.85).aspx

    Warum nimmst Du Dir Martin Richters Tip nicht zu Herzen und lernst erst einmal die Sprache Deiner Wahl und anschließend mit dieser die WinAPI zu benutzen ?!
    99% Deiner Fragen hier hätten sich damit erledigt.

    Ja-ja, ich weiß, aus Fehlern lernt man besser. Aber selbst in einem Tutorium wirst Du genug Fehler machen, also tröste Dich. 😉
    Außerdem wüdest Du damit Deine Kekstüte schonen ... 😃
    http://www.henkessoft.de/ ist schon einmal ein guter Anfang.

    Gruß
    Greenhorn

    👍 +1

    Es ist C# - .Net Framework X





  • Habe gerade mit DrawText herumprobiert, und des funktioniert echt gut! Mein Problem bei der Suche war, das ich unter "Bitmap" gesucht habe, obwohl ich ja eigentlich nur Text zeichnen wollte - kleiner Denkfehler mit grosser Wirkung zZz

    DrawText(hdc,
    buffer9, 
    -1,
    &rect,
    DT_CENTER | DT_SINGLELINE | DT_VCENTER);
    // in buffer9 wurde mit GetWindowText der Text meines Buttons geladen
    // in rect wurde mit GetClientRect die Größe meines Buttons geladen
    

    Auch funktionieren tut TextOut, ist aber unhandlicher zu bedienen:

    TextOut(hdc,
    (buttonbreite-stringbreite)/2, 
    (buttonhoehe-stringhoehe)/2,
    buffer9,
    sizeof(&buffer9));
    

    Für (buttonbreite-stringbreite)/2 muss man noch ne Funktion zum Aufrunden auf den nächsthöheren Wert einsetzen, falls das Ergebnis im Zähler ungerade ist, denke ich - ich hab´s nicht ausprobiert...

    Vielen Dank @ Greenhorn__, das Tut werde ich morgen mal austesten 🙂 Jetzt muss ich erstmal rausfinden, wie ich den Hintergrund meines soeben gezeichneten Textes durchsichtig mache , so dass er nicht auf weißem Hintergrund steht ^^ (nene, Scherz, ich glaube ich ziehe das Tutorial vor ^^)



  • SetBkMode
    http://msdn.microsoft.com/en-us/library/dd162965%28v=VS.85%29.aspx

    In Deiner WM_PAINT ist auch noch ein grober Schnitzer drin:
    Du erzeugst dort jedesmal einen Speicher-Gerätekontext, löschst diesen aber nie mit DeleteDC, sondern gibst ihn lediglich frei mit ReleaseDC.
    Wenn Du Dein Programm so eine Weile laufen lässt, hast Du bald alle GDI-Objekte des Systems verbraucht. Nicht gut, denn GDI-Objekte sind nicht unbegrenzt vorhanden.

    Für die Performance wäre es auch besser, wenn Du LoadImage und CreateCompatibleDC in die WM_CREATE auslagerst und die Handles global abspeicherst. In der WM_DESTROY löschst Du die beiden dann wieder.

    Gruß
    Greenhorn



  • Okidokili,

    dann werd ich mir des mal aneignen mit DeleteDC - wie gesagt, ist halt mein erster Kontakt mit Bitmaps 🙂

    EDIT:
    Sooo, ich habe hier noch den Code, um zu verhindern das mein Text in einem weißen Viereck ist. Außerdem habe ich mit SetBkMode den Hintergrund transparent gemacht. Darüberhinaus habe ich mal damit experimentiert, mein DrawText als Makro zu verwenden. Wann man besser Makros verwenden muss und wann nicht muss ich mir aber noch anlesen (mein Tutorial ruft 😎 ), bis später!:

    #define FastDT(buffer,rect) DrawText(hdc,buffer,-1,&rect,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
    
    [ ....... ]
    
    SetBkMode (hdc, TRANSPARENT);  // damit der Text nicht in einem weissen Rechteck erscheint
    FastDT(buffer9,rect);      //siehe Makro oben:      DrawText(hdc, buffer9,-1,&rect,DT_CENTER | DT_SINGLELINE | DT_VCENTER);
    

Anmelden zum Antworten