2010年1月12日 星期二

CuWnd - is distinct from a Windows window

// is distinct from a Windows window

//
class CuMainWnd : public CuWnd {};

//
CuWnd ListCtrlWnd;
ListCtrlWnd.Create(WC_LISTVIEW , TEXT(""), dwStyle, rect, hParentWnd, nID);

CuWnd EditWnd;
EditWnd.CreateEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), dwStyle, rect, hParentWnd, nID);
// CuWnd.h

class CuWnd
{
private:
    HWND m_hWnd;

private:

    //////////////////////////////////////////////////////////////////////
    // 函式名稱: WndProc
    // 函式說明: Create時預設的訊息回圈 會將訊息派送到 OnMsg裡
    //////////////////////////////////////////////////////////////////////
    static LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);

public:
    // 建構 解構
    CuWnd(void);
    virtual ~CuWnd(void);

protected:

    //////////////////////////////////////////////////////////////////////
    // 函式名稱: OnMsg
    // 函式說明: 繼承這個函式處理windows訊息
    //////////////////////////////////////////////////////////////////////
    virtual LRESULT OnMsg(MSG &msg);

public:

    virtual BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName,
        DWORD dwStyle,  const CuRect &rect, 
        HWND hParentWnd = NULL, UINT nID = NULL );

    virtual BOOL CreateEx( DWORD dwExStyle, LPCTSTR lpszClassName,
        LPCTSTR lpszWindowName, DWORD dwStyle, const CuRect& rect,
        HWND hParentWnd = NULL, UINT nID = NULL);

    ATOM WndRegisterClassEx(LPCTSTR szWindowClass);


    // inline 函式 實作碼在下方
    HWND GetSafeHwnd( ) const;
    BOOL ShowWindow(int nCmdShow);
    BOOL UpdateWindow();
    BOOL DestroyWindow();

    operator HWND() const
    {
        return GetSafeHwnd();
    }

public:
    // 訊息處理函式
    void OnDestroy();

};

inline HWND CuWnd::GetSafeHwnd() const
{ return (HWND)(this == NULL ? NULL : m_hWnd) ;}

inline BOOL CuWnd::ShowWindow(int nCmdShow)
{ return ::ShowWindow( m_hWnd, nCmdShow); }

inline BOOL CuWnd::UpdateWindow()
{ return ::UpdateWindow(m_hWnd); }

inline BOOL CuWnd::DestroyWindow()
{ 
 BOOL bResult = ::DestroyWindow(m_hWnd); 
 m_hWnd = NULL;
 return bResult;
}



// CuWnd.cpp


CuWnd::CuWnd(void)
:m_hWnd(NULL)
{

}

CuWnd::~CuWnd(void)
{
    this->DestroyWindow();
}


//////////////////////////////////////////////////////////////////////
// 函式名稱: OnMsg
// 函式說明: 預設訊息處理
//////////////////////////////////////////////////////////////////////
LRESULT CuWnd::OnMsg(MSG &msg)
{
    return 0;
}

void CuWnd::OnDestroy()
{
    PostQuitMessage(0);
}

LRESULT CALLBACK CuWnd::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static MSG msg;

    msg.hwnd = hWnd;
    msg.message = message;
    msg.wParam = wParam;
    msg.lParam = lParam;

    static CuWnd *pWnd = NULL;
    if( message == WM_CREATE )
    {
    
        CREATESTRUCT *pct = (LPCREATESTRUCT)lParam;
        ::SetWindowLong( hWnd , GWL_USERDATA, (LONG)pct->lpCreateParams );
        
    }


    pWnd = (CuWnd *)::GetWindowLong(hWnd, GWL_USERDATA);
    if( pWnd && pWnd->OnMsg(msg) )
        return 0;
    else
        return ::DefWindowProc(hWnd, message, wParam, lParam);
    


}

BOOL CuWnd::Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName,
                    DWORD dwStyle, const CuRect &rect,
                    HWND hParentWnd /* = NULL */, UINT nID /* = NULL*/ )
{


    m_hWnd = ::CreateWindow(lpszClassName, lpszWindowName, dwStyle,
        rect.left, rect.top, rect.Width(), rect.Height(), 
        hParentWnd, (HMENU)nID, GetModuleHandle(NULL), (LPVOID) this);

    Assert( m_hWnd != NULL, L"CreateWindow Error");
    DWORD dwError = GetLastError();

    return (BOOL) (m_hWnd == NULL ? NULL : m_hWnd);

}

BOOL CuWnd::CreateEx( DWORD dwExStyle, LPCTSTR lpszClassName,
                      LPCTSTR lpszWindowName, DWORD dwStyle, const CuRect& rect,
                      HWND hParentWnd  /* = NULL */, UINT nID /* = NULL*/)
{

    m_hWnd = ::CreateWindowEx( dwExStyle, lpszClassName, 
        lpszWindowName, dwStyle, 
        rect.left, rect.top, rect.Width(), rect.Height(),
        hParentWnd, (HMENU)nID, GetModuleHandle(NULL), (LPVOID) this);

    Assert( m_hWnd != NULL, L"CreateWindow Error");
    DWORD dwError = GetLastError();

    return (BOOL) (m_hWnd == NULL ? NULL : m_hWnd);
}


ATOM CuWnd::WndRegisterClassEx(LPCTSTR szWindowClass)
{

    WNDCLASS    wc;
    
    wc.style            = CS_HREDRAW | CS_VREDRAW;

    wc.lpfnWndProc      = (WNDPROC) WndProc;
    wc.cbClsExtra       = 0;
    wc.cbWndExtra       = 0;
    wc.hInstance        = GetModuleHandle(NULL);
    wc.hIcon            = 0;
    wc.hCursor          = 0;
    wc.hbrBackground    = 0;
    wc.lpszMenuName     = 0;
    wc.lpszClassName    = szWindowClass;
    
    return RegisterClass(&wc);


}

1 則留言:

  1. 雖然說明定為 Windows 的 windos 但平常作業時, 是拿來做訊息派送, 轉到 CuApp 裡. 或是處理控制項!

    回覆刪除