Как я могу сделать CMFCRibbonEdit автоматически конвертировать содержимое в верхний регистр?

Я использую пакет компонентов MFC в Visual Studio 2008. У меня есть поле для редактирования (CMFCRibbonEdit) на ленте, которое я хотел бы содержать только заглавными буквами. Я знаю, что могу передать ES_UPPERCASE в метод "Create", однако "Create" вызывается из самой ленты, а не явно из моего кода.

Чтобы добавить поле редактирования к моей ленте, я называю это:

CMFCRibbonPanel* pPanel = pCategoryViewer->AddPanel("Panel Title");
CMFCRibbonEdit *cEdit = new CMFCRibbonPanel( ID_MYEDITBOX, 60, "Edit Title" );
pPanel->Add( cEdit );

Исходя из того, что я прочитал в MSDN, я увидел, что могу перегрузить функцию "CreateEdit" CMFCRibbonEdit. Я попробовал это, но это не сработало.

class UpperCaseRibbonEdit : public CMFCRibbonEdit
{
public:
  UpperCaseRibbonEdit( UINT nID, int nWidth, LPCTSTR lpszLabel )
    :CMFCRibbonEdit( nID, nWidth, lpszLabel )
  {}

  CMFCRibbonRichEditCtrl* CreateEdit( CWnd* pWndParent, DWORD dwEditStyle )
  {
    return CMFCRibbonEdit::CreateEdit( pWndParent, dwEditStyle | ES_UPPERCASE );
  }
};

Я также попытался сделать этот вызов после инициализации моей ленты и ее элементов управления. Это тоже не сработало.

HWND editHwnd = GetDlgItem( ID_MYEDITBOX )->GetSafeHwnd();
SetWindowLong(editHwnd, GWL_STYLE, (LONG)GetWindowLong(editHwnd, GWL_STYLE) | ES_UPPERCASE);

Кто-нибудь знает, как мне это сделать?

1 ответ

Как я думаю, вы уже знаете, CMFCRibbonEdit имеет внутри переменную-член CMFCRibbonRichEditCtrl* m_pWndEdit; какой тип является потомком CRichEditCtrl. Таким образом, как говорится в комментарии к странице @Stanich, ES_UPPERCASE для него не поддерживается.

Я думаю, ваш лучший вариант: в вашем производном классе вы не забыли поставить ON_CONTROL_REFLECT(EN_CHANGE, OnChange) в карте сообщений; и ищем исходный код базового класса:

void CMFCRibbonRichEditCtrl::OnChange()
{
    CString strText;
    GetWindowText(strText);

    m_edit.m_strEdit = strText;
    m_edit.SetEditText(strText);
}

замените strText на ваш, чтобы он был прописными буквами после строки GetWindowText.

Другие вопросы по тегам