我尝试使用CWnd::CreateEx()
创建一个窗口。不幸的是,我似乎无法正确获取参数以生成HWND
(函数始终返回FALSE
)。
class COverlay : public CWnd
{
public:
COverlay();
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(COverlay, CWnd)
END_MESSAGE_MAP()
COverlay::COverlay()
{
}
class CMyView : CView
{
public:
CMyView() {}
int OnCreate(LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMyView, CView)
ON_WM_CREATE()
END_MESSAGE_MAP()
int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
m_overlay.CreateEx(WS_EX_COMPOSITED | WS_EX_LAYERED | WS_EX_TRANSPARENT
, _T("Static"), _T(""), WS_VISIBLE | WS_CHILD, CRect(), this, -1);
return 0;
}
我试图创建一个覆盖CMyView
的点击窗口。通过这种方式,我可以通过覆盖层绘制视图,而不会因为操作系统应该处理双缓冲而闪烁,我只需要以最小的方式处理视图实现。我还将有一个ON_WM_SIZE
处理器来处理将叠加层调整到视图范围的大小。
我做错了什么?
有没有更简单的方法来做我想做的事情?
答案 0 :(得分:0)
WS_POPUP
标志:
static CString className = AfxRegisterWndClass(0);
DWORD style = WS_CAPTION | WS_SYSMENU | WS_POPUP;
DWORD styleEx = WS_EX_LAYERED;// | WS_EX_TRANSPARENT;
if (!m_overlay.CreateEx(styleEx, className, 0, style, CRect(), this, 0))
{
//error...
return;
}
m_overlay.SetLayeredWindowAttributes(0, 255 * 50 / 100, LWA_ALPHA);
m_overlay.SetWindowPos(0, 0, 0, 400, 300, SWP_SHOWWINDOW | SWP_NOACTIVATE);
或者更改透明度颜色:
COLORREF transparentColor = RGB(255, 0, 0);
...
m_overlay.SetLayeredWindowAttributes(transparentColor, 0, LWA_COLORKEY);
void COverlay::OnPaint()
{
CPaintDC dc(this);
CRect rc;
GetClientRect(&rc);
dc.FillSolidRect(rc, transparentColor);
//opaque drawings...
dc.TextOut(0, 0, L"Test...");
}
注意,WS_EX_TRANSPARENT
已被注释掉,因为这只会影响鼠标点击次数,否则它不会改变外观。您可以重新添加该标志。
此窗口是弹出窗口,因此当您移动框架窗口或子窗口时它不会移动。您必须覆盖框架和子框架窗口OnWindowPosChanged
才能手动移动它以与View窗口同步。