FAQ1: 如果你用WTL7.5和VC6.0/ATL3.0,並且定義了_ATL_STATIC_REGISTRY。在編譯時間你會
得到提示“ambiguous symbol ATL”的錯誤。因為定義_ATL_STATIC_REGISTRY將使
atlbase.h檔案內包含statreg.h檔案。而statreg.h檔案內聲明了另一個ATL名字空間
造成衝突。要解決此問題可以把
#include <atlbase.h>
改為
#define ATL ATLFIX
#include <atlbase.h>
#undef ATL
namespace ATL = ::ATLFIX;
FAQ2: 如何讓一個模板類來處理某一類視窗訊息
例,class CACComboBox : public CWindowImpl<CACComboBox,CComboBox>
CACComboBox是一個組合框模板類,現在設計另一模板類專門處理組合框的WM_PAINT訊息
這樣做的好處有利於控制項的介面由類來組合,卸換。
步驟:
1、 聲明一模板類,必須派生自CmessageMap,可以由模板類參數來決定介面的效果
如:template <class T, COLORREF t_crFrameolor = RGB(172,168,153) , UINT t_uType = 1>
class CComboBoxFrameT : public CmessageMap
t_crFrameColor是組合框邊框顏色,t_utype是組合框皮膚的效果
2、 聲明BEGIN_MSG_MAP/ END_MSG_MAP()宏
3、 宏內添加MSG_WM_PAINT( OnPaint )宏處理WM_PAINT訊息
4、 聲明定義訊息處理函數:OnPaint
5、 視窗類別中派生項添加:public CComboBoxFrameT<CACComboBox>
6、 在視窗類別中添加CHAIN_MSG_MAP(CComboBoxFrameT<CACComboBox>)宏,包含CcomboBoxFrame
的訊息處理。
7、 CcomboBoxFrameT內中要使用視窗類別時:T* pT = static_cast<T*>(this);
FAQ3: 控制項如何使用訊息反射
步驟:
1、 在能收到通知訊息的視窗的訊息宏中添加REFLECT_NOTIFICATIONS(),視窗就會把沒處理的
的通知訊息反射給控制項。
2、 在控制項的訊息宏或訊息鏈中添加 REFLECTED_COMMAND_CODE_HANDLER_EX等列系宏,
該類宏還有REFLECTED_NOTIFY_HANDLER_EX,REFLECTED_NOTIFY_ID_HANDLER_EX,
REFLECTED_NOTIFY_CODE_HANDLER_EX,等多個宏,定義在atlcrack.h中