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个信息:<atlframe.h>

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 controls

class 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 button

class 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)然后消息会被向后传到下一个可能截获的地方,进行处理。

posted on 2011-03-28 18:13  oleeceo  阅读(599)  评论(0)    收藏  举报

导航