// 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);
}
雖然說明定為 Windows 的 windos 但平常作業時, 是拿來做訊息派送, 轉到 CuApp 裡. 或是處理控制項!
回覆刪除