MFC Edit управляющее сообщение дескриптор доступа к объекту Document - PullRequest
1 голос
/ 11 марта 2019

Я создаю новый класс расширения CEdit для переопределения некоторых дескрипторов сообщений.

Моя конечная цель заключается в том, чтобы при редактировании элемента управления находились в фокусе, некоторые кнопки панели инструментов стали доступны.

Я создал переменную bool в doc. тогда pCmdUI-> enable () устанавливается в это значение bool. Онфокус переопределяется в новом классе управления редактированием. У меня проблемы с обновлением этого bool vairbale из дескриптора сообщения onfocus.

void CMFCDoc::OnUpdateTextColor(CCmdUI *pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(shape_onfocus_);
}

class CMFCDoc : public COleServerDoc
{
...
bool shape_onfocus_;
}

//edit control
#include <afxwin.h>
class CEditControl :
public CEdit
{
public:
CEditControl();
~CEditControl();
DECLARE_MESSAGE_MAP()
afx_msg void OnEnSetfocus();
};


void CEditControl::OnEnSetfocus()
{
//----- I want to update shape_onfocus_ here. -----

this->SetWindowTextA(_T("Hello world"));
}

Ответы [ 3 ]

1 голос
/ 12 марта 2019

Предполагая, что ваш CEditControl экземпляр является потомком какого-то CView, вы можете сделать это следующим образом:

void CEditControl::OnEnSetfocus()
{
    CView *view = static_cast<CView *>(GetParent());
    CMFCDoc *doc = static_cast<CMFCDoc *>(view->GetDocument());
    doc->shape_onfocus_ = true;
    ...
}
0 голосов
/ 13 марта 2019

Предполагая, что элемент управления редактирования является дочерним классом класса CView, лучше поместить обработчик OnUpdateUI() в класс представления, а не в документ.

Например, еслиview-class * * * * * * * * * * (диалог), вы можете просто написать:

void CMyView::OnUpdateTextColor(CCmdUI *pCmdUI)
{
    pCmdUI->Enable(GetFocus()==GetDlgItem(IDC_MYEDIT));
}

Этот фрагмент кода работает как для приложений SDI, так и для MDI.

Если класс представленияне CFormView -приведенный (поле редактирования было создано программно), приведенный выше код можно немного изменить, и вместо вызова GetDlgItem() вы должны перечислить список дочерних элементов представления (поищите в этом окне редактирования).

Если единственной причиной переопределения элемента управления редактирования было получение сообщений EN_SET/KILLFOCUS, извините, это не стоило усилий, так как вы могли просто захватить их в коде представления.Тогда карта сообщений представления будет содержать:

ON_EN_SETFOCUS(IDC_MYEDIT, &CMyView::OnEnSetfocusMyEdit)
ON_EN_KILLFOCUS(IDC_MYEDIT, &CMyView::OnEnKillfocusMyEdit)

и код класса представления:

void CMyView::OnEnSetfocusMyEdit()
{
    // TODO: Add your control notification handler code here
}


void CMyView::OnEnKillfocusMyEdit()
{
    // TODO: Add your control notification handler code here
}

Они генерируются мастером.Перейдите на вкладку Class View, выберите свой класс и затем перейдите на страницу Events;в поддереве Controls вы можете найти свой элемент управления и добавить обработчики для его событий.Но все это не нужно, поскольку вы можете просто использовать GetFocus()/GetDlgItem(), как предложено выше.

И, как сказали другие члены, вы можете получить доступ к классу документа из любого его представления, вызвав функцию GetDocument().

0 голосов
/ 12 марта 2019

Это CMFCDoc::OnUpdateTextColor(CCmdUI *pCmdUI)

или CEditControl::OnEnSetfocus() не вызывается?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...