Понадобился как-то сабж для CEdit, здесь не нашел. На CodeProject есть пример PJ Arends для CEdit.
Переделал под CRichEditCtrl, у PJ Arends в OnContextMenu(CWnd* pWnd, CPoint point)
вызывается метод SetFocus(), не знаю как в CEdit, а в CRichEditCtrl его вызывать не стоит,
исчезает цветовое инвертирование текста
В общем, щас раПотает
Может кому и пригодится
// .h file
//popup-menu
#define MES_UNDO _T("&Отменить")
#define MES_REDO _T("&Повторить")
#define MES_CUT _T("Вырезать")
#define MES_COPY _T("Копировать")
#define MES_PASTE _T("Вставить")
#define MES_DELETE _T("Удалить")
#define MES_SELECTALL _T("Выделить всё")
#define ME_SELECTALL WM_USER + 0x7000
protected:
CRichEditCtrl m_cRichEdit;
...
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
...
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
// .cpp file
BEGIN_MESSAGE_MAP(CПотомок, CПредок)
//{{AFX_MSG_MAP(CПотомок)
ON_WM_CONTEXTMENU()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CПотомок::OnCommand(WPARAM wParam, LPARAM lParam)
{
switch (LOWORD(wParam))
{
case EM_UNDO:
m_cRichEdit.Undo();
break;
case WM_CUT:
m_cRichEdit.Cut();
break;
case WM_COPY:
m_cRichEdit.Copy();
break;
case WM_CLEAR:
m_cRichEdit.Clear();
break;
case WM_PASTE:
m_cRichEdit.Paste();
break;
case ME_SELECTALL:
m_cRichEdit.SetSel(0, -1);
::SendMessage(m_cRichEdit.m_hWnd, EM_SETSEL, 0, -1);
break;
default:
return CWnd::OnCommand(wParam, lParam);
}
return true;
}
void CПотомок::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu menu;
menu.CreatePopupMenu();
BOOL bReadOnly = m_cRichEdit.GetStyle() & ES_READONLY;
DWORD flags = m_cRichEdit.CanUndo() && !bReadOnly ? 0 : MF_GRAYED;
menu.InsertMenu(0, MF_BYPOSITION | flags, EM_UNDO,
MES_UNDO);
menu.InsertMenu(1, MF_BYPOSITION | MF_SEPARATOR);
CHARRANGE crange;
m_cRichEdit.GetSel(crange);
DWORD selec = crange.cpMax-crange.cpMin;
flags = LOWORD(selec) == HIWORD(selec) ? MF_GRAYED : 0;
menu.InsertMenu(2, MF_BYPOSITION | 0, WM_COPY,
MES_COPY);
flags = (flags == MF_GRAYED || bReadOnly) ? MF_GRAYED : 0;
menu.InsertMenu(2, MF_BYPOSITION | flags, WM_CUT,
MES_CUT);
menu.InsertMenu(4, MF_BYPOSITION | flags, WM_CLEAR,
MES_DELETE);
flags = ::IsClipboardFormatAvailable(CF_TEXT) &&
!bReadOnly ? 0 : MF_GRAYED;
menu.InsertMenu(4, MF_BYPOSITION | flags, WM_PASTE,
MES_PASTE);
menu.InsertMenu(6, MF_BYPOSITION | MF_SEPARATOR);
int len = m_cRichEdit.GetWindowTextLength();
flags = (!len || (LOWORD(selec) == 0 && HIWORD(selec) ==
len)) ? MF_GRAYED : 0;
menu.InsertMenu(7, MF_BYPOSITION | flags, ME_SELECTALL,
MES_SELECTALL);
menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON |
TPM_RIGHTBUTTON, point.x, point.y, this);
}