c++ - 子类化后编辑控件无法获得焦点或设置文本

标签 c++ winapi subclassing editbox edit-control

我创建了一个编辑框,它工作得很好,但是在我为它添加了自定义 WndProc 之后,文本“我的编辑”不可见,并且在单击时不会获得焦点。

HWND handle=CreateWindowExW(0,L"Edit",L"my edit",WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_CENTER | ES_MULTILINE | ES_AUTOVSCROLL,
                         0,0,200,200,window.handle,0,GetModuleHandle(NULL),0);

到这里为止一切正常
设置此窗口过程后,编辑控件不再按预期工作

SetWindowLongPtr(handle,GWLP_WNDPROC,(LRESULT)staticWndProc); 
LRESULT CALLBACK staticWndProc(HWND handle, UINT uMsg, WPARAM wParam, LPARAM lParam){
    switch (uMsg){
        case WM_LBUTTONDOWN:
            std::wcout << handle << L" click\n"; //click event works
            break;
        default:
            return DefWindowProcW(handle,uMsg,wParam,lParam);
    }
    return 0;  
}

我是否必须手动处理某些事件或更改我的构造样式标志?

最佳答案

子类化涉及拦截窗口的消息,可能会处理其中的一些消息,并将您不处理的消息传递给原始窗口过程

您并没有这样做 - 您正在将您没有处理的所有内容传递给 DefWindowProcDefWindowProc 没有任何编辑控件(或任何类型的控件)的特殊行为。因此,您已经有效地将编辑控件变成了通用窗口。

现在不鼓励使用 SetWindowLongPtr 对窗口进行子类化,但是如果您确实使用该方法,则调用 SetWindowLongPtr 的返回值会给您旧的窗口过程,你打算使用 CallWndProc 函数而不是 DefWindowProc 来调用它。

但是,将窗口子类化的现代方法是使用 SetWindowSubclass 函数,它会为您调用原始过程 - 您需要做的就是调用 DefSubclassProc函数,如下所示:

LRESULT CALLBACK staticWndProc(HWND handle, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR, DWORD_PTR){
    switch (uMsg){
        case WM_LBUTTONDOWN:
            std::wcout << handle << L" click\n"; //click event works
            break;
        case WM_NCDESTROY:
            RemoveWindowSubclass(handle, staticWndProc, 0);
            // fall through
        default:
            return DefSubclassProc(handle,uMsg,wParam,lParam);
    }
    return 0;  
}

SetWindowSubclass(handle, staticWndProc, 0, 0);

请注意,当收到 WM_NCDESTROY 时,上面显示的子类函数会自行删除。

关于c++ - 子类化后编辑控件无法获得焦点或设置文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32622414/

相关文章:

ios - 映射解析对象在 callFunctionInBackground 中不起作用

java - 如何从 prepareCall 方法中获取自定义 CallableStatement 对象

c++ - 为什么派生类的构造函数应该在其初始化列表中使用基类的默认构造函数?

c++ - 使用 C++ 扫描多核系统中的 CPU 缓存操作

c - C 中的 WinAPI 文本输出

windows - 获取 DrawText [Ex] 解释的 GDI HFONT 行高

c++ - 为什么我的 Gdiplus::Bitmap 不能保存文件

ios - 为什么要继承UIView?

c# - 调试从 c# 到 c++/cli 到 c++ 的函数调用不起作用

c++ - 如何避免使用 lock_guard 锁定?