WEB开发网
开发学院软件开发VC MFC程序员WTL指南(6)高级对话框用户界面类 阅读

MFC程序员WTL指南(6)高级对话框用户界面类

 2008-01-19 20:25:19 来源:WEB开发网   
核心提示:注意,消息映射链的主要部分处理WM_*消息,MFC程序员WTL指南(6)高级对话框用户界面类(2),而ATL部分处理反射的消息,OCM_*,消息会被传递给消息映射链中的其他响应者,SetMsgHandled()事实上是COwnerDraw类的成员函数,自画的通知消息就像WM_NOTIFY消息一样,你可以在父窗口处理它们

注意,消息映射链的主要部分处理WM_*消息,而ATL部分处理反射的消息,OCM_*。自画的通知消息就像WM_NOTIFY消息一样,你可以在父窗口处理它们,也可以将它们反射会控件,如果你使用前一种方法,消息被直接链入COwnerDraw:

class CSomeDlg : public COwnerDraw<CSomeDlg>, ...
{
  BEGIN_MSG_MAP(CSomeDlg)
   //...
   CHAIN_MSG_MAP(COwnerDraw<CSomeDlg>)
  END_MSG_MAP()
  void DrawItem ( LPDRAWITEMSTRUCT lpdis );
};

当然,如果你想要控件自己处理这些消息,你需要使用CHAIN_MSG_MAP_ALT宏将消息链入ALT_MSG_MAP(1)部分:

class CSomeButtonImpl : public COwnerDraw<CSomeButtonImpl>, ...
{
  BEGIN_MSG_MAP(CSomeButtonImpl)
   //...
   CHAIN_MSG_MAP_ALT(COwnerDraw<CSomeButtonImpl>, 1)
   DEFAULT_REFLECTION_HANDLER()
  END_MSG_MAP()
  void DrawItem ( LPDRAWITEMSTRUCT lpdis );
};

COwnerDraw类将对消息传递的参数展开,然后调用你的类中的实现函数。上面的例子中,我们自己的类实现DrawItem()函数,当有WM_DRAWITEM或OCM_DRAWITEM消息被链入COwnerDraw时,这个函数就会被调用。你可以重载的方法有:

void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
int CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct);
void DeleteItem(LPDELETEITEMSTRUCT lpDeleteItemStruct);

如果你不想处理某个消息,你可以调用SetMsgHandled(false),消息会被传递给消息映射链中的其他响应者。SetMsgHandled()事实上是COwnerDraw类的成员函数,但是它的作用和在BEGIN_MSG_MAP_EX()中使用SetMsgHandled()一样。

上一页  1 2 3 4 5 6 7  下一页

Tags:MFC 程序员 WTL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接