📄 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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -