MFC编辑控制消息处理访问文档对象



i创建一个新类扩展cedit以覆盖某些消息手柄。

我的最终目标是,当编辑控制焦点时,一些工具栏按钮可用。

我在文档中创建了一个布尔变量。然后将PCMDUI-> enable()设置为此bool。新的编辑控制类中的onfocus被覆盖。我很难从onfocus消息句柄中更新此Bool Vairbale。

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

假设您的 CEditControl实例是某种CView的孩子,您可以这样进行此操作:

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

假设编辑控制是CView衍生类的孩子,则最好将OnUpdateUI()处理程序放在视图类中,而不是文档。

例如,如果View -Class为CFormView衍生(对话框),则可以简单地写:

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)

和View-class代码:

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

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

这些是由向导生成的。转到"类视图"选项卡,选择您的类,然后转到"事件"页面;在控件子树中,您可以找到您的控件并为其事件添加处理程序。但是,所有这些都不需要,因为您只需使用上述建议的GetFocus()/GetDlgItem()

正如其他成员所说,您可以通过调用GetDocument()函数从其任何视图中访问文档类。

最新更新