shu*_*uji 1 c++ winapi edit-control subclassing editbox
我创建了一个编辑框,它工作得很好,但在我为其添加自定义 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);
Run Code Online (Sandbox Code Playgroud)
直到这里它工作得很好在
我设置此窗口过程之后,编辑控件不再按预期工作
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;
}
Run Code Online (Sandbox Code Playgroud)
我是否必须手动处理某些事件或更改我的构造风格标志?
子类化涉及拦截窗口的消息,可能处理其中的一些消息,并将那些不处理的消息传递给原始窗口过程。
你没有这样做 - 你正在将你没有处理的所有事情传递给DefWindowProc. DefWindowProc没有任何编辑控件(或者实际上任何类型的控件)的专门行为。因此,您已经有效地将编辑控件变成了通用窗口。
如今,不鼓励使用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);
Run Code Online (Sandbox Code Playgroud)
请注意,上面显示的子类函数在WM_NCDESTROY收到时会删除自身。
| 归档时间: |
|
| 查看次数: |
651 次 |
| 最近记录: |