2010-01-19 92 views
2

我想覆蓋文本粘貼到豐富的編輯控件時的默認行爲。具體來說,我想粘貼純文本,而不是格式化的富文本。我想這歸結爲將數據作爲不同的剪貼板格式,但我不知道如何首先攔截默認行爲。攔截粘貼到(豐富)編輯控件

僅供參考,我主要有:

class MyDialog : public CDialog 
{ 
CRichEditCtrl m_Edit; 
}; 

及相關DDX_Control(pDX, IDC_EDIT1, m_Edit)在cpp文件設置。由於我不認爲CRichEditCtrl內置任何控制粘貼格式的工具,我怎樣才能最優雅地設置它?當我谷歌,我發現很多人手動捕獲CTRL + V等......這不僅是可怕的,但不會在粘貼鍵不是V的語言工作!

回答

3

您可以截取EN_UPDATE指令並在收到該指令時重新格式化文本?唯一的問題是您不知道添加了哪些新數據。

儘管如此,您可能會發現使用自己的方法覆蓋CRichEditCtrl會更容易,並攔截您希望處理傳入數據的重要消息,然後調用父類的該函數的實現。這樣,每次的東西加到你正在執行的必要重新格式化...

編輯:爲了得到從的CRichEditCtrl類是很容易

class CMyRichEditCtrl : public CRicheditCtrl 
{ 
    DECLARE_DYNAMIC(CMyRichEditCtrl) 

protected: 
    DECLARE_MESSAGE_MAP() 

public: 
    CMyRichEditCtrl(); 
    virtual ~CMyRichEditCtrl(); 
    // ... Rest of implementation here 
}; 

然後,您可以攔截消息映射信息如下...

ON_MESSAGE(EM_PASTESPECIAL, &CMyRichEditCtrl::OnPasteSpecial) 

和處理程序看起來像這樣:

LRESULT CMyRichEditCtrl::OnPasteSpecial(WPARAM wParam, LPARAM lParam) 

wParam是剪貼板格式,lParam包含NULL或REPASTESPECIAL結構。

然後您需要做的就是確保您的類是使用DoDataExchange函數接收所有消息並且可以輕鬆完成的類。

定義你的成員變量:

CMyRichEditCtrl m_MyRichEditCtrl; 

,並添加以下的DoDataExchange:

DDX_Control(pDX, IDC_MYRICHEDIT, m_MyRichEditCtrl); 

所有的郵件都會通過你實現的RichEditCtrl

路線可以攔截任何消息,包括WM_PASTE,這種方式...

+0

在EN_UPDATE ... I g但是我們在控件中做了格式化,我們只想確保用戶不能輸入格式。 – 2010-01-19 11:19:22

+0

關於「覆蓋CRichEditCtrl」,你可以進一步瞭解更多細節嗎?無論如何,這聽起來是更好的選擇。 – 2010-01-19 11:20:53

+0

真棒回答,感謝您花時間。 – 2010-01-19 13:30:16