CWndBase更新至v0.1.6

//========================================================================
//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 );
}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值