📄 rtframewnd.cpp
字号:
// RTFrameWnd.cpp : CMainFrame 类的实现
#include "stdafx.h"
#include "RTFrameWnd.h"
#include "RTDraw.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CRTFrameWnd
IMPLEMENT_DYNCREATE(CRTFrameWnd, CFrameWnd)
IMPLEMENT_MENUXP(CRTFrameWnd,CFrameWnd)
BEGIN_MESSAGE_MAP(CRTFrameWnd, CFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // 状态行指示器
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
// CRTFrameWnd 构造/销毁
CRTFrameWnd::CRTFrameWnd()
{
m_bActive = FALSE;
m_ExitButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
m_MaximizeButtonState = StateNormal;
m_NcMouseState = MouseStateNormal;
m_SelTitleButton = NoneButton;
}
CRTFrameWnd::~CRTFrameWnd()
{
}
COLORREF CRTFrameWnd::m_BorderColor[4] = {0xAD9E9C,0xCEBEB5,0xCEBEB5,0xDED3CE};
BOOL CRTFrameWnd::m_bEnableSkin = FALSE;
BOOL CRTFrameWnd::m_bEnableBackAndBorder = FALSE;
BOOL CRTFrameWnd::m_bEnableTitleBar = FALSE;
CBitmap* CRTFrameWnd::m_TitleBarBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTFrameWnd::m_MenuBarBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTFrameWnd::m_MaximizeButtonBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTFrameWnd::m_MinimizeButtonBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTFrameWnd::m_RestoreButtonBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTFrameWnd::m_ExitButtonBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
UINT CRTFrameWnd::m_TitleBarBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTFrameWnd::m_MenuBarBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTFrameWnd::m_MaximizeButtonBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTFrameWnd::m_MinimizeButtonBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTFrameWnd::m_ExitButtonBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTFrameWnd::m_RestoreButtonBitmapDrawMode[5] = {0,0,0,0,0};
int CRTFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
BOOL CRTFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
return TRUE;
}
// CRTFrameWnd 诊断
#ifdef _DEBUG
void CRTFrameWnd::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CRTFrameWnd::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
// CRTFrameWnd 消息处理程序
BOOL CRTFrameWnd::RTDrawFrameBorder(CDC *pDC,HRGN hRgn)
{
//画框架
CRect rtWnd;
GetWindowRect(&rtWnd);
int Frame_BorderWidth = GetSystemMetrics(SM_CXFRAME);
int Frame_BorderHeight =GetSystemMetrics(SM_CYFRAME);
if(!m_bEnableBackAndBorder)
{
HRGN rgn = NULL;
//left border
rgn = CreateRectRgn(rtWnd.left,rtWnd.top,rtWnd.left + Frame_BorderWidth,rtWnd.bottom);
if(hRgn != NULL)
{
if(NULLREGION != CombineRgn(rgn,rgn,hRgn,RGN_AND))
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
}
else
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
DeleteObject(rgn);
//top border
rgn = CreateRectRgn(rtWnd.left,rtWnd.top,rtWnd.right,rtWnd.top + Frame_BorderHeight);
if(hRgn != NULL && NULLREGION != CombineRgn(rgn,rgn,hRgn,RGN_AND))
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
else
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
DeleteObject(rgn);
//right border
rgn = CreateRectRgn(rtWnd.right - Frame_BorderWidth,rtWnd.top,rtWnd.right,rtWnd.bottom);
if(hRgn != NULL && NULLREGION != CombineRgn(rgn,rgn,hRgn,RGN_AND))
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
else
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
DeleteObject(rgn);
//bottom
rgn = CreateRectRgn(rtWnd.left,rtWnd.bottom - Frame_BorderHeight,rtWnd.right,rtWnd.bottom);
if(hRgn != NULL && NULLREGION != CombineRgn(rgn,rgn,hRgn,RGN_AND))
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
else
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
DeleteObject(rgn);
return TRUE;
}
CRect rtBorder;
rtBorder.SetRect(0,0,rtWnd.Width(),rtWnd.Height());
//画立体边框
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 CRTFrameWnd::RTDrawMenuBar(CDC *pDC,LPARAM lParam,HRGN hrgn)
{
CMenu *pMenu = GetMenu();
if(pMenu == NULL)return TRUE;
CRect rtMenu;
CRect rtWnd;
GetWindowRect(&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 = pMenu->GetMenuItemCount();
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);
for(UINT items = 0; items < ItemCount; items++)
{
GetMenuItemRect(m_hWnd,pMenu->m_hMenu,items,&rtMenuItem);
//画系统菜单
HRGN rgn = CreateRectRgn(rtMenuItem.left,rtMenuItem.top,rtMenuItem.right,rtMenuItem.bottom);
if(hrgn != NULL)
{
if(NULLREGION != CombineRgn(rgn,rgn,hrgn,RGN_AND))
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
}
else
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
DeleteObject(rgn);
int MenuTop = rtMenuItem.top - rtWnd.top;
MenuItemHeight = rtMenuItem.Height();
if(MenuTop != PrevTop)
{
if(!CRTMenu::m_bEnableSkin)
{
rgn = CreateRectRgn(rtWnd.left + PrevLeft,rtWnd.top + PrevTop,rtWnd.right - GetSystemMetrics(SM_CXFRAME),rtWnd.top + PrevTop + MenuItemHeight);
if(hrgn != NULL)
{
if(NULLREGION != CombineRgn(rgn,rgn,hrgn,RGN_AND))
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
}
else
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
DeleteObject(rgn);
}
else
{
CRect rtDraw(PrevLeft,PrevTop,rtMenu.right,PrevTop + MenuItemHeight);
CRTDraw::RTDrawBitmap(pDC,&rtDraw,CRTMenu::m_MenuBarBitmap[BMP_BACK],CRTMenu::m_MenuBarBitmapDrawMode[BMP_BACK]);
}
PrevTop = MenuTop;
PrevLeft = rtMenu.left + rtMenuItem.Width();
}
else
{
PrevLeft += rtMenuItem.Width();
}
}
if(!CRTMenu::m_bEnableSkin)
{
HRGN rgn = CreateRectRgn(rtWnd.left + PrevLeft,rtWnd.top + PrevTop,rtWnd.right - GetSystemMetrics(SM_CXFRAME),rtWnd.top + PrevTop + MenuItemHeight);
if(hrgn != NULL)
{
if(NULLREGION != CombineRgn(rgn,rgn,hrgn,RGN_AND))
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
}
else
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
DeleteObject(rgn);
}
else
{
CRect rtDraw(PrevLeft,PrevTop,rtMenu.right,PrevTop + MenuItemHeight);
CRTDraw::RTDrawBitmap(pDC,&rtDraw,CRTMenu::m_MenuBarBitmap[BMP_BACK],CRTMenu::m_MenuBarBitmapDrawMode[BMP_BACK]);
}
//画菜单上部线
pDC->PatBlt(rtMenu.left,PrevTop + MenuItemHeight,rtMenu.Width(),1, PATCOPY);
pDC->SelectObject(pOldBrush);
return TRUE;
}
BOOL CRTFrameWnd::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 CRTFrameWnd::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 CRTFrameWnd::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 CRTFrameWnd::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 CRTFrameWnd::SetBorderColor(COLORREF ColorArray[])
{
for(int i = 0; i < 5 ; i++)
m_BorderColor[i] = ColorArray[i];
return TRUE;
}
BOOL CRTFrameWnd::RTDrawTitleBar(CDC* pDC,BOOL bActive,HRGN hrgn)
{
//取得标题栏的位置
DWORD style = GetStyle();
if((style & WS_CAPTION) != WS_CAPTION)return TRUE;
CRect rtWnd;
GetWindowRect(&rtWnd);
if(!m_bEnableTitleBar)
{
rtWnd.left = rtWnd.left + GetSystemMetrics(SM_CXFRAME);
rtWnd.top = rtWnd.top + GetSystemMetrics(SM_CYFRAME);
rtWnd.right = rtWnd.right - GetSystemMetrics(SM_CXFRAME);
rtWnd.bottom = rtWnd.top + GetSystemMetrics(SM_CYSIZE);
HRGN rgn = CreateRectRgn(rtWnd.left,rtWnd.top,rtWnd.right,rtWnd.bottom);
if(hrgn != NULL)
{
if(NULLREGION != CombineRgn(rgn,rgn,hrgn,RGN_AND))
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
}
else
{
CFrameWnd::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
DeleteObject(rgn);
return TRUE;
}
CRect rtTitle;
rtTitle.left = GetSystemMetrics(SM_CXFRAME);
rtTitle.top = GetSystemMetrics(SM_CYFRAME);
rtTitle.right = rtWnd.Width() - GetSystemMetrics(SM_CXFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);
CMemDC memDC(pDC,rtTitle);
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(&memDC,&rtTitle,BackBitmap,DrawMode);
//画标题栏图标
HICON hIcon = GetIcon(FALSE);
CRect rtTitleText;
if(hIcon != NULL)
{
DrawIconEx(memDC.m_hDC,rtTitle.left+1,rtTitle.top+1,hIcon,rtTitle.Height() - 2,rtTitle.Height() - 2,0,NULL,DI_NORMAL);
rtTitleText.SetRect(rtTitle.left + rtTitle.Height(),rtTitle.top,rtTitle.right - 60,rtTitle.bottom);
}
else
{
rtTitleText.SetRect(rtTitle.left + 1,rtTitle.top,rtTitle.right - 60,rtTitle.bottom);
}
//画标题栏文字
CFont TitleFont;
NONCLIENTMETRICS nif;
nif.cbSize = sizeof(nif);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(NONCLIENTMETRICS),&nif,0);
TitleFont.CreateFontIndirect(&nif.lfCaptionFont);
CFont *pOldFont = memDC.SelectObject(&TitleFont);
CString titleText = GetTitle();
int oldBkMode = memDC.SetBkMode(TRANSPARENT);
int oldTextColor = memDC.SetTextColor(TitleTextColor);
TEXTMETRIC Metrics;
pDC->GetTextMetrics(&Metrics);
rtTitleText.top = rtTitle.top + (rtTitle.Height() - Metrics.tmHeight)/2 + 1;
memDC.DrawText(titleText,&rtTitleText,DT_LEFT | DT_SINGLELINE);
memDC.SetBkMode(oldBkMode);
memDC.SetTextColor(oldTextColor);
memDC.SelectObject(&pOldFont);
//画标题栏按扭
RTDrawTitleBarButtons(&memDC);
return TRUE;
}
LRESULT CRTFrameWnd::OnRTNcPaint(WPARAM wParam, LPARAM lParam)
{
//绘制非客户区
if(!m_bEnableSkin)return CFrameWnd::WindowProc(WM_NCPAINT,wParam,lParam);
CWindowDC dc(this);
HRGN hrgn = NULL;
CRect rtWnd;
GetWindowRect(&rtWnd);
if(wParam != 1)
{
hrgn = (HRGN)wParam;
}
if(hrgn != NULL)
{
::SelectClipRgn(dc.m_hDC,hrgn);
::OffsetClipRgn(dc.m_hDC,0 - rtWnd.left,0 - rtWnd.top);
}
RTDrawFrameBorder(&dc,hrgn);
RTDrawTitleBar(&dc,m_bActive,hrgn);
RTDrawMenuBar(&dc,lParam);
if(hrgn != NULL)
{
::SelectClipRgn(dc.m_hDC,NULL);
DeleteObject(hrgn);
}
return FALSE;
}
BOOL CRTFrameWnd::EnableSkin(BOOL bEnable,BOOL bEnablBackAndBorder,BOOL bEnableTitleBar)
{
m_bEnableSkin = bEnable;
m_bEnableBackAndBorder = bEnablBackAndBorder;
m_bEnableTitleBar = bEnableTitleBar;
return bEnable;
}
LRESULT CRTFrameWnd::OnRTNcActive(WPARAM wParam, LPARAM lParam)
{
return CFrameWnd::WindowProc(WM_NCACTIVATE,wParam,lParam);
}
LRESULT CRTFrameWnd::OnRTActive(WPARAM wParam,LPARAM lParam)
{
LRESULT result = CFrameWnd::WindowProc(WM_ACTIVATE,wParam,lParam);
if(!m_bEnableSkin)return result;
if(!m_bEnableTitleBar)return result;
if(!IsWindow(m_hWnd))return result;
CWindowDC dc(this);
if(wParam == WA_INACTIVE)
{
m_bActive = FALSE;
}
else
{
m_bActive = TRUE;
}
OnRTNcPaint(1,0);
return result;
}
LRESULT CRTFrameWnd::OnRTNodify(WPARAM wParam, LPARAM lParam)
{
LRESULT result = CFrameWnd::WindowProc(WM_NOTIFY,wParam,lParam);
if(!m_bEnableSkin)return result;
if(!m_bEnableTitleBar)return result;
CWindowDC dc(this);
RTDrawTitleBar(&dc,m_bActive);
return 0;
}
LRESULT CRTFrameWnd::OnRTActiveApp(WPARAM wParam,LPARAM lParam)
{
LRESULT result = CFrameWnd::WindowProc(WM_ACTIVATEAPP,wParam,lParam);
if(!m_bEnableSkin)return result;
if(!m_bEnableTitleBar)return result;
m_bActive = (BOOL)wParam;
return 0;
}
LRESULT CRTFrameWnd::OnRTSetText(WPARAM wParam, LPARAM lParam)
{
LRESULT result = CFrameWnd::WindowProc(WM_SETTEXT,wParam,lParam);
if(!m_bEnableSkin)return result;
if(!m_bEnableTitleBar)return result;
CWindowDC dc(this);
RTDrawTitleBar(&dc,m_bActive);
return result;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -