⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 desktop.cpp

📁 一个更为先进的嵌入式操作系统.采用RMS线程调度算法,具有信号量等同步对象.亦包括GUI. 通过该系统您可以极大知道Windows的内部秘密.
💻 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);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -