WEB开发网
开发学院软件开发VC ATL布幔之下的秘密(5) 阅读

ATL布幔之下的秘密(5)

 2006-07-22 22:54:48 来源:WEB开发网   
核心提示: 程序70. #include <windows.h>class ZWindow;ZWindow* g_pWnd = NULL;class ZWindow{public:HWND m_hWnd;ZWindow(HWND hWnd = 0) : m_hWnd(hWnd) { }in

程序70. #include <windows.h>
class ZWindow;
ZWindow* g_pWnd = NULL;
class ZWindow
{
public:
  HWND m_hWnd;
  ZWindow(HWND hWnd = 0) : m_hWnd(hWnd) { }
  inline void Attach(HWND hWnd)
  { m_hWnd = hWnd; }
  inline BOOL ShowWindow(int nCmdShow)
  { return ::ShowWindow(m_hWnd, nCmdShow); }
  inline BOOL UpdateWindow()
  { return ::UpdateWindow(m_hWnd); }
  inline HDC BeginPaint(LPPAINTSTRUCT ps)
  { return ::BeginPaint(m_hWnd, ps); }
  inline BOOL EndPaint(LPPAINTSTRUCT ps)
  { return ::EndPaint(m_hWnd, ps); }
  inline BOOL GetClientRect(LPRECT rect)
  { return ::GetClientRect(m_hWnd, rect); }
  BOOL Create(LPCTSTR szClassName, LPCTSTR szTitle, HINSTANCE hInstance,
        HWND hWndParent = 0, DWORD dwStyle = WS_OVERLAPPEDWINDOW,
        DWORD dwExStyle = 0, HMENU hMenu = 0)
  {
    m_hWnd = ::CreateWindowEx(dwExStyle, szClassName, szTitle, dwStyle,
                 CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,
                 CW_USEDEFAULT, hWndParent, hMenu, hInstance, NULL);
    return m_hWnd != NULL;
  }
  virtual LRESULT OnPaint(WPARAM wParam, LPARAM lParam)
  {
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect;
    hDC = BeginPaint(&ps);
    GetClientRect(&rect);
    ::DrawText(hDC, "Hello world", -1, &rect,
          DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    EndPaint(&ps);
    return 0;
  }
  virtual LRESULT OnCreate(WPARAM wParam, LPARAM lParam)
  {
    return 0;
  }
  static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam,
                  LPARAM lParam)
  {
    ZWindow* pThis = g_pWnd;
    switch (uMsg)
    {
    case WM_CREATE:
      pThis->OnCreate(wParam, lParam);
      break;
    case WM_PAINT:
      pThis->OnPaint(wParam, lParam);
      break;
    case WM_DESTROY:
      ::PostQuitMessage(0);
      break;
    }
    return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
  }
};
class ZDriveWindow : public ZWindow
{
public:
  LRESULT OnPaint(WPARAM wParam, LPARAM lParam)
  {
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect;
    hDC = BeginPaint(&ps);
    GetClientRect(&rect);
    SetBkMode(hDC, TRANSPARENT);
    DrawText(hDC, "Hello world From Drive", -1, &rect,
         DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    EndPaint(&ps);
    return 0;
  }
};
  
程序的输出是一个窗口中的一条“Hello world from Drive”消息。在我们使用派生类之前,可以说一切都是顺利的。当我们从ZWindow派生出多于一个类的时候,问题就会发生。这样,所有的消息就都会流向ZWindow最后继承的那个派生类。让我们看看以下的程序。

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:ATL 之下 秘密

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