C++ MFC中的动态透明几何
我正在为我的MFC应用程序创建一个新的UI演练,并希望在演练过程中突出显示某些控件。具体地说,我想使整个窗口变暗,除了我强调的控件 我尝试使用C++ MFC中的动态透明几何,c++,windows,winapi,mfc,C++,Windows,Winapi,Mfc,我正在为我的MFC应用程序创建一个新的UI演练,并希望在演练过程中突出显示某些控件。具体地说,我想使整个窗口变暗,除了我强调的控件 我尝试使用SetLayeredWindowAttributes创建一个部分透明的黑色覆盖,但这不允许我将子区域设置为完全透明。可以做到这一点,但我并不急于为需要高亮显示的每个控件创建BMP/PNG文件 我可以动态创建透明度几何体吗?例如,我是否可以从头开始绘制位图透明度,然后将其加载到UpdateLayeredWindow 我还需要与Windows7兼容(尽管它支持
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+区域
类,因为GDICRgn
缺乏透明度。但一定是做错了什么,覆盖窗口没有绘制。如果您能浏览一下我更新问题时使用的代码,我将不胜感激。您对这段最新代码看到了什么?我不熟悉GDI+,但是如果你把你的项目附加到这里,我可以看一看。尽管验证了控件Rect比窗口Rect小很多,但是窗口是完全100%透明的。不幸的是,我无法共享该项目。我真的没有时间创建一个虚拟骨架项目来处理它。但是,您可以返回到原始解决方案,但不是创建一个暗覆盖,而是创建四个以围绕高亮显示的控件:一个在其顶部,一个在底部,每侧两个。