//========================================================================
//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.youkuaiyun.com/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
//////////////////////////////////////////////////////////////////////
#pragmaonce
classCWndBase
{
public:
virtualBOOLShowWindow(BOOLbShow);
virtualBOOLCreate(HINSTANCEhInst,HWNDhWndParent,constTCHAR*pcszWndClass,constTCHAR*pcszWndName,BOOLbMsgThrdInside=FALSE);
CWndBase();
virtual~CWndBase();
protected:
virtualLRESULTWndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam);
virtualBOOLRegisterWnd(HINSTANCEhInst,constTCHAR*pcszWndClass);
virtualvoidOnDestroy(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam);
staticLRESULTStaticWndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam);
HINSTANCEm_hInst;
HWNDm_hWnd;
HWNDm_hWndParent;
TCHAR*m_pszWndClass;
TCHAR*m_pszWndName;
private:
staticDWORDCreateProc(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,constTCHAR*pcszWndClass,constTCHAR*pcszWndName,BOOLbMsgThrdInside)
{
m_hInst=hInst;
m_hWndParent=hWndParent;
m_bMsgThrdInside=bMsgThrdInside;
//Storethewindowclassname
if(m_pszWndClass!=NULL)
{
delete[]m_pszWndClass;
m_pszWndClass=NULL;
}
intiLen=_tcslen(pcszWndClass);
m_pszWndClass=newTCHAR[iLen+1];
if(m_pszWndClass==NULL)
{
returnFALSE;
}
_tcscpy(m_pszWndClass,pcszWndClass);
//Storethewindowname
if(m_pszWndName!=NULL)
{
delete[]m_pszWndName;
m_pszWndName=NULL;
}
iLen=_tcslen(pcszWndName);
m_pszWndName=newTCHAR[iLen+1];
if(m_pszWndName==NULL)
{
returnFALSE;
}
_tcscpy(m_pszWndName,pcszWndName);
//Createthewindow
if(bMsgThrdInside==TRUE)
{
HANDLEhdThrd=CreateThread(NULL,0,CreateProc,this,0,NULL);
if(hdThrd==NULL)
{
returnFALSE;
}
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;
returnm_bCreated;
}
else
{
returnFALSE;
}
}
}
else
{
returnCreateWnd();
}
}
//----------------------------------------------------------------------
//Description:
//Registerwindow
//
//----------------------------------------------------------------------
BOOLCWndBase::RegisterWnd(HINSTANCEhInst,constTCHAR*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;
returnRegisterClass(&wc);
}
//----------------------------------------------------------------------
//Description:
//StaticWndProcwrapperandactualWndProc
//
//----------------------------------------------------------------------
LRESULTCWndBase::StaticWndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam)
{
CWndBase*pObject=(CWndBase*)GetWindowLong(hWnd,GWL_USERDATA);
if(pObject)
{
returnpObject->WndProc(hWnd,wMsg,wParam,lParam);
}
else
{
returnDefWindowProc(hWnd,wMsg,wParam,lParam);
}
}
//----------------------------------------------------------------------
//Description:
//ActualWndProc
//
//----------------------------------------------------------------------
LRESULTCWndBase::WndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam)
{
switch(wMsg)
{
caseWM_DESTROY:
OnDestroy(hWnd,wMsg,wParam,lParam);
break;
}
returnDefWindowProc(hWnd,wMsg,wParam,lParam);
}
//----------------------------------------------------------------------
//Description:
//Showthewindow
//
//----------------------------------------------------------------------
BOOLCWndBase::ShowWindow(BOOLbShow)
{
if(m_hWnd==NULL)
{
returnFALSE;
}
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);
}
returnTRUE;
}
//----------------------------------------------------------------------
//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
return0x01;
}
//Themessageloop
MSGmsg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return0;
}
//----------------------------------------------------------------------
//Description:
//Createthewindow
//
//----------------------------------------------------------------------
BOOLCWndBase::CreateWnd(void)
{
if(RegisterWnd(m_hInst,m_pszWndClass)==FALSE)
{
returnFALSE;
}
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)
{
returnFALSE;
}
//Ifthewindowiscreatedsuccessfully,storethisobjectsothe
//staticwrappercanpasscallstotherealWndProc.
SetWindowLong(m_hWnd,GWL_USERDATA,(DWORD)this);
returnTRUE;
}
//----------------------------------------------------------------------
//Description:
//OnMessageWM_DESTROY
//
//----------------------------------------------------------------------
voidCWndBase::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.youkuaiyun.com/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
//////////////////////////////////////////////////////////////////////
#pragmaonce
classCWndBase
{
public:
virtualBOOLShowWindow(BOOLbShow);
virtualBOOLCreate(HINSTANCEhInst,HWNDhWndParent,constTCHAR*pcszWndClass,constTCHAR*pcszWndName,BOOLbMsgThrdInside=FALSE);
CWndBase();
virtual~CWndBase();
protected:
virtualLRESULTWndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam);
virtualBOOLRegisterWnd(HINSTANCEhInst,constTCHAR*pcszWndClass);
virtualvoidOnDestroy(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam);
staticLRESULTStaticWndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam);
HINSTANCEm_hInst;
HWNDm_hWnd;
HWNDm_hWndParent;
TCHAR*m_pszWndClass;
TCHAR*m_pszWndName;
private:
staticDWORDCreateProc(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,constTCHAR*pcszWndClass,constTCHAR*pcszWndName,BOOLbMsgThrdInside)
{
m_hInst=hInst;
m_hWndParent=hWndParent;
m_bMsgThrdInside=bMsgThrdInside;
//Storethewindowclassname
if(m_pszWndClass!=NULL)
{
delete[]m_pszWndClass;
m_pszWndClass=NULL;
}
intiLen=_tcslen(pcszWndClass);
m_pszWndClass=newTCHAR[iLen+1];
if(m_pszWndClass==NULL)
{
returnFALSE;
}
_tcscpy(m_pszWndClass,pcszWndClass);
//Storethewindowname
if(m_pszWndName!=NULL)
{
delete[]m_pszWndName;
m_pszWndName=NULL;
}
iLen=_tcslen(pcszWndName);
m_pszWndName=newTCHAR[iLen+1];
if(m_pszWndName==NULL)
{
returnFALSE;
}
_tcscpy(m_pszWndName,pcszWndName);
//Createthewindow
if(bMsgThrdInside==TRUE)
{
HANDLEhdThrd=CreateThread(NULL,0,CreateProc,this,0,NULL);
if(hdThrd==NULL)
{
returnFALSE;
}
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;
returnm_bCreated;
}
else
{
returnFALSE;
}
}
}
else
{
returnCreateWnd();
}
}
//----------------------------------------------------------------------
//Description:
//Registerwindow
//
//----------------------------------------------------------------------
BOOLCWndBase::RegisterWnd(HINSTANCEhInst,constTCHAR*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;
returnRegisterClass(&wc);
}
//----------------------------------------------------------------------
//Description:
//StaticWndProcwrapperandactualWndProc
//
//----------------------------------------------------------------------
LRESULTCWndBase::StaticWndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam)
{
CWndBase*pObject=(CWndBase*)GetWindowLong(hWnd,GWL_USERDATA);
if(pObject)
{
returnpObject->WndProc(hWnd,wMsg,wParam,lParam);
}
else
{
returnDefWindowProc(hWnd,wMsg,wParam,lParam);
}
}
//----------------------------------------------------------------------
//Description:
//ActualWndProc
//
//----------------------------------------------------------------------
LRESULTCWndBase::WndProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam)
{
switch(wMsg)
{
caseWM_DESTROY:
OnDestroy(hWnd,wMsg,wParam,lParam);
break;
}
returnDefWindowProc(hWnd,wMsg,wParam,lParam);
}
//----------------------------------------------------------------------
//Description:
//Showthewindow
//
//----------------------------------------------------------------------
BOOLCWndBase::ShowWindow(BOOLbShow)
{
if(m_hWnd==NULL)
{
returnFALSE;
}
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);
}
returnTRUE;
}
//----------------------------------------------------------------------
//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
return0x01;
}
//Themessageloop
MSGmsg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return0;
}
//----------------------------------------------------------------------
//Description:
//Createthewindow
//
//----------------------------------------------------------------------
BOOLCWndBase::CreateWnd(void)
{
if(RegisterWnd(m_hInst,m_pszWndClass)==FALSE)
{
returnFALSE;
}
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)
{
returnFALSE;
}
//Ifthewindowiscreatedsuccessfully,storethisobjectsothe
//staticwrappercanpasscallstotherealWndProc.
SetWindowLong(m_hWnd,GWL_USERDATA,(DWORD)this);
returnTRUE;
}
//----------------------------------------------------------------------
//Description:
//OnMessageWM_DESTROY
//
//----------------------------------------------------------------------
voidCWndBase::OnDestroy(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam)
{
if(m_bMsgThrdInside==TRUE)
{
//Exittheinsidethread
PostQuitMessage(0x00);
}
}
CWndBase窗口类更新
本文介绍了CWndBase窗口类的v0.1.6版本更新,包括更改创建窗口时的WS_VISIBLE属性为WS_TABSTOP,修复子窗口创建的bug,并改进了在非主线程中的窗口创建方式。
214

被折叠的 条评论
为什么被折叠?



