C ++ GDI+透明な階層化されたウィンドウにテキストを描く
質問
(管理されていないC ++)私はすでにデスクトップの周りにドラッグできる透明なレイヤードウィンドウにPNGファイルを描画することに成功しましたが、私の問題は透明な層状ウィンドウにテキストを描画することです
これが私のコードと真ん中にテキストを描画しようとする試みです。WM_Paintメッセージで使用する代わりにScreendCを使用していることに注意することが重要です
編集]コメントの更新コメントの後、今はhbitmapバージョンを取得する前にビットマップにテキストを書き込もうとしています。テキストアウト()がgdi+ではないため、drawstringを使用する必要があります。本当にgdi+ lolはまだうまくいきません、私が何をしているのだろうと思います
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);
}
私は2日間レイヤードウィンドウにテキストを書き込もうとしていましたが、これらの試みから、これを行うことができるいくつかの方法があることを知っています(残念ながら、私は正確にはわかりません)
私が見る通常のオプションは、ビットマップにテキストを描画し、ビットマップ自体をレンダリングすることです
- GDI+を使用してビットマップをロードします
- ビットマップからグラフィックオブジェクトを作成します
- DrawStringを使用して、ビットマップにテキストを書き込みます
- グラフィックオブジェクトを処分します
- ビットマップ保存メソッドを使用して結果をファイルに保存します
どうやらDCからグラフィックオブジェクトを作成してから、DCにテキストを描画することもできますが、これを行う方法についての手がかりがありません
解決
全体的なアプローチは正しいように見えますが、あなたはいくつかの問題を抱えていると思います DrawString
電話。でドキュメント(特にサンプル)をチェックしてください MSDN.
Gx.DrawString(thetext, 4, NULL, therect, NULL, NULL)
3番目、5番目、および6番目のパラメーター(フォント、フォーマット、およびブラシ)を指定する必要があります。ドキュメントでは、それらがオプションであるとは言いません。通過 NULL
なぜなら、これらはおそらくGDI+がコールをNO-OPとして扱うようになっているからです。
2番目のパラメーターには、文字列に終端l ' 0'を含めるべきではありません。文字列が常に終了した場合、-1を使用するのはおそらく最も安全です。