SetWindowLongPtr无法正常工作

时间:2011-04-06 19:35:06

标签: c++ winapi

我想在我的程序中继承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);
} 

2 个答案:

答案 0 :(得分:1)

最后,我发现了问题。我实际上为Miranda IM开发了一个插件,还有另一个函数试图将我想要的richedit子类化。所以我和那些功能之间存在着一种冲突。感谢所有人的帮助。

答案 1 :(得分:1)

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

可以在"Subclassing Controls"找到子类化前v6公共控件和v6做事方式之间的比较。除了调用SetWindowLongPtr来替换窗口过程之外,还有SetWindowSubclass除了替换窗口过程之外还执行所有内部簿记。重新设计的结果是您不必存储指向前一个窗口过程的指针;如果您需要调用原始窗口程序,可以使用DefSubclassProc

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