WTL(5)-Advanced Dialog UI Classes

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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午12:57
下一篇 2023年2月8日 上午12:58

相关推荐