2012-09-18 25 views
6

WinAPIを使用して透明な色でテキストを描画する方法は? 通常の方法で私はSetBkMode(hDC、TRANSPARENT)を使いましたが、今はダブルバッファを使う必要があります。 このようにして、画像は正しく描画されますが、テキストは正しく描画されません(背景は黒です)。透明な背景を持つテキストをC++/WinAPIを使用して描画する方法は?

case WM_PAINT: 
{ 
    hDC = BeginPaint(hWnd, &paintStruct); 
    SetBkMode(hDC, TRANSPARENT); 

    HDC cDC = CreateCompatibleDC(hDC); 
    HBITMAP hBmp = CreateCompatibleBitmap(hDC, width, height); 
    HANDLE hOld = SelectObject(cDC, hBmp); 

    HFONT hFont = (HFONT)SelectObject(hDC, font); 
    SetTextColor(cDC, color); 
    SetBkMode(cDC, TRANSPARENT); 

    TextOut(cDC, 0, 0, text, wcslen(text)); 

    SelectObject(cDC, hFont); 

    BitBlt(hDC, 0, 0, width, height, cDC, 0, 0, SRCCOPY); 

    SelectObject(cDC, hOld); 
    DeleteObject(hBmp); 
    DeleteDC(cDC); 

    EndPaint(hWnd, &paintStruct); 
    return 0; 
} 

答えて

2

ビットマップを作成すると、色は指定されません。ドキュメンテーションは初期化の仕方を述べていませんが、黒く塗りつぶしている(すべて0)ようです。ビットマップにテキストを描画するので、ビットマップの背景は黒のままです。その後、ビットマップ全体をDCにコピーし、すべてのピクセルが背景に沿ってテキストとともに表示されます。

この問題を解決するには、テキストを描画する前に、ビットマップに目的の背景をコピーする必要があります。

+0

この方法で動作します。いくつかの黒い背景の領域が、私はそれらを修正することができますと思います。ありがとう! – Alexander

8

SetBkMode(dc, TRANSPARENT)は正常に動作するはずです。バックバッファに描画するときは、正しいDCハンドルを使用していることを確認してください。

+0

私はBeginBaint(...)と互換性があり、CreateCompatibleDC(...)が取得するDC、ネイティブの両方にこの関数を使用しました... – Alexander

+0

同じDCあなたにテキストを描画しています。どのテキスト描画APIを呼びますか?どの種類のDCとビットマップを描画していますか? – tenfour

+0

私は何をしますか:互換性のあるdcを作成し、互換性のあるビットマップを作成し、オブジェクトを選択し、setbkmodeを描画します(互換性のあるdcを使用)、bitblt、オブジェクトを選択し、オブジェクトを削除し、DCを削除します。画像は正しく描画されますが、黒い背景のテキストが描画されます( – Alexander

関連する問題