gpt4 book ai didi

c++ - SetWindowLongPtr 不能正常工作

转载 作者:行者123 更新时间:2023-11-30 04:35:10 25 4
gpt4 key购买 nike

我想在我的程序中继承 RichEdit(这里是 C++ 代码:http://dumpz.org/46182/)。 _native_log 是richedit 的一个hwnd。起初一切正常,LogWindow::wndProc 回调正常调用,但如果我在 RichEdit 中设置一些文本或单击它们,LogWindow::wndProc 停止工作(没有任何进一步的调用)。有什么想法我做错了什么吗?

void LogWindow::replaceNativeLog(HWND native_log_handle) {
_native_log = native_log_handle;

SendMessage(_native_log, EM_GETOLEINTERFACE, 0, (LPARAM) &_rich_edit_ole);
_old_wnd_proc = (WNDPROC) SetWindowLongPtr(_native_log, GWLP_WNDPROC, (LONG) &wndProc);
}

LRESULT LogWindow::wndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
switch (Msg) {
case EM_STREAMIN:
break;
case WM_SETTEXT:
break;
};
return CallWindowProc(_old_wnd_proc, _native_log, Msg, wParam, lParam);
}

最佳答案

从 Common Controls 版本 6 开始,对窗口子类化的过程进行了修改,以消除以前版本的问题。特别是,如果控件被多次子类化,则不再是问题。

可以在 "Subclassing Controls" 中找到子类化 v6 之前的公共(public)控件与 v6 处理方式之间的比较。 .没有调用 SetWindowLongPtr 来替换窗口过程,而是 SetWindowSubclass除了替换窗口过程外,它还负责所有内部簿记。重新设计的结果是您也不必存储指向先前窗口过程的指针;如果你需要调用原来的窗口过程有DefSubclassProc任您支配。

这当然只有在所有尝试子类化 a 控件的竞争客户都同意使用 v6 样式子类化的情况下才有用。

关于c++ - SetWindowLongPtr 不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5571973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com