2011-04-06 173 views
1

我想在我的程序中继承RichEdit(这里是C++代码:http://dumpz.org/46182/)。 _native_log是richedit的重要组成部分。起初所有工作正常,LogWindow :: wndProc回调称为正常,但如果我在RichEdit中设置了一些文本或单击它们LogWindow :: wndProc停止工作(没有任何进一步调用它)。有什么想法我做错了什么?SetWindowLongPtr does not work properly

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); 
} 
+1

你的问题说SetWindowLongPtr,你的代码说SetWindowLong。不好。 – 2011-04-06 20:19:09

+0

哦,它应该是代码中的SetWindowLongPtr。我在我的来源中更改了它,但忘记在dumpz.org上更改它。 – longedok 2011-04-06 20:29:28

+0

演员应该是'LONG_PTR'而不是'LONG',你真的必须使用那些C风格的演员吗? – 2011-04-06 21:10:17

回答

1

从公共控件第6版开始,修改了子类化窗口的过程以消除以前版本的问题。特别是如果一个控件不止一次地被分类,它就不再是一个问题。

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

这当然只会有所帮助,如果所有试图对控件进行子类化的竞争客户都同意使用v6样式子类。

1

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