Introduction to Part V
之前看了一些 WTL Dialog和Control相关内容。
这章看一些更高级的UI特征: Owner draw 和 custom draw, 新WTL control, UI updating, dialog data validation.
Specialized Owner Draw and Custom Draw Classes
专用的Owner Draw 和 Custom Draw 类。
UI中这两个很常用, 接下来会逐一讲解。
COwnerDraw
OwnerDraw处理4个信息:
WM_MEASUREITEM,
WM_DRAWITEM,
WM_COMPAREITEM,
WM_DELETEITEM.
chain message to COwnerDraw, 并且调用用户自己重写的类。
你如何chain message依赖于你是否 reflecting messages(类自己是否处理自己的NOTIFY).
这里是COwnerDraw消息。
template <class T> class COwnerDraw{public: BEGIN_MSG_MAP(COwnerDraw<T>) MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem) MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem) MESSAGE_HANDLER(WM_COMPAREITEM, OnCompareItem) MESSAGE_HANDLER(WM_DELETEITEM, OnDeleteItem) ALT_MSG_MAP(1) MESSAGE_HANDLER(OCM_DRAWITEM, OnDrawItem) MESSAGE_HANDLER(OCM_MEASUREITEM, OnMeasureItem) MESSAGE_HANDLER(OCM_COMPAREITEM, OnCompareItem) MESSAGE_HANDLER(OCM_DELETEITEM, OnDeleteItem) END_MSG_MAP()};
1 注意这个消息MAP主要的部分是 处理 WM_*消息,
ATL_MSG_MAP(1)是处理 反映消息的 OCM_*消息。
2 Owner draw 的 notifications 像 WM_NOTYFY,
3 你可以在他们的父类中处理, 也可以反映回控件本身。
如果你打算传给父类, 他会直接传到COwnerDraw类处理.
// C++ class for a dialog that contains owner-drawn controlsclass CSomeDlg : public CDialogImpl<CSomeDlg>, public COwnerDraw<CSomeDlg>, ...{ BEGIN_MSG_MAP(CSomeDlg) //... CHAIN_MSG_MAP(COwnerDraw<CSomeDlg>) END_MSG_MAP() void DrawItem ( LPDRAWITEMSTRUCT lpdis );};
如果你打算传给control自己处理,你需要chain to ALT_MSG_MAP(1), 使用CHAIN_MSG_MAP_ATL
// C++ class that implements an owner-drawn buttonclass CMyButton : public CWindowImpl<CMyButton, CButton>, public COwnerDraw<CMyButton>, ...{ BEGIN_MSG_MAP(CMyButton) //... CHAIN_MSG_MAP_ALT(COwnerDraw<CMyButton>, 1) DEFAULT_REFLECTION_HANDLER() END_MSG_MAP() void DrawItem ( LPDRAWITEMSTRUCT lpdis );};
4个方法可以重写:
void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);int CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct);void DeleteItem(LPDELETEITEMSTRUCT lpDeleteItemStruct);
如果你不想重写,可以SetMsgHandle(false)然后消息会被向后传到下一个可能截获的地方,进行处理。
原文链接: https://www.cnblogs.com/oleeceo/archive/2011/03/28/1997977.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/22979
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!