紹介と関連情報:
最近、ここSOで、ビットマップを適切にスケーリングして画像の品質を維持できるようにすることについて質問しました。
ボタンの背景で拡大/縮小すると、ビットマップの品質が低下します。
コメントでの提案を採用して、`StretchBlt を使用しようとしたので、小さなデモ プログラムを作成しました。
ストレッチ モードを に設定した後、ビットマップのシャープネスが改善されましたBLACKONWHITE
。
ビットマップの一部を、たとえば黒などの特定の色で透明にしたいと思います。
以前に TransparentBlt を使用したことがありますが、現在はその方法がわかりません。
問題:
画像のシャープネスを維持するためStretchBlt
に、メモリ DC でストレッチ モードを使用する必要がありますBLACKONWHITE
。
Blt
問題は、メイン ウィンドウの DC に透過的にアクセスする方法がわからないことです。
デモ アプリのコード スニペットを次に示します。
case WM_PAINT:
{
// main window's DC
hdc = BeginPaint(hWnd, &ps);
// main window's client rectangle
RECT r;
GetClientRect( hWnd, &r );
// memory DC for double buffering
HDC MemDC = CreateCompatibleDC( hdc );
// fill it with test brush
FillRect( MemDC, &r, (HBRUSH)GetStockObject( GRAY_BRUSH ) );
// select loaded bitmap into memory DC
HBITMAP old = (HBITMAP)SelectObject( MemDC, bmp );
// get bitmaps dimensions
BITMAP b;
GetObject( bmp, sizeof(BITMAP), &b );
// needed to preserve bitmap's sharpness
SetStretchBltMode( hdc, BLACKONWHITE );
StretchBlt( hdc, 0, 0, r.right - r.left, r.bottom - r.top,
MemDC, 0, 0, b.bmWidth, b.bmHeight, SRCCOPY );
/* TransparentBlt( ... ); call should go here,
so I can make portion of the bitmap transparent,
in order for the gray brush can be seen */
// cleanup
SelectObject( MemDC, old );
DeleteDC(MemDC);
EndPaint(hWnd, &ps);
}
return 0L;
break;
質問:
上記のコードを変更して、テスト ブラシが表示されるようにビットマップを透明にするにはどうすればよいですか?
元画像は以下。
TransparentBlt( ..., RGB( 0, 0, 0 ) );
黒い領域で透明にするために使用する必要があります。
結果を示す画像の例:
私の取り組み:
インターネットをブラウジングすると、ダブルバッファリングに関する簡単なチュートリアルしか見つかりませんでした。
このようなものは見つかりませんでしたが、正直なところ、WIN32 API の経験が浅いため、より良い検索結果を得るために、質問を適切に表現する方法がわかりません。
さらに詳しい情報が必要な場合は、お尋ねください。提供いたします。
質問を短くするために省略されています。