📄 rtwnd.cpp
字号:
#include "StdAfx.h"
#include "rtwnd.h"
#include "RTDraw.h"
CRTWnd::CRTWnd(void)
{
m_bActive = FALSE;
m_ExitButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
m_MaximizeButtonState = StateNormal;
m_NcMouseState = MouseStateNormal;
m_SelTitleButton = NoneButton;
}
CRTWnd::~CRTWnd(void)
{
}
COLORREF CRTWnd::m_BorderColor[4] = {0xAD9E9C,0xCEBEB5,0xCEBEB5,0xDED3CE};
BOOL CRTWnd::m_bUseRTStyle = TRUE;
BOOL CRTWnd::m_bUsedDefTitleBar = TRUE;
CBitmap* CRTWnd::m_TitleBarBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTWnd::m_MenuBarBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTWnd::m_MaximizeButtonBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTWnd::m_MinimizeButtonBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTWnd::m_RestoreButtonBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTWnd::m_ExitButtonBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
UINT CRTWnd::m_TitleBarBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTWnd::m_MenuBarBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTWnd::m_MaximizeButtonBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTWnd::m_MinimizeButtonBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTWnd::m_ExitButtonBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTWnd::m_RestoreButtonBitmapDrawMode[5] = {0,0,0,0,0};
BOOL CRTWnd::RTDrawFrameBorder(CDC *pDC,HRGN hRgn,HWND hWnd)
{
//画框架
int Frame_BorderWidth = 0;
int Frame_BorderHeight = 0;
DWORD style = GetWindowLong(hWnd,GWL_STYLE);
if( (style & WS_DLGFRAME) == WS_DLGFRAME)
{
int Frame_BorderWidth = GetSystemMetrics(SM_CXDLGFRAME);
int Frame_BorderHeight = GetSystemMetrics(SM_CYDLGFRAME);
}
else if((style & WS_THICKFRAME) == WS_THICKFRAME)
{
int Frame_BorderWidth = GetSystemMetrics(SM_CXFRAME);
int Frame_BorderHeight = GetSystemMetrics(SM_CYFRAME);
}
//画立体边框
CRect rtWnd,rtBorder;
GetWindowRect(hWnd,&rtWnd);
rtBorder.SetRect(0,0,rtWnd.Width(),rtWnd.Height());
if(m_bUsedDefTitleBar)
{
DefWindowProc(hWnd,WM_NCPAINT,1,0);
return TRUE;
}
for(int i = 0; i < Frame_BorderWidth ; i ++)
{
if(i < 4)
{
pDC->Draw3dRect(i,i,rtWnd.Width() - 2*i,rtWnd.Height() - 2*i,m_BorderColor[i],m_BorderColor[i]);
}
else
{
pDC->Draw3dRect(i,i,rtWnd.Width() - 2*i,rtWnd.Height() - 2*i,m_BorderColor[3],m_BorderColor[3]);
}
}
return TRUE;
}
BOOL CRTWnd::RTDrawMenuBar(CDC *pDC,HRGN hRgn,LPARAM lParam,HWND hWnd)
{
HMENU hMenu = GetMenu(hWnd);
if(hMenu == NULL)return TRUE;
if(m_MenuBarBitmap[0] == NULL)return FALSE;
CRect rtMenu;
CRect rtWnd;
GetWindowRect(hWnd,&rtWnd);
rtMenu.left = GetSystemMetrics(SM_CXFRAME);
rtMenu.top = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CXFRAME) + 1;
rtMenu.right = rtWnd.Width() - GetSystemMetrics(SM_CXFRAME);
rtMenu.bottom = rtMenu.top + GetSystemMetrics(SM_CYMENU);
UINT ItemCount = GetMenuItemCount(hMenu);
int PrevTop = rtMenu.top;
int PrevLeft = rtMenu.left;
int MenuItemHeight = GetSystemMetrics(SM_CYMENU);
CRect rtMenuItem;
//画菜单上部线
CBrush brMenu(GetSysColor(COLOR_MENU));
CBrush* pOldBrush = pDC->SelectObject(&brMenu);
pDC->PatBlt(rtMenu.left,rtMenu.top - 1,rtMenu.Width(),1, PATCOPY);
pDC->PatBlt(rtMenu.left,rtMenu.top - 1,rtMenu.Width(),1, PATCOPY);
for(UINT items = 0; items < ItemCount; items++)
{
GetMenuItemRect(hWnd,hMenu,items,&rtMenuItem);
int MenuTop = rtMenuItem.top - rtWnd.top;
MenuItemHeight = rtMenuItem.Height();
if(MenuTop != PrevTop)
{
CRect rtDraw(PrevLeft,PrevTop,rtMenu.right,PrevTop + MenuItemHeight);
CRTDraw::RTDrawBitmap(pDC,&rtDraw,m_MenuBarBitmap[BMP_BACK],m_MenuBarBitmapDrawMode[BMP_BACK]);
PrevTop = MenuTop;
PrevLeft = rtMenu.left + rtMenuItem.Width();
}
else
{
PrevLeft += rtMenuItem.Width();
}
}
CRect rtDraw(PrevLeft,PrevTop,rtMenu.right,PrevTop + MenuItemHeight);
CRTDraw::RTDrawBitmap(pDC,&rtDraw,m_MenuBarBitmap[BMP_BACK],m_MenuBarBitmapDrawMode[BMP_BACK]);
//画菜单上部线
pDC->PatBlt(rtMenu.left,PrevTop + MenuItemHeight,rtMenu.Width(),1, PATCOPY);
pDC->SelectObject(pOldBrush);
return TRUE;
}
BOOL CRTWnd::SetMinimizeButtonBitmap(CBitmap *MinimizeButtonBitmap[],UINT DrawMode[])
{
for(int i = 0; i < 5; i ++)
{
m_MinimizeButtonBitmap[i] = MinimizeButtonBitmap[i];
m_MinimizeButtonBitmapDrawMode[i] = DrawMode[i];
}
return TRUE;
}
BOOL CRTWnd::SetTitleBarBitmap(CBitmap *TitleBarBitmap[],UINT DrawMode[])
{
for(int i = 0; i < 5; i ++)
{
m_TitleBarBitmap[i] = TitleBarBitmap[i];
m_TitleBarBitmapDrawMode[i] = DrawMode[i];
}
return TRUE;
}
BOOL CRTWnd::SetMenuBarBitmap(CBitmap* MenuBarBitmap[],UINT DrawMode[])
{
for(int i = 0; i < 5; i ++)
{
m_MenuBarBitmap[i] = MenuBarBitmap[i];
m_MenuBarBitmapDrawMode[i] = DrawMode[i];
}
return TRUE;
}
BOOL CRTWnd::SetMaximizeButtonBitmap(CBitmap* MaximizeButtonBitmap[],UINT DrawMode[])
{
for(int i = 0; i < 5; i ++)
{
m_MaximizeButtonBitmap[i] = MaximizeButtonBitmap[i];
m_MinimizeButtonBitmapDrawMode[i] = DrawMode[i];
}
return TRUE;
}
BOOL CRTWnd::SetBorderColor(COLORREF ColorArray[])
{
for(int i = 0; i < 5 ; i++)
m_BorderColor[i] = ColorArray[i];
return TRUE;
}
BOOL CRTWnd::RTDrawTitleBar(CDC* pDC,HRGN hRgn,BOOL bActive,HWND hWnd)
{
//取得标题栏的位置
CRect rtWnd;
CRect rtTitle;
GetWindowRect(hWnd,&rtWnd);
if(m_bUsedDefTitleBar)
{
rtTitle.left = rtWnd.left + GetSystemMetrics(SM_CXFRAME);
rtTitle.top = rtWnd.top + GetSystemMetrics(SM_CYFRAME);
rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);
return TRUE;
}
rtTitle.left = GetSystemMetrics(SM_CXFRAME);
rtTitle.top = GetSystemMetrics(SM_CYFRAME);
rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);
CBitmap* BackBitmap;
COLORREF TitleTextColor;
UINT DrawMode;
if(bActive)
{
BackBitmap = m_TitleBarBitmap[BMP_ACTIVE];
DrawMode = m_TitleBarBitmapDrawMode[BMP_ACTIVE];
TitleTextColor = GetSysColor(COLOR_CAPTIONTEXT);
}
else
{
BackBitmap = m_TitleBarBitmap[BMP_INACTIVE];
DrawMode = m_TitleBarBitmapDrawMode[BMP_INACTIVE];
TitleTextColor = GetSysColor(COLOR_INACTIVECAPTIONTEXT);
}
if(BackBitmap == NULL)return FALSE;
//用位图画标题栏
CRTDraw::RTDrawBitmap(pDC,&rtTitle,BackBitmap,DrawMode);
//画标题栏图标
HICON hIcon = (HICON)DefWindowProc(hWnd,WM_GETICON,ICON_SMALL,0);
if(hIcon != NULL)
{
DrawIconEx(pDC->m_hDC,rtTitle.left+1,rtTitle.top+1,hIcon,rtTitle.Height() - 2,rtTitle.Height() - 2,0,NULL,DI_NORMAL);
}
//画标题栏文字
CFont TitleFont;
NONCLIENTMETRICS nif;
nif.cbSize = sizeof(nif);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(NONCLIENTMETRICS),&nif,0);
TitleFont.CreateFontIndirect(&nif.lfCaptionFont);
CFont *pOldFont = pDC->SelectObject(&TitleFont);
char bufText[1024];
int nText = GetWindowText(hWnd,bufText,1024);
bufText[nText] = NULL;
CString titleText = bufText;
CRect rtTitleText;
rtTitleText.SetRect(rtTitle.left + rtTitle.Height(),rtTitle.top,rtTitle.right - 60,rtTitle.bottom);
int oldBkMode = pDC->SetBkMode(TRANSPARENT);
int oldTextColor = pDC->SetTextColor(TitleTextColor);
TEXTMETRIC Metrics;
pDC->GetTextMetrics(&Metrics);
rtTitleText.top = rtTitle.top + (rtTitle.Height() - Metrics.tmHeight)/2;
pDC->DrawText(titleText,&rtTitleText,DT_LEFT | DT_SINGLELINE);
pDC->SetBkMode(oldBkMode);
pDC->SetTextColor(oldTextColor);
pDC->SelectObject(&pOldFont);
//画标题栏按扭
RTDrawTitleBarButtons(pDC,hWnd);
return TRUE;
}
BOOL CRTWnd::OnRTNcPaint(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
//绘制非客户区
HDC hDC = GetWindowDC(hWnd);
if(hDC != NULL)
{
CDC *pDC = CDC::FromHandle(hDC);
HRGN hrgn = NULL;
CRect rtWnd;
GetWindowRect(hWnd,&rtWnd);
if(wParam != 1)
{
//设置CLIPBOX
hrgn = (HRGN)wParam;
::SelectClipRgn(pDC->m_hDC,hrgn);
::OffsetClipRgn(pDC->m_hDC,0 - rtWnd.left,0 - rtWnd.top);
}
else if(wParam == 1)
{
hrgn = CreateRectRgn(rtWnd.left,rtWnd.top,rtWnd.right,rtWnd.bottom);
::SelectClipRgn(pDC->m_hDC,hrgn);
::OffsetClipRgn(pDC->m_hDC,0 - rtWnd.left,0 - rtWnd.top);
}
RTDrawFrameBorder(pDC,hrgn,hWnd);
RTDrawTitleBar(pDC,hrgn,m_bActive,hWnd);
RTDrawMenuBar(pDC,hrgn,lParam,hWnd);
RTDrawDefaultMenu(lParam,hrgn,hWnd,hrgn);
::SelectClipRgn(pDC->m_hDC,hrgn,NULL);
DeleteObject(hrgn);
if(hrgn != NULL)DeleteObject(hrgn);
pDC->Detach();
ReleaseDC(hWnd,hDC);
}
return TRUE;
}
BOOL CRTWnd::EnableRTStyle(BOOL bEnable)
{
m_bUseRTStyle = bEnable;
return bEnable;
}
BOOL CRTWnd::OnRTNcActive(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
return FALSE;
}
BOOL CRTWnd::OnRTActive(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
*pResult = DefWindowProc(hWnd,uMsg,wParam,lParam);
if(!IsWindow(hWnd))return FALSE;
if(wParam == WA_INACTIVE)
{
m_bActive = FALSE;
}
else
{
m_bActive = TRUE;
}
LRESULT lResult;
OnRTNcPaint(hWnd,uMsg,1,0,&lResult);
return TRUE;
}
BOOL CRTWnd::OnRTNodify(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
*pResult = DefWindowProc(hWnd,uMsg,wParam,lParam);
HDC hDC = GetWindowDC(hWnd);
if(hDC != NULL)
{
CDC *pDC = CDC::FromHandle(hDC);
RTDrawTitleBar(pDC,m_bActive,hWnd);
pDC->Detach();
ReleaseDC(hWnd,hDC);
}
return TRUE;
}
BOOL CRTWnd::OnRTActiveApp(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
*pResult = DefWindowProc(hWnd,uMsg,wParam,lParam);
m_bActive = (BOOL)wParam;
return TRUE;
}
BOOL CRTWnd::OnRTSetText(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
*pResult = DefWindowProc(hWnd,uMsg,wParam,lParam);
HDC hDC = GetWindowDC(hWnd);
if(hDC != NULL)
{
CDC *pDC = CDC::FromHandle(hDC);
RTDrawTitleBar(pDC,m_bActive,hWnd);
pDC->Detach();
ReleaseDC(hWnd,hDC);
}
return TRUE;
}
BOOL CRTWnd::SetRestoreButtonBitmap(CBitmap* RestoreButtonBitmap[],UINT DrawMode[])
{
for(int i = 0; i < 5; i ++)
{
m_RestoreButtonBitmap[i] = RestoreButtonBitmap[i];
m_RestoreButtonBitmapDrawMode[i] = DrawMode[i];
}
return TRUE;
}
BOOL CRTWnd::SetExitButtonBitmap(CBitmap* ExitButtonBitmap[],UINT DrawMode[])
{
for(int i = 0; i < 5; i ++)
{
m_ExitButtonBitmap[i] = ExitButtonBitmap[i];
m_ExitButtonBitmapDrawMode[i] = DrawMode[i];
}
return TRUE;
}
BOOL CRTWnd::RTDrawTitleBarButtons(CDC* pDC,HRGN hRgn,HWND hWnd)
{
//取得标题栏的位置
if(m_bUsedDefTitleBar)return TRUE;
CRect rtWnd;
CRect rtTitle;
GetWindowRect(hWnd,&rtWnd);
rtTitle.left = GetSystemMetrics(SM_CXFRAME);
rtTitle.top = GetSystemMetrics(SM_CYFRAME);
rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);
CRect rtButtons;
//画标题栏按扭
DWORD dwStyle = GetWindowLong(hWnd,GWL_STYLE);
CBitmap* pCloseBox = NULL;
CBitmap* pMaximizeBox = NULL;
CBitmap* pMinimizeBox = NULL;
if(TRUE)
{
if(m_ExitButtonState == StateNormal)
{
pCloseBox = m_ExitButtonBitmap[BMP_NORMAL];
}
else if(m_ExitButtonState == StateDown)
{
pCloseBox = m_ExitButtonBitmap[BMP_DOWN];
}
else if(m_ExitButtonState == StateFocus)
{
pCloseBox = m_ExitButtonBitmap[BMP_FOCUS];
}
}
if(WS_MAXIMIZEBOX & dwStyle)
{
if(IsZoomed(hWnd))
{
if(m_MaximizeButtonState == StateNormal)
{
pMaximizeBox = m_RestoreButtonBitmap[BMP_NORMAL];
}
else if(m_MaximizeButtonState == StateDown)
{
pMaximizeBox = m_RestoreButtonBitmap[BMP_DOWN];
}
else if(m_MaximizeButtonState == StateFocus)
{
pMaximizeBox = m_RestoreButtonBitmap[BMP_FOCUS];
}
}
else
{
if(m_MaximizeButtonState == StateNormal)
{
pMaximizeBox = m_MaximizeButtonBitmap[BMP_NORMAL];
}
else if(m_MaximizeButtonState == StateDown)
{
pMaximizeBox = m_MaximizeButtonBitmap[BMP_DOWN];
}
else if(m_MaximizeButtonState == StateFocus)
{
pMaximizeBox = m_MaximizeButtonBitmap[BMP_FOCUS];
}
}
}
else if(WS_MINIMIZEBOX & dwStyle)
{
if(IsZoomed(hWnd))
{
pMaximizeBox = m_RestoreButtonBitmap[BMP_DISABLE];
}
else
{
pMaximizeBox = m_MaximizeButtonBitmap[BMP_DISABLE];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -