Popup-меню для CRichEditCtrl
От: c0unt Украина  
Дата: 28.07.06 15:27
Оценка: 3 (1)
Понадобился как-то сабж для 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);
}
-=Life is full of little surprises=-
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.