C ++ texte dessin GDI + sur une fenêtre transparente en couches
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
- Utiliser GDI + pour charger une image bitmap
- Créer un objet graphique à partir du bitmap
- Utilisez DrawString au texte d'écriture sur le bitmap
- Eliminer l'objet Graphics
- 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
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.