Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从位图图像到窗口仅绘制黑色(过滤除黑色以外的颜色)_C++_Visual C++_Mfc_Gdi+_Gdi - Fatal编程技术网

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

C++ 如何从位图图像到窗口仅绘制黑色(过滤除黑色以外的颜色),c++,visual-c++,mfc,gdi+,gdi,C++,Visual C++,Mfc,Gdi+,Gdi,我正在尝试制作一个绘图程序,使用户可以更改背景,而前景颜色(用于绘制形状)始终为黑色。 现在,当用户更改背景颜色时,HBRUSH会使用选定的颜色绘制整个窗口,从而清除绘制的所有形状。 为了解决这个问题,我做了3个步骤(注意问题出在第三步): saveBeforeBackcolorChange():在更改背景色之前将窗口保存为位图的函数 FillRect(hdc、rect、color):使用新颜色绘制整个窗口 RealSuffCudioCudioCudio():应该只从位图(代表图)中考虑黑色像

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

  • saveBeforeBackcolorChange():在更改背景色之前将窗口保存为位图的函数
  • FillRect(hdc、rect、color):使用新颜色绘制整个窗口
  • RealSuffCudioCudioCudio():应该只从位图(代表图)中考虑黑色像素,并考虑任何颜色透明 下面是我对第三步的实现:

    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);
    }
    
    不幸的是,结果是它认为只有白色是透明的。这意味着,如果背景是白色(这是初始背景色),它工作得很好。因此,用户只能成功更改背景色一次


    如果有人能帮忙,我将不胜感激。

    是的,这正是这种方法的问题所在。你要么需要图层信息(即始终将前景与背景分开存储),要么需要知道如何根据现有像素颜色选择性填充的填充算法。在我看来,你似乎错误地使用了
    SetColorkey
    功能;那些硬编码的低颜色键和高颜色键的值对我来说味道不好。那么,你认为我如何才能实现我的目标呢?