文章目录
1.四个接口
- 1.四个接口
- 2.作者答疑
在面向对象的世界里,接口规范了类实现的功能,WindowImplBase基类在本小节开始的时候,就已经知道需要实现四个接口,分别是INotifyUI、 IMessageFilterUI、 IDialogBuilderCallback和IQueryControlText四个接口。如下所示:
// Listener interface
class INotifyUI
{
public:
virtual void Notify(TNotifyUI& msg) = 0;
};
必须要实现这个消息通知函数。
// MessageFilter interface
class IMessageFilterUI
{
public:
virtual LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled) = 0;
};
必须要实现这个消息过滤函数。
class IDialogBuilderCallback
{
public:
virtual CControlUI* CreateControl(LPCTSTR pstrClass) = 0;
};
创建控件函数。
// 控件文字查询接口
class UILIB_API IQueryControlText
{
public:
virtual LPCTSTR QueryControlText(LPCTSTR lpstrId, LPCTSTR lpstrType) = 0;
};
查询文件接口。在C++里,接口的类的使用应该需要有一定的了解。接下来分析在WindowImplBase基类中相应的实现。首先INotifyUI这个接口在上一小节讲解CNotifyPump时,已经提到过,是消息分发的进入点。如下所示:
void WindowImplBase::Notify(TNotifyUI& msg)
{
if (msg.sType == _T("windowinit"))
{
OnPrepare();
return;
}
return CNotifyPump::NotifyPump(msg);
}
接着是消息过滤函数,如果大家对win32的效果流程有些了解,这个函数在消息循环消息处理之前被调用,如下所示:
LRESULT WindowImplBase::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, bool& /*bHandled*/)
{
if (uMsg == WM_KEYDOWN)
{
switch (wParam)
{
case VK_RETURN:
case VK_ESCAPE:
return ResponseDefaultKeyEvent(wParam);
default:
break;
}
}
return FALSE;
}
接下来是创建控件函数,如下所示:
CControlUI* WindowImplBase::CreateControl(LPCTSTR pstrClass)
{
return NULL;//没有什么操作
}
接下来是查询文本的实现,如下所示:
LPCTSTR WindowImplBase::QueryControlText(LPCTSTR lpstrId, LPCTSTR lpstrType)
{
return NULL;//没有什么操作
}
综上所述,接口最重要的还是前面两个接口,与消息传递有关。
2.作者答疑如有疑问,请留言。