WTL GUI编程 1 使用ATL

第一部分-Window Classes

Window Classes 和 DECLARE_WND_CLASS、DECLARE_WND_CLASSEX宏

主要内容:

使用DECLARE_WND_CLASS(WndClassName)

或者DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd)

来设置Window Classes

 细节:

DECLARE_WND_CLASS宏的定义:
#define DECLARE_WND_CLASS(WndClassName) /
static ATL::CWndClassInfo& GetWndClassInfo() /
{ /
 static ATL::CWndClassInfo wc = /
 { /
  { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, StartWindowProc, /
    0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName, NULL },
/
  NULL, NULL, IDC_ARROW, TRUE, 0, _T("") /
 }; /
 return wc; /
}

 

上面的蓝色部分在初始化wc 的成员m_wc

 CWndClassInfo 实际是这么个结构体:
struct _ATL_WNDCLASSINFOW
{
 WNDCLASSEXW m_wc;
 LPCWSTR m_lpszOrigName;
 WNDPROC pWndProc;
 LPCWSTR m_lpszCursorID;
 BOOL m_bSystemCursor;
 ATOM m_atom;
 WCHAR m_szAutoName[5+sizeof(void*)*CHAR_BIT];
 ATOM Register(WNDPROC* p)
 {
  return AtlWinModuleRegisterWndClassInfoW(&_AtlWinModule, &_AtlBaseModule, this, p);
 }

};

 


#define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd) /
static ATL::CWndClassInfo& GetWndClassInfo() /
{ /
 static ATL::CWndClassInfo wc = /
 { /
  { sizeof(WNDCLASSEX), style, StartWindowProc, /
    0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName, NULL }, /
  NULL, NULL, IDC_ARROW, TRUE, 0, _T("") /
 }; /
 return wc; /
}

第二部分-窗口过程

主要内容:

使用BEGIN_MSG_MAP(theClass)和END_MSG_MAP()来实现窗口过程

 

细节: 

#define BEGIN_MSG_MAP(theClass) /
public: /
 BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = 0) /
 { /
  BOOL bHandled = TRUE; /
  (hWnd); /
  (uMsg); /
  (wParam); /
  (lParam); /
  (lResult); /
  (bHandled); /
  switch(dwMsgMapID) /
  { /
  case 0:


#define END_MSG_MAP() /
   break; /
  default: /
   ATLTRACE(ATL::atlTraceWindowing, 0, _T("Invalid message map ID (%i)/n"), dwMsgMapID); /
   ATLASSERT(FALSE); /
   break; /
  } /
  return FALSE; /
 }

第三部分-Window Trait

template
class CWinTraits
{
public:
 static DWORD GetWndStyle(DWORD dwStyle)
 {
  return dwStyle == 0 ? t_dwStyle : dwStyle;
 }
 static DWORD GetWndExStyle(DWORD dwExStyle)
 {
  return dwExStyle == 0 ? t_dwExStyle : dwExStyle;
 }
};

ATL预定义的几个窗口特性:
typedef CWinTraits     CControlWinTraits;
typedef CWinTraits  CFrameWinTraits;
typedef CWinTraits CMDIChildWinTraits;

typedef CWinTraits<0, 0> CNullTraits;

 

你可能感兴趣的:(WTL GUI编程 1 使用ATL)