Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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++ MFC中的动态透明几何_C++_Windows_Winapi_Mfc - Fatal编程技术网

C++ MFC中的动态透明几何

C++ MFC中的动态透明几何,c++,windows,winapi,mfc,C++,Windows,Winapi,Mfc,我正在为我的MFC应用程序创建一个新的UI演练,并希望在演练过程中突出显示某些控件。具体地说,我想使整个窗口变暗,除了我强调的控件 我尝试使用SetLayeredWindowAttributes创建一个部分透明的黑色覆盖,但这不允许我将子区域设置为完全透明。可以做到这一点,但我并不急于为需要高亮显示的每个控件创建BMP/PNG文件 我可以动态创建透明度几何体吗?例如,我是否可以从头开始绘制位图透明度,然后将其加载到UpdateLayeredWindow 我还需要与Windows7兼容(尽管它支持

我正在为我的MFC应用程序创建一个新的UI演练,并希望在演练过程中突出显示某些控件。具体地说,我想使整个窗口变暗,除了我强调的控件

我尝试使用
SetLayeredWindowAttributes
创建一个部分透明的黑色覆盖,但这不允许我将子区域设置为完全透明。可以做到这一点,但我并不急于为需要高亮显示的每个控件创建BMP/PNG文件

我可以动态创建透明度几何体吗?例如,我是否可以从头开始绘制位图透明度,然后将其加载到
UpdateLayeredWindow

我还需要与Windows7兼容(尽管它支持EOL)

跟进: 尝试绘制透明GDI+区域,但不起作用:


    void ApplicationDlg::Highlight(const CRect& rect)
    {
        CRect wndRect;
        GetWindowRect(&wndRect);
        Gdiplus::Rect wndRectPlus(wndRect.left, wndRect.top, wndRect.Width(), wndRect.Height());
        Gdiplus::Region wndRegion(wndRectPlus);
    
        Gdiplus::Rect controlRectPlus(rect.left, rect.top, rect.Width(), rect.Height());
        Gdiplus::Region highlightRegion(controlRectPlus);
    
        wndRegion.Exclude(&highlightRegion);
    
        Gdiplus::SolidBrush transparentBrush(Gdiplus::Color(0, 0, 0, 0));
        Gdiplus::SolidBrush darkenBrush(Gdiplus::Color(128, 0, 0, 0));
    
        CDC* pDCScreen = m_WalkthroughDlg.GetDC();
        HDC hDC = CreateCompatibleDC(pDCScreen->m_hDC);
        HBITMAP hBmp = CreateCompatibleBitmap(hDC, wndRect.Width(), wndRect.Height());
        HBITMAP hBmpOld = (HBITMAP)SelectObject(hDC, hBmp);
    
        Gdiplus::Graphics graphics(hDC);
        graphics.FillRegion(&darkenBrush, &wndRegion);
        graphics.FillRegion(&transparentBrush, &highlightRegion);
    
        BLENDFUNCTION blend = {0};
        blend.BlendOp = AC_SRC_OVER;
        blend.SourceConstantAlpha = 255;
        blend.AlphaFormat = AC_SRC_ALPHA;
        SIZE sizeWnd = {wndRect.Width(), wndRect.Height()};
        POINT ptSrc = {0,0};
        m_WalkthroughDlg.UpdateLayeredWindow(pDCScreen, NULL, &sizeWnd, CDC::FromHandle(hDC), &ptSrc, NULL, &blend, ULW_ALPHA); // TODO cleanup FromHandle refs
        m_WalkthroughDlg.BringWindowToTop();
    
        SelectObject(hDC, hBmpOld);
        DeleteObject(hBmp);
        DeleteDC(hDC);
    }


您可以使用
CRgn
class动态创建掩码:

它允许您组合区域(如果需要高亮显示多个区域)。然后可以使用
FillRgn
函数更新
UpdateLayeredWindow
中使用的
hdcSrc
DC


或者,如果高光是矩形的,您可以在
hdcsc

上绘制矩形,尝试使用GDI+
区域
类,因为GDI
CRgn
缺乏透明度。但一定是做错了什么,覆盖窗口没有绘制。如果您能浏览一下我更新问题时使用的代码,我将不胜感激。您对这段最新代码看到了什么?我不熟悉GDI+,但是如果你把你的项目附加到这里,我可以看一看。尽管验证了控件Rect比窗口Rect小很多,但是窗口是完全100%透明的。不幸的是,我无法共享该项目。我真的没有时间创建一个虚拟骨架项目来处理它。但是,您可以返回到原始解决方案,但不是创建一个暗覆盖,而是创建四个以围绕高亮显示的控件:一个在其顶部,一个在底部,每侧两个。