Winapi 防止编辑控件渲染

Winapi 防止编辑控件渲染,winapi,Winapi,我有一个编辑控件,我想在其中禁用任何渲染,但将其保留为交互式(类似于所有者绘制的控件)。现在,我已经对窗口进行了子类化,并捕获了WM_PAINT,例如 SetWindowSubclass(box, [](HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, UINT_PTR, DWORD_PTR) -> LRESULT { if (msg != WM_PAINT) return DefSubclassProc(hwnd

我有一个编辑控件,我想在其中禁用任何渲染,但将其保留为交互式(类似于所有者绘制的控件)。现在,我已经对窗口进行了子类化,并捕获了WM_PAINT,例如

SetWindowSubclass(box, [](HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, UINT_PTR, DWORD_PTR) -> LRESULT {
    if (msg != WM_PAINT)
        return DefSubclassProc(hwnd, msg, wparam, lparam);
    PAINTSTRUCT paint;
    BeginPaint(hwnd, &paint);
    EndPaint(hwnd, &paint);
    return 0;
}, 0, 0);
这可以很好地禁用几乎所有编辑框的渲染。但是,在与它交互时,它仍会偶尔清除它将渲染的区域,从而在使用Direct3D在该空间中渲染时造成空域问题


如何完成子类,使编辑框从不呈现任何内容?

您无法获得可靠的结果。编辑控件可以追溯到20世纪80年代,当时Windows必须在640KB 386SUX机器上运行。它犯了一些错误,使其响应足够快,它直接绘制到窗口,而不是始终使用Invalidate(),并将绘制留给WM_绘制消息处理程序。加上25年的appcompat,以防止它被修复。但是一个支持Unicode的编辑控件对我来说太麻烦了(您需要什么样的交互性?如果您不需要鼠标,可以将编辑内容包装在一个小的父HWND中,对其进行剪辑以防止其绘制;或者可以使用
SetWindowRgn()
。在这两种情况下,控件仍然可以对焦并处理键盘输入,但不可单击,尽管您可以尝试将鼠标输入转发给它。好吧,我真正可以使用的是“编辑框的所有正常功能”。转发鼠标输入,我可以做到这一点。