//========================================================================
//TITLE:
// CWndBase更新至v0.1.6
//AUTHOR:
// norains
//DATE:
// Saturday 12-January-2008
//Environment:
// VS2005 + SDK-WINCE5.0-MIPSII
// EVC + SDK-WINCE5.0-MIPSII
//========================================================================
v0.1.0版本见:http://blog.csdn.net/norains/archive/2007/11/10/1878218.aspx
相对v0.1.0版本,有如下变动:
1.创建窗口时将WS_VISIBLE属性换成WS_TABSTOP,因为并不是每次创建的时候都需要显示
2.修正采用该类创建子窗口的bug
3.改进在非主线程中也可正常创建窗口.
关于第三点,只需要在调用Create()函数时,将bMsgThrdInside形参设置为TRUE即可.
/ /
// WndBase.h:interfacefortheCWndBaseclass.
//
// Version:
// 0.1.6
//
// Date:
// 2008.01.03
/ /
#pragma once
class CWndBase
{
public :
virtual BOOLShowWindow(BOOLbShow);
virtual BOOLCreate(HINSTANCEhInst,HWNDhWndParent, const TCHAR * pcszWndClass, const TCHAR * pcszWndName,BOOLbMsgThrdInside = FALSE);
CWndBase();
virtual ~ CWndBase();
protected :
virtual LRESULTWndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam);
virtual BOOLRegisterWnd(HINSTANCEhInst, const TCHAR * pcszWndClass);
virtual void OnDestroy(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam);
static LRESULTStaticWndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam);
HINSTANCEm_hInst;
HWNDm_hWnd;
HWNDm_hWndParent;
TCHAR * m_pszWndClass;
TCHAR * m_pszWndName;
private :
static DWORDCreateProc(PVOIDpArg);
BOOLCreateWnd( void );
BOOLm_bCreated;
BOOLm_bMsgThrdInside;
HANDLEm_hEventCreated;
};
/ /
// WndBase.cpp
//
/ /
#include " stdafx.h "
#include " WndBase.h "
/ /
// Construction/Destruction
/ /
CWndBase::CWndBase():
m_hInst(NULL),
m_hWnd(NULL),
m_hWndParent(NULL),
m_pszWndClass(NULL),
m_pszWndName(NULL),
m_bCreated(FALSE),
m_hEventCreated(NULL),
m_bMsgThrdInside(FALSE)
{
}
CWndBase:: ~ CWndBase()
{
if (m_pszWndClass != NULL)
{
delete[]m_pszWndClass;
m_pszWndClass = NULL;
}
if (m_pszWndName != NULL)
{
delete[]m_pszWndName;
m_pszWndName = NULL;
}
}
// ----------------------------------------------------------------------
// Description:
// Createthewindow
//
// Parameters:
// hInst:[in]Thehandleofinstanceoftheapplication
// hWndParent:[in]Theparentwindow
// pcszWndClass:[in]Theclassofthewindow
// pcszWndName:[in]Thenameofthewindows
// bMsgThrdInside:[in]Themessagethreadprocessisinsideornot
//
// ----------------------------------------------------------------------
BOOLCWndBase::Create(HINSTANCEhInst,HWNDhWndParent, const TCHAR * pcszWndClass, const TCHAR * pcszWndName,BOOLbMsgThrdInside)
{
m_hInst = hInst;
m_hWndParent = hWndParent;
m_bMsgThrdInside = bMsgThrdInside;
// Storethewindowclassname
if (m_pszWndClass != NULL)
{
delete[]m_pszWndClass;
m_pszWndClass = NULL;
}
int iLen = _tcslen(pcszWndClass);
m_pszWndClass = new TCHAR[iLen + 1 ];
if (m_pszWndClass == NULL)
{
return FALSE;
}
_tcscpy(m_pszWndClass,pcszWndClass);
// Storethewindowname
if (m_pszWndName != NULL)
{
delete[]m_pszWndName;
m_pszWndName = NULL;
}
iLen = _tcslen(pcszWndName);
m_pszWndName = new TCHAR[iLen + 1 ];
if (m_pszWndName == NULL)
{
return FALSE;
}
_tcscpy(m_pszWndName,pcszWndName);
// Createthewindow
if (bMsgThrdInside == TRUE)
{
HANDLEhdThrd = CreateThread(NULL, 0 ,CreateProc, this , 0 ,NULL);
if (hdThrd == NULL)
{
return FALSE;
}
else
{
CloseHandle(hdThrd);
// Createtheeventandwait
m_hEventCreated = CreateEvent(NULL,FALSE,FALSE,NULL);
if (m_hEventCreated != NULL)
{
WaitForSingleObject(m_hEventCreated,INFINITE);
CloseHandle(m_hEventCreated);
m_hEventCreated = NULL;
return m_bCreated;
}
else
{
return FALSE;
}
}
}
else
{
return CreateWnd();
}
}
// ----------------------------------------------------------------------
// Description:
// Registerwindow
//
// ----------------------------------------------------------------------
BOOLCWndBase::RegisterWnd(HINSTANCEhInst, const TCHAR * pcszWndClass)
{
WNDCLASSwc = { 0 };
wc.style = 0 ;
wc.lpfnWndProc = (WNDPROC)CWndBase::StaticWndProc;
wc.cbClsExtra = 0 ;
wc.cbWndExtra = 0 ;
wc.hInstance = m_hInst;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_WINDOW);
wc.lpszMenuName = NULL;
wc.lpszClassName = pcszWndClass;
return RegisterClass( & wc);
}
// ----------------------------------------------------------------------
// Description:
// StaticWndProcwrapperandactualWndProc
//
// ----------------------------------------------------------------------
LRESULTCWndBase::StaticWndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam)
{
CWndBase * pObject = (CWndBase * )GetWindowLong(hWnd,GWL_USERDATA);
if (pObject)
{
return pObject -> WndProc(hWnd,wMsg,wParam,lParam);
}
else
{
return DefWindowProc(hWnd,wMsg,wParam,lParam);
}
}
// ----------------------------------------------------------------------
// Description:
// ActualWndProc
//
// ----------------------------------------------------------------------
LRESULTCWndBase::WndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam)
{
switch (wMsg)
{
case WM_DESTROY:
OnDestroy(hWnd,wMsg,wParam,lParam);
break ;
}
return DefWindowProc(hWnd,wMsg,wParam,lParam);
}
// ----------------------------------------------------------------------
// Description:
// Showthewindow
//
// ----------------------------------------------------------------------
BOOLCWndBase::ShowWindow(BOOLbShow)
{
if (m_hWnd == NULL)
{
return FALSE;
}
if (bShow == TRUE)
{
SetForegroundWindow(m_hWnd);
SetWindowPos(m_hWnd,HWND_TOP, 0 , 0 , 0 , 0 ,SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
}
else
{
::ShowWindow(m_hWnd,SW_HIDE);
}
return TRUE;
}
// ----------------------------------------------------------------------
// Description:
// Theprocessthreadisforcreatingthewindow
//
// ----------------------------------------------------------------------
DWORDCWndBase::CreateProc(PVOIDpArg)
{
// Gettheobjectinstance
CWndBase * pObject = (CWndBase * )pArg;
// Createthewindow
pObject -> m_bCreated = pObject -> CreateWnd();
// Settheevent
if (pObject -> m_hEventCreated != NULL)
{
SetEvent(pObject -> m_hEventCreated);
}
if (pObject -> m_bCreated == FALSE)
{
// Failedincreatingthewindow,soreturnandneedn'tthemessageloop
return 0x01 ;
}
// Themessageloop
MSGmsg;
while (GetMessage( & msg,NULL, 0 , 0 ))
{
TranslateMessage( & msg);
DispatchMessage( & msg);
}
return 0 ;
}
// ----------------------------------------------------------------------
// Description:
// Createthewindow
//
// ----------------------------------------------------------------------
BOOLCWndBase::CreateWnd( void )
{
if (RegisterWnd(m_hInst,m_pszWndClass) == FALSE)
{
return FALSE;
}
RECTrcArea = { 0 };
SystemParametersInfo(SPI_GETWORKAREA, 0 , & rcArea, 0 );
m_hWnd = CreateWindowEx( 0 ,
m_pszWndClass,
m_pszWndName,
WS_TABSTOP,
rcArea.left,
rcArea.top,
rcArea.right - rcArea.left,
rcArea.bottom - rcArea.top,
m_hWndParent,
NULL,
m_hInst,
0 );
if (IsWindow(m_hWnd) == FALSE)
{
return FALSE;
}
// Ifthewindowiscreatedsuccessfully,storethisobjectsothe
// staticwrappercanpasscallstotherealWndProc.
SetWindowLong(m_hWnd,GWL_USERDATA,(DWORD) this );
return TRUE;
}
// ----------------------------------------------------------------------
// Description:
// OnMessageWM_DESTROY
//
// ----------------------------------------------------------------------
void CWndBase::OnDestroy(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam)
{
if (m_bMsgThrdInside == TRUE)
{
// Exittheinsidethread
PostQuitMessage( 0x00 );
}
}
//TITLE:
// CWndBase更新至v0.1.6
//AUTHOR:
// norains
//DATE:
// Saturday 12-January-2008
//Environment:
// VS2005 + SDK-WINCE5.0-MIPSII
// EVC + SDK-WINCE5.0-MIPSII
//========================================================================
v0.1.0版本见:http://blog.csdn.net/norains/archive/2007/11/10/1878218.aspx
相对v0.1.0版本,有如下变动:
1.创建窗口时将WS_VISIBLE属性换成WS_TABSTOP,因为并不是每次创建的时候都需要显示
2.修正采用该类创建子窗口的bug
3.改进在非主线程中也可正常创建窗口.
关于第三点,只需要在调用Create()函数时,将bMsgThrdInside形参设置为TRUE即可.
/ /
// WndBase.h:interfacefortheCWndBaseclass.
//
// Version:
// 0.1.6
//
// Date:
// 2008.01.03
/ /
#pragma once
class CWndBase
{
public :
virtual BOOLShowWindow(BOOLbShow);
virtual BOOLCreate(HINSTANCEhInst,HWNDhWndParent, const TCHAR * pcszWndClass, const TCHAR * pcszWndName,BOOLbMsgThrdInside = FALSE);
CWndBase();
virtual ~ CWndBase();
protected :
virtual LRESULTWndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam);
virtual BOOLRegisterWnd(HINSTANCEhInst, const TCHAR * pcszWndClass);
virtual void OnDestroy(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam);
static LRESULTStaticWndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam);
HINSTANCEm_hInst;
HWNDm_hWnd;
HWNDm_hWndParent;
TCHAR * m_pszWndClass;
TCHAR * m_pszWndName;
private :
static DWORDCreateProc(PVOIDpArg);
BOOLCreateWnd( void );
BOOLm_bCreated;
BOOLm_bMsgThrdInside;
HANDLEm_hEventCreated;
};
/ /
// WndBase.cpp
//
/ /
#include " stdafx.h "
#include " WndBase.h "
/ /
// Construction/Destruction
/ /
CWndBase::CWndBase():
m_hInst(NULL),
m_hWnd(NULL),
m_hWndParent(NULL),
m_pszWndClass(NULL),
m_pszWndName(NULL),
m_bCreated(FALSE),
m_hEventCreated(NULL),
m_bMsgThrdInside(FALSE)
{
}
CWndBase:: ~ CWndBase()
{
if (m_pszWndClass != NULL)
{
delete[]m_pszWndClass;
m_pszWndClass = NULL;
}
if (m_pszWndName != NULL)
{
delete[]m_pszWndName;
m_pszWndName = NULL;
}
}
// ----------------------------------------------------------------------
// Description:
// Createthewindow
//
// Parameters:
// hInst:[in]Thehandleofinstanceoftheapplication
// hWndParent:[in]Theparentwindow
// pcszWndClass:[in]Theclassofthewindow
// pcszWndName:[in]Thenameofthewindows
// bMsgThrdInside:[in]Themessagethreadprocessisinsideornot
//
// ----------------------------------------------------------------------
BOOLCWndBase::Create(HINSTANCEhInst,HWNDhWndParent, const TCHAR * pcszWndClass, const TCHAR * pcszWndName,BOOLbMsgThrdInside)
{
m_hInst = hInst;
m_hWndParent = hWndParent;
m_bMsgThrdInside = bMsgThrdInside;
// Storethewindowclassname
if (m_pszWndClass != NULL)
{
delete[]m_pszWndClass;
m_pszWndClass = NULL;
}
int iLen = _tcslen(pcszWndClass);
m_pszWndClass = new TCHAR[iLen + 1 ];
if (m_pszWndClass == NULL)
{
return FALSE;
}
_tcscpy(m_pszWndClass,pcszWndClass);
// Storethewindowname
if (m_pszWndName != NULL)
{
delete[]m_pszWndName;
m_pszWndName = NULL;
}
iLen = _tcslen(pcszWndName);
m_pszWndName = new TCHAR[iLen + 1 ];
if (m_pszWndName == NULL)
{
return FALSE;
}
_tcscpy(m_pszWndName,pcszWndName);
// Createthewindow
if (bMsgThrdInside == TRUE)
{
HANDLEhdThrd = CreateThread(NULL, 0 ,CreateProc, this , 0 ,NULL);
if (hdThrd == NULL)
{
return FALSE;
}
else
{
CloseHandle(hdThrd);
// Createtheeventandwait
m_hEventCreated = CreateEvent(NULL,FALSE,FALSE,NULL);
if (m_hEventCreated != NULL)
{
WaitForSingleObject(m_hEventCreated,INFINITE);
CloseHandle(m_hEventCreated);
m_hEventCreated = NULL;
return m_bCreated;
}
else
{
return FALSE;
}
}
}
else
{
return CreateWnd();
}
}
// ----------------------------------------------------------------------
// Description:
// Registerwindow
//
// ----------------------------------------------------------------------
BOOLCWndBase::RegisterWnd(HINSTANCEhInst, const TCHAR * pcszWndClass)
{
WNDCLASSwc = { 0 };
wc.style = 0 ;
wc.lpfnWndProc = (WNDPROC)CWndBase::StaticWndProc;
wc.cbClsExtra = 0 ;
wc.cbWndExtra = 0 ;
wc.hInstance = m_hInst;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_WINDOW);
wc.lpszMenuName = NULL;
wc.lpszClassName = pcszWndClass;
return RegisterClass( & wc);
}
// ----------------------------------------------------------------------
// Description:
// StaticWndProcwrapperandactualWndProc
//
// ----------------------------------------------------------------------
LRESULTCWndBase::StaticWndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam)
{
CWndBase * pObject = (CWndBase * )GetWindowLong(hWnd,GWL_USERDATA);
if (pObject)
{
return pObject -> WndProc(hWnd,wMsg,wParam,lParam);
}
else
{
return DefWindowProc(hWnd,wMsg,wParam,lParam);
}
}
// ----------------------------------------------------------------------
// Description:
// ActualWndProc
//
// ----------------------------------------------------------------------
LRESULTCWndBase::WndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam)
{
switch (wMsg)
{
case WM_DESTROY:
OnDestroy(hWnd,wMsg,wParam,lParam);
break ;
}
return DefWindowProc(hWnd,wMsg,wParam,lParam);
}
// ----------------------------------------------------------------------
// Description:
// Showthewindow
//
// ----------------------------------------------------------------------
BOOLCWndBase::ShowWindow(BOOLbShow)
{
if (m_hWnd == NULL)
{
return FALSE;
}
if (bShow == TRUE)
{
SetForegroundWindow(m_hWnd);
SetWindowPos(m_hWnd,HWND_TOP, 0 , 0 , 0 , 0 ,SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
}
else
{
::ShowWindow(m_hWnd,SW_HIDE);
}
return TRUE;
}
// ----------------------------------------------------------------------
// Description:
// Theprocessthreadisforcreatingthewindow
//
// ----------------------------------------------------------------------
DWORDCWndBase::CreateProc(PVOIDpArg)
{
// Gettheobjectinstance
CWndBase * pObject = (CWndBase * )pArg;
// Createthewindow
pObject -> m_bCreated = pObject -> CreateWnd();
// Settheevent
if (pObject -> m_hEventCreated != NULL)
{
SetEvent(pObject -> m_hEventCreated);
}
if (pObject -> m_bCreated == FALSE)
{
// Failedincreatingthewindow,soreturnandneedn'tthemessageloop
return 0x01 ;
}
// Themessageloop
MSGmsg;
while (GetMessage( & msg,NULL, 0 , 0 ))
{
TranslateMessage( & msg);
DispatchMessage( & msg);
}
return 0 ;
}
// ----------------------------------------------------------------------
// Description:
// Createthewindow
//
// ----------------------------------------------------------------------
BOOLCWndBase::CreateWnd( void )
{
if (RegisterWnd(m_hInst,m_pszWndClass) == FALSE)
{
return FALSE;
}
RECTrcArea = { 0 };
SystemParametersInfo(SPI_GETWORKAREA, 0 , & rcArea, 0 );
m_hWnd = CreateWindowEx( 0 ,
m_pszWndClass,
m_pszWndName,
WS_TABSTOP,
rcArea.left,
rcArea.top,
rcArea.right - rcArea.left,
rcArea.bottom - rcArea.top,
m_hWndParent,
NULL,
m_hInst,
0 );
if (IsWindow(m_hWnd) == FALSE)
{
return FALSE;
}
// Ifthewindowiscreatedsuccessfully,storethisobjectsothe
// staticwrappercanpasscallstotherealWndProc.
SetWindowLong(m_hWnd,GWL_USERDATA,(DWORD) this );
return TRUE;
}
// ----------------------------------------------------------------------
// Description:
// OnMessageWM_DESTROY
//
// ----------------------------------------------------------------------
void CWndBase::OnDestroy(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam)
{
if (m_bMsgThrdInside == TRUE)
{
// Exittheinsidethread
PostQuitMessage( 0x00 );
}
}