我想在我的程序中继承RichEdit(这里是c ++代码:http://dumpz.org/46182/)。 _native_log是一个富有的人。起初一切正常,LogWindow :: wndProc回调称为normal,但如果我在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);
}
答案 0 :(得分:1)
最后,我发现了问题。我实际上为Miranda IM开发了一个插件,还有另一个函数试图将我想要的richedit子类化。所以我和那些功能之间存在着一种冲突。感谢所有人的帮助。
答案 1 :(得分:1)
从Common Controls版本6开始,对子类化窗口的过程进行了修订,以消除先前版本的问题。特别是如果一个控件被子类化不止一次就不再是问题了。
可以在"Subclassing Controls"找到子类化前v6公共控件和v6做事方式之间的比较。除了调用SetWindowLongPtr来替换窗口过程之外,还有SetWindowSubclass除了替换窗口过程之外还执行所有内部簿记。重新设计的结果是您不必存储指向前一个窗口过程的指针;如果您需要调用原始窗口程序,可以使用DefSubclassProc。
这当然只有在尝试子类化控件的所有竞争客户端都同意使用v6样式子类化时才有用。