编辑控件在子类化后无法获得焦点或设置文本
Edit control cannot get focus or set text after subclassing
我已经创建了一个编辑框,它工作得很好,但是在我为它添加了一个自定义WndProc之后,文本"my edit"不可见,当点击时不会聚焦。
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" clickn"; //click event works
break;
default:
return DefWindowProcW(handle,uMsg,wParam,lParam);
}
return 0;
}
我必须手动处理一些事件或改变我的建筑风格标志吗?
子类化涉及截取窗口的消息,可能处理其中的一些消息,并将不处理的消息传递给原始窗口过程。
你没有这样做——你把所有你不处理的事情都传递给了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" clickn"; //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++发送文本文件名
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 内置函数可查看CPP中的成员变量
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- QTableView:endMoveRows在模型中重置水平页眉大小
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何在c++中从文本文件中逐行读取整数
- 如何使用选项卡键在文本框之间更改焦点
- 即使不满足条件,也会重置文本文件.(C++)
- 如何获得文本框焦点的通知
- 编辑控件在子类化后无法获得焦点或设置文本
- 实现插槽功能当且仅当文本框具有焦点并按下"Enter"时?
- 如何按Escape键重置QLineEdit文本