Introduction
I was quite frustrated in with my application. I have a dialog with a simple multi-line edit (MLE) control.
When I attempted to press the TAB key, the entire contents of my edit control would be highlighted!
Evidently, this is the default action of an edit control when the Tab key is pressed. Anyway, I wanted the
Tab key to work as I would expect it to in a control that is supposedly mimicing an editor so I set out to
find a solution.
Solution
Basically, it came down to control’s the tried and true, PreTranslateMessage member function.
It works like this. PreTranslateMessage is a virtual member function that is called in order to give your control a chance
to do something before (or instead of) the default behavior of the control. Therefore, in this function,
I check to see if the message being sent is a WM_KEYDOWN message (indicating that the user has pressed some key).
I then determine if the key being pressed is the Tab key (whose id is VK_TAB). If these two cases are true,
I simply deselect any selected text and insert a tab character into the control (\t).
Implementing this Solution
Here are the steps necessary to implement my work-around.
- To your override of CDialog class, add the following method:
- Implement this function, for example:
virtual BOOL PreTranslateMessage(MSG *);
BOOL CEditExDlg::PreTranslateMessage(MSG* pMsg)
{
if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_TAB))
{
// get the char index of the caret position
int nPos = LOWORD(m_MyEditCtl.CharFromPos(m_MyEditCtl.GetCaretPos()));// select zero chars
m_MyEditCtl.SetSel(nPos, nPos);// then replace that selection with a TAB
m_MyEditCtl.ReplaceSel("\t", TRUE);// no need to do a msg translation, so quit.
// that way no further processing gets done
return TRUE;
}//just let other massages to work normally
return CDialog::PreTranslateMessage(pMsg);
}