哪些参数有效共同创建HWND?

时间:2016-08-29 19:42:49

标签: model-view-controller mfc overlay

我尝试使用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处理器来处理将叠加层调整到视图范围的大小。

我做错了什么?

有没有更简单的方法来做我想做的事情?

1 个答案:

答案 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窗口同步。