7

简介及相关资料:

最近,我在这里问了一个关于正确缩放位图的问题,这样可以保持图片的质量:

位图在按钮背景上拉伸/收缩时会失去质量

我试图采用评论中提出的建议,使用`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没有经验,所以我不知道如何正确地表达这个问题,以获得更好的搜索结果。

如果需要更多信息,请索取,我会提供。

省略以保持问题简短。

4

1 回答 1

1

您需要创建一个掩码,使用特定的光栅操作仅复制定义掩码的像素。 http://www.winprog.org/tutorial/transparency.html

下一个代码是 MFC,但您可以轻松提取 MFC 对象并将其转换为标准 GDI 操作。 http://www.codeproject.com/Articles/703/Drawing-Transparent-Bitmap-with-ease-with-on-the-f

于 2013-09-23T07:37:16.247 回答