如何仅从位图图像到窗口绘制黑色(滤除黑色以外的颜色)

时间:2017-05-09 21:43:04

标签: c++ visual-c++ mfc gdi+ gdi

我正在尝试制作一个允许用户更改背景的Paint程序,而前景色(用于绘图形状)始终是黑色的。 现在,当用户更改背景颜色时,HBRUSH会使用所选颜色绘制整个窗口,从而清除所有绘制的形状。 为了解决这个问题,我做了3个步骤(注意问题出在第三步):

  1. saveBeforeBackcolorChange():在backColor更改之前将窗口保存到位图的函数
  2. FillRect(hdc,rect,color):使用新颜色绘制整个窗口
  3. loadAfterBackcolorChanged():应该只从位图中获取黑色像素(代表图纸)并考虑任何颜色透明
  4. 以下是我执行第三步的步骤:

    void loadAfterBackcolorChanged(HDC hdc){
        ULONG_PTR m_gdiplusToken;
        GdiplusStartupInput gdiplusStartupInput;
        GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
        Graphics graphics(hdc);
        wchar_t* filePathString = new wchar_t[MAX_PATH];
        MultiByteToWideChar(CP_ACP, 0, TEMP_FILE.c_str(), -1, filePathString, 4096);
        Image image(filePathString);
        Gdiplus::ImageAttributes imAtt;
        imAtt.SetColorKey(
            Color(1, 1, 1),
            Color(255, 255, 255),
            ColorAdjustTypeBitmap);
        graphics.DrawImage(
            &image,
            Rect(0, 0, image.GetWidth(), image.GetHeight()),  // dest rect
            0, 0, image.GetWidth(), image.GetHeight(),          // source rect
            UnitPixel,
            &imAtt);
    }
    

    不幸的是,结果是它只考虑白色透明。这意味着如果背景为白色(这是最初的backColor),它可以很好地工作。因此,用户只能成功更改一次backColor!

    如果有人能提供帮助,我将不胜感激。

0 个答案:

没有答案