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