www.pudn.com > WinGOS.rar > Desktop.cpp


#include "gos.h" 
#include "desktop.h" 
 
//Windows2000风格 
static const COLORREF m_aWin2KColor[]= 
{ 
	RGB(66,65,66),		//3D深度阴影 
	RGB(132,130,132),	//3D阴影 
	RGB(214,211,206),	//3D,对话框,按钮 
	RGB(214,211,206),	//3D高亮 
	RGB(255,255,255),	//3D超高亮 
	RGB(255,255,255),	//窗口背景 
	RGB(32,64,128),		//活动标题背景 
	RGB(131,131,131),	//非活动标题背景 
	RGB(249,248,247),	//菜单背景 
	RGB(255,255,225),	//提示背景 
	RGB(10,26,106),		//高亮/选中背景 
	RGB(182,189,210),	//选中的菜单项背景 
	RGB(0,0,0),			//窗口文本 
	RGB(255,255,255),	//标题文字 
	RGB(212,208,200),	//非活动标题文字 
	RGB(0,0,0),			//菜单文字 
	RGB(0,0,0),			//提示文本 
	RGB(255,255,255),	//高亮/选中文字 
	RGB(0,0,0),			//按钮文字 
	RGB(132,130,132),	//灰色文字 
	RGB(0,0,225),		//热点文本 
}; 
 
 
BOOL CDesktop::Create(CThread* pThread,CDisplay* pDisplay,CDrvMouse* pMouse,CDrvKeyboard* pKeyboard) 
{ 
	CRect& r=m_rclWnd; 
 
	m_pMouseWnd=NULL; 
	m_pDisplay=pDisplay; 
	m_nStyle=WS_CLIPSIBLINGS|WS_OWNERDC|WS_PARENT; 
	m_pParent=NULL; 
	m_pChild=NULL; 
	m_pNext=m_pPrev=this; 
	m_pThread=pThread; 
	m_aSysColor=(PCOLORREF)m_aWin2KColor; 
	r.SetRect(CPoint(0,0),pDisplay->GetBitmap().GetSize()); 
	if(r.right<0) 
		r.right=-r.right; 
	if(r.bottom<0) 
		r.bottom=-r.bottom; 
	m_rclClient=r; 
	m_dcOwnDC.SelectObject(&pDisplay->GetBitmap()); 
	m_dcOwnDC.SetOrg(r.TopLeft()); 
	Invalidate(r); 
	return TRUE; 
} 
 
 
LRESULT CDesktop::MsgProc(UINT message, WPARAM wParam, LPARAM lParam) 
{ 
	switch(message) 
	{ 
	case msgGetMQThread: 
		wParam=LRESULT(m_pThread); 
		break; 
	case WM_ERASEBKGND: 
		OnEraseBkgnd(PDC(wParam)); 
		break; 
	case WM_GETOWNDC: 
		wParam=LRESULT(&m_dcOwnDC); 
		break; 
	case WM_SETPAINTCLIP: 
		m_rclPaint=LPRECT(wParam); 
		break; 
	case msgEvent: 
		OnMsgEvent(wParam,lParam); 
		break; 
	case WM_CTLCOLOR: 
		wParam=m_aSysColor[lParam]; 
		break; 
	case WM_GETFONT: 
		wParam=LRESULT(&m_font); 
		break; 
	case WM_GETSYSMETRICS: 
		wParam=OnGetSysMetrics(wParam,lParam); 
		break; 
	case WM_PAINTING: 
		OnPainting(wParam,lParam); 
		break; 
	case WM_DRAWITEM: 
		break; 
	default: 
		wParam=CPWnd::MsgProc(message,wParam,lParam); 
	} 
	return wParam; 
} 
 
BOOL CDesktop::SetWallpaper(PBITMAPFILEHEADER pFile) 
{ 
	BOOL bResult; 
	m_bmpWallpaper.DeleteObject(); 
	bResult=m_bmpWallpaper.CreateBitmap(pFile,&m_dcOwnDC); 
	Invalidate(m_rclWnd); 
 
	return bResult; 
} 
 
void CDesktop::OnPainting(LPARAM wParam,LPARAM lParam) 
{ 
	switch(wParam) 
	{ 
	case WM_PAINTOVER: 
		m_dcOwnDC.SetClipRect(m_rclPaint); 
		m_pDisplay->Render(NULL,&m_dcOwnDC); 
	case WM_PAINTSTART: 
		break; 
	default: 
		CWnd::PrvOnPainting(wParam,lParam); 
	} 
} 
 
void CDesktop::OnMsgEvent(WPARAM wParam, LPARAM lParam) 
{ 
	PWND pWnd=m_pMouseWnd; 
	switch(wParam) 
	{ 
	case WM_LBUTTONDOWN: 
		if(pWnd) 
			pWnd->MsgProc(WM_LBUTTONUP,0,lParam); 
		DispatchMouseEvent(wParam,lParam); 
		break; 
	case WM_LBUTTONUP: 
		if(pWnd) 
		{ 
			pWnd->MsgProc(WM_LBUTTONUP,0,lParam); 
			m_pMouseWnd=NULL; 
		} 
		break; 
	case WM_MOUSEMOVE: 
		/*if(!pWnd) 
			pWnd=WindowFromPoint(CPoint(lParam)); 
		if(pWnd) 
			pWnd->MsgProc(WM_MOUSEMOVE,0,lParam); 
		*/ 
		break; 
	} 
} 
 
void CDesktop::OnEraseBkgnd(CDC* pDC) 
{ 
	if(m_bmpWallpaper.GetBitmap().bmBits) 
		pDC->BitBlt(GetWindowRect(),&m_bmpWallpaper,NULL,R2_STRETCH); 
	else 
		pDC->FillSolidRect(GetWindowRect(),m_aSysColor[COLOR_WINDOW]); 
} 
 
int CDesktop::OnGetSysMetrics(WPARAM wParam, LPARAM lParam) 
{ 
	switch(wParam) 
	{ 
	case SM_DlgMaxmizeRect: 
		GetClientRect(PRECT(lParam)); 
		break; 
	} 
	return wParam; 
} 
 
void CDesktop::ShowCaret(CBitmap* pBitmap,SIZE size) 
{ 
} 
 
void CDesktop::HideCaret() 
{ 
} 
 
CPoint CDesktop::GetCaretPos() 
{ 
	CPoint pt; 
	return pt; 
} 
 
void CDesktop::SetCaretPos(POINT pt) 
{ 
 
} 
 
void CDesktop::DispatchMouseEvent(WPARAM wParam, LPARAM lParam) 
{ 
	PWND pChild,pTmp,pAC; 
	PPWND pWnd; 
	DWORD nStyle,nACS; 
	CPoint pt(lParam); 
 
	pWnd=PPWND(this); 
	for(;;) 
	{ 
		if(!(pWnd->m_nStyle&WS_PARENT)) 
			break; 
		if(!pWnd->m_rclClient.PtInRect(pt)) 
			break; 
		pChild=pWnd->GetChild(); 
		if(!pChild) 
			break; 
		pAC=pWnd->GetActiveControl(); 
		nACS=pAC?pAC->GetStyle():0; 
		pTmp=pChild->GetPrevWindow(); 
		for(;;) 
		{ 
			if(pTmp->m_rclWnd.PtInRect(pt)) 
			{ 
				nStyle=pTmp->m_nStyle; 
				if(!(nACS&WS_PARENT) || !(nACS&WS_MODALDLG)) 
					break; 
				if(!(nACS&WS_TOPWND)) 
					if(nStyle&WS_TOPWND) 
						break; 
				if(pTmp==pAC) 
					break; 
			} 
			if(pTmp==pChild) 
			{ 
				pTmp=NULL; 
				break; 
			} 
			pTmp=pTmp->m_pPrev; 
		} 
		if(!pTmp) 
			break; 
		if(pTmp->m_nStyle&WS_NOFOCUS) 
		{ 
			pWnd=PPWND(pTmp); 
			break; 
		} 
		pWnd->SetActiveControl(pTmp,PW_FOCUSCHAINKILL); 
		pWnd=PPWND(pTmp); 
	} 
	if(pWnd->m_nStyle&WS_PARENT) 
		pWnd->SetActiveControl(HWND_ACTIVECTRL,PW_FOCUSCHAIN); 
	m_pMouseWnd=pWnd; 
	pWnd->MsgProc(wParam,0,lParam); 
}