Frage

(Unmanaged C ++) Ich habe es bereits gelungen, PNG -Dateien in ein transparentes Schichtfenster zu zeichnen, das ich durch den Desktop ziehen kann

Hier ist mein Code und mein Versuch, Text in der Mitte zu zeichnen. Es ist wichtig zu beachten

Bearbeiten] Aktualisierter Code nach den Kommentaren, jetzt versuche ich nur, Text in die Bitmap zu schreiben, bevor ich die HBitmap -Version erhalte, die ich dieses Mal verwenden muss. Wirklich, GDI+ lol funktioniert immer noch nicht, frage mich, was ich falsch mache

void Draw() // draws a frame on the layered window AND moves it based on x and y
{
    HDC screenDC( NULL ); // grab screen
    HDC sourceDC( CreateCompatibleDC(screenDC) );

    POINT pos = {x,y}; // drawing location
    POINT sourcePos = {0,0}; // top left of image
    SIZE size = {100,100}; // 100x100 image

    BLENDFUNCTION blendFunction = {0};
    HBITMAP bufferBitmap = {0};
    Bitmap* TheBitmap = crnimage; // crnimage was already loaded earlier

    // ------------important part goes here, my attempt at drawing text ------------//

 Gdiplus::Graphics     Gx(TheBitmap);

// Font* myFont =    new Font(sourceDC);
 Font myFont(L"Arial", 16);


 RectF therect;
 therect.Height = 20;
 therect.Width = 180;
 therect.X = 0;
 therect.Y = 0;

 StringFormat format;
 format.SetAlignment(StringAlignmentCenter);
 format.GenericDefault();
 Gdiplus::SolidBrush   GxTextBrush(Gdiplus::Color(255, 255, 0,255));


 WCHAR thetext[] = L"Sample Text";

 int stats = Gx.DrawString(thetext, -1, &myFont, therect, &format, &GxTextBrush);
 if(stats) // DrawString returns nonzero if there is an error
     msgbox(stats); 
 stats = Gx.DrawRectangle(&Pen(Color::Red, 3), therect);
 // the rectangle and text both draw fine now

 // ------------important part goes here, my attempt at drawing text ------------//

    TheBitmap->GetHBITMAP(0, &bufferBitmap);
    HBITMAP oldBmpSelInDC;
    oldBmpSelInDC = (HBITMAP)SelectObject(sourceDC, bufferBitmap);

    // some alpha blending
    blendFunction.BlendOp = AC_SRC_OVER;
    blendFunction.SourceConstantAlpha = wndalpha;
    blendFunction.AlphaFormat = AC_SRC_ALPHA;
    COLORREF colorKey( RGB(255,0,255) );
    DWORD flags( ULW_ALPHA);

    UpdateLayeredWindow(hWnd, screenDC, &pos, & size, sourceDC, &sourcePos,
    colorKey, &blendFunction, flags);

    // release buffered image from memory
    SelectObject(sourceDC, oldBmpSelInDC);
    DeleteDC(sourceDC);
    DeleteObject(bufferBitmap); 

    // finally release the screen
    ReleaseDC(0, screenDC);
}

Ich habe seit zwei Tagen versucht, Text auf mein geschichteter Fenster zu schreiben, aber aus diesen Versuchen weiß ich, dass es mehrere Möglichkeiten gibt, wie ich dies machen kann (leider habe ich keine Ahnung, wie genau)

Die übliche Option, die ich sehe, ist das Zeichnen von Text auf eine Bitmap und das Rendern der Bitmap selbst

  1. Verwenden Sie GDI+, um eine Bitmap zu laden
  2. Erstellen Sie ein Grafikobjekt aus der Bitmap
  3. Verwenden Sie Draw String, um Text in die Bitmap zu schreiben
  4. Das Grafikobjekt entsorgen
  5. Verwenden Sie die Bitmap -Speichermethode, um das Ergebnis in einer Datei zu speichern

Anscheinend kann man auch ein Grafikobjekt aus einem DC erstellen und dann Text auf den DC zeichnen, aber ich habe wieder keine Ahnung, wie es geht

War es hilfreich?

Lösung

Der Gesamtansatz sieht richtig aus, aber ich denke, Sie haben einige Probleme mit dem DrawString Anruf. Schauen Sie sich die Dokumentation (insbesondere die Probe) an Msdn.

Gx.DrawString(thetext, 4, NULL, therect, NULL,  NULL)

Die dritten, fünften und sechsten Parameter (Schriftart, Format und Pinsel) müssen wahrscheinlich angegeben werden. Die Dokumentation besagt nicht, dass sie optional sind. Vorbeigehen NULL Denn diese verursachen wahrscheinlich GDI+, um den Anruf als No-op zu behandeln.

Der zweite Parameter sollte nicht den terminierenden l ' 0' in die Zeichenfolge enthalten. Es ist wahrscheinlich am sichersten, -1 zu verwenden, wenn Ihre Zeichenfolge immer beendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top