简介及相关资料:
最近,我在这里问了一个关于正确缩放位图的问题,这样可以保持图片的质量:
我试图采用评论中提出的建议,使用`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没有经验,所以我不知道如何正确地表达这个问题,以获得更好的搜索结果。
如果需要更多信息,请索取,我会提供。
省略以保持问题简短。