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

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

 2006-07-22 22:03:25 来源:WEB开发网   
核心提示: class CSomeDlg : public COwnerDraw<CSomeDlg>, ...{BEGIN_MSG_MAP(CSomeDlg)//...CHAIN_MSG_MAP(COwnerDraw<CSomeDlg>)END_MSG_MAP()void Dr
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()一样。

对于ControlMania2,它从ControlMania1中的树控件开始,添加了自画按钮处理反射的WM_DRAWITEM消息,下面是资源编辑器中的新按钮:

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

Tags:MFC 程序员 WTL

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