2011-04-06 307 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子類化。所以我和那個功能之間有一種衝突。非常感謝您的幫助。