Evan.zz
Evan.zz

Reputation: 165

MFC Edit control message handle access Document object

I create a new class extend CEdit to override some of the message handles.

My ultimate goal is when edit control is on focus, some of the toolbar buttons become available.

I created a bool variable in doc. then the pCmdUI->enable() set to this bool. The onfocus is overridden in new edit control class. I'm having trouble to update this bool vairbale from the onfocus message handle.

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"));
}

Upvotes: 1

Views: 416

Answers (2)

Constantine Georgiou
Constantine Georgiou

Reputation: 3401

Assuming the edit-control is a child of a CView-derived class, you should better put the OnUpdateUI() handler in the view class, not the document one.

For example, if the view-class is CFormView-derived (dialog), you could simply write:

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

This piece of code works for both SDI and MDI applications.

If the view class is not CFormView-derived (the edit-box was created programmatically), the code above could be modified slightly, and instead of calling GetDlgItem() you should enumerate the view's children list (search your edit-box there).

If the only reason to override the edit-control was to capture the EN_SET/KILLFOCUS messages, sorry this wasn't worth the effort, as you could simply capture these in the view's code. Then the view's message-map would contain:

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

and the view-class code:

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


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

These are generated by the wizard. Go to the Class View tab, select your class and then go to the Events page; in the Controls subtree you can find your control and add handlers for its events. But all this is not needed, as you can just use GetFocus()/GetDlgItem() as suggested above.

And as other members said, you can access the document class from any of its views by calling the GetDocument() function.

Upvotes: 0

Sid S
Sid S

Reputation: 6125

Assuming your CEditControl instance is a child of some sort of CView, you could go about it like this:

void CEditControl::OnEnSetfocus()
{
    CView *view = static_cast<CView *>(GetParent());
    CMFCDoc *doc = static_cast<CMFCDoc *>(view->GetDocument());
    doc->shape_onfocus_ = true;
    ...
}

Upvotes: 1

Related Questions