Question

(C ++ non géré) Je l'ai déjà réussi dessin fichiers PNG à une fenêtre transparente en couches que je peux faire glisser autour du bureau, mais maintenant mon problème est le dessin du texte sur une fenêtre transparente en couches

Voici mon code et ma tentative de texte dessin au milieu, il est important de noter que j'utilise le screenDC au lieu d'utiliser l'un des messages WM_PAINT

[modifier] code mis à jour après les commentaires, maintenant je suis juste essayer de texte d'écriture sur le bitmap avant d'obtenir la version HBITMAP que je dois utiliser cette fois, je suis en utilisant DrawString parce TextOut () n'est pas GDI +, je l'espère, est vraiment DrawString GDI + lol ne fonctionne toujours pas cependant, demande ce que je fais mal

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);
}

J'ai essayé d'écrire du texte sur ma fenêtre en couches pendant deux jours maintenant, mais de ces tentatives, je sais qu'il ya plusieurs façons je peux s'y prendre (Malheureusement, je ne sais pas comment exactement)

L'option habituelle que je vois est l'affichage de texte sur un bitmap, ce qui rend alors le bitmap lui-même

  1. Utiliser GDI + pour charger une image bitmap
  2. Créer un objet graphique à partir du bitmap
  3. Utilisez DrawString au texte d'écriture sur le bitmap
  4. Eliminer l'objet Graphics
  5. Utilisez le bitmap Enregistrer méthode pour enregistrer le résultat dans un fichier

Apparemment, on peut aussi faire un objet graphique à partir d'un DC, puis dessiner le texte sur le DC, mais encore une fois je n'ai pas la moindre idée quant à la façon de le faire

Était-ce utile?

La solution

L'approche globale semble bon, mais je pense que vous avez des problèmes avec l'appel DrawString. Consultez la documentation (en particulier l'échantillon) sur MSDN .

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

Le troisième, cinquième et sixième paramètres (police, le format et brosse) ont probablement besoin d'être spécifié. La documentation ne dit pas qu'ils sont facultatifs. En passant NULL pour ces derniers est probablement à l'origine GDI + pour traiter l'appel comme no-op.

Le second paramètre ne doit pas inclure le L « \ 0 » dans la chaîne. Il est probablement plus sûr d'utiliser -1 si votre chaîne est toujours terminée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top