Model view controller 哪些参数可以一起有效创建HWND?

Model view controller 哪些参数可以一起有效创建HWND?,model-view-controller,mfc,overlay,Model View Controller,Mfc,Overlay,我正在尝试使用CWnd::CreateEx()创建一个窗口。不幸的是,我似乎无法获得正确的参数来生成HWND(函数总是返回FALSE) 我正在尝试创建一个覆盖CMyView的点击窗口。通过这种方式,我可以通过覆盖在视图上绘制,而不会闪烁,因为操作系统应该处理双缓冲,我只需要以最小的方式处理视图实现。我还将有一个ON\u WM\u SIZEhander来处理将覆盖调整到视图范围的问题 我做错了什么 是否有一种更简单的方法来执行我正在尝试执行的操作?WS\u POPUP标志是创建具有透明度级别的窗口

我正在尝试使用
CWnd::CreateEx()
创建一个窗口。不幸的是,我似乎无法获得正确的参数来生成
HWND
(函数总是返回
FALSE

我正在尝试创建一个覆盖
CMyView
的点击窗口。通过这种方式,我可以通过覆盖在视图上绘制,而不会闪烁,因为操作系统应该处理双缓冲,我只需要以最小的方式处理视图实现。我还将有一个
ON\u WM\u SIZE
hander来处理将覆盖调整到视图范围的问题

我做错了什么


是否有一种更简单的方法来执行我正在尝试执行的操作?

WS\u 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
以手动移动它以与视图窗口同步。

WS\u 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
以手动移动它以与视图窗口同步。

From:“Windows 8:顶层窗口和子窗口支持WS_EX_分层样式。以前的Windows版本仅支持顶层窗口的WS_EX_分层样式。”除非您的目标是Windows8及以上版本,否则这是一个bug。另外,
WM_EX_TRANSPARENT
并没有按照您的想法进行操作(“在绘制窗口下方的同级窗口之前,不应绘制窗口。窗口看起来是透明的,因为底层同级窗口的位已经绘制。”)。@IInspectable,好的,所以我将尝试使用顶级窗口。可能会做一些奇怪的事情。至于
WM_EX_TRANSPARENT
标志,是的,这正是我想要的,这样我可以用alpha通道绘制图像。@IInspectable,我在扩展样式中添加了
WS_EX_TOPMOST
,但它仍然不起作用。你应该得到一个“最后一个错误”跟踪,是0x0000057E,“无法创建顶级子窗口”您正在使用
L“Static”
classname和
WS\u child
标志创建一个子窗口
CWnd
,然后添加用于弹出窗口的
WS\u EX\u top
。。。你应该解释你的目标。您正在尝试制作一个具有透明背景和一些GDI图片的按钮吗?发件人:“Windows 8:顶级窗口和子窗口支持WS_-EX_分层样式。以前的Windows版本仅支持顶级窗口的WS_-EX_分层样式。”除非您针对的是Windows 8及更高版本,否则这是一个错误。另外,
WM_EX_TRANSPARENT
并没有按照您的想法进行操作(“在绘制窗口下方的同级窗口之前,不应绘制窗口。窗口看起来是透明的,因为底层同级窗口的位已经绘制。”)。@IInspectable,好的,所以我将尝试使用顶级窗口。可能会做一些奇怪的事情。至于
WM_EX_TRANSPARENT
标志,是的,这正是我想要的,这样我可以用alpha通道绘制图像。@IInspectable,我在扩展样式中添加了
WS_EX_TOPMOST
,但它仍然不起作用。你应该得到一个“最后一个错误”跟踪,是0x0000057E,“无法创建顶级子窗口”您正在使用
L“Static”
classname和
WS\u child
标志创建一个子窗口
CWnd
,然后添加用于弹出窗口的
WS\u EX\u top
。。。你应该解释你的目标。你想做一个有透明背景和GDI图片的按钮吗?