65.9K
CodeProject is changing. Read more.
Home

Subclassing CEdit to disable clipboard operations

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (4 votes)

May 26, 2010

CPOL
viewsIcon

18261

Clipboard operations like cut, copy, paste on a normal CEdit control can be disabled usng subclassing.

The MFC CEdit class provides no simple way to prevent user from copying the contents of the corresponding Edit Control or pasting text into it or getting a context menu. Using subclassing and handling the WM_COPY, WM_PASTE, WM_CONTEXTMENU these operations can be disabled in a very simple way.

The code sample is very short and self explanatory. Most of the code is AppWizard generated. CPDEdit.* are the 2 main files of interest.

CPDEdit.h

-----------
class CPDEdit: public CEdit
{ 
public:
DECLARE_MESSAGE_MAP()
afx_msg LRESULT OnCopy(WPARAM, LPARAM);
afx_msg LRESULT OnPaste(WPARAM, LPARAM);
afx_msg LRESULT OnContextMenu(WPARAM, LPARAM);
}; 
CPDEdit.cpp
-----------
BEGIN_MESSAGE_MAP(CPDEdit, CEdit)
ON_MESSAGE(WM_COPY, OnCopy)
ON_MESSAGE(WM_PASTE, OnPaste)
ON_MESSAGE(WM_CONTEXTMENU, OnContextMenu)
END_MESSAGE_MAP()
LRESULT CPDEdit::OnCopy(WPARAM, LPARAM) {
return 0;
}
LRESULT CPDEdit::OnPaste(WPARAM, LPARAM) {
return 0;
}
LRESULT CPDEdit::OnContextMenu(WPARAM, LPARAM) {
return 0;
}

CPDEdit is the class derived from CEdit used to subclass the edit control. It traps the WM_COPY, WM_PASTE and WM_CONTEXTMENU messages and simply ignores them. Within your Dialog class change the type of control from CEdit to CPDEdit:

	// CEdit m_edit;
	CPDEdit m_edit;

And in the InitDialog() function subclass the control:

	m_edit.SubclassDlgItem(IDC_EDIT, this);

Note that if you are using DDX with a control type then you don't need to call SubclassDlgItem because DDX internally calls it.