📄 rtdialog.cpp
字号:
// RTDialog.cpp : 实现文件
//
#include "stdafx.h"
#include "RTDialog.h"
#include "RTDraw.h"
#include "RTMenu.h"
// CRTDialog 对话框
IMPLEMENT_DYNAMIC(CRTDialog, CDialog)
IMPLEMENT_MENUXP(CRTDialog,CDialog)
CRTDialog::CRTDialog()
: CDialog()
{
m_bActive = FALSE;
m_ExitButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
m_MaximizeButtonState = StateNormal;
m_NcMouseState = MouseStateNormal;
m_SelTitleButton = NoneButton;
}
CRTDialog::CRTDialog(UINT uTemplate,CWnd *pParent)
: CDialog(uTemplate,pParent)
{
m_bActive = FALSE;
m_ExitButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
m_MaximizeButtonState = StateNormal;
m_NcMouseState = MouseStateNormal;
m_SelTitleButton = NoneButton;
}
CRTDialog::CRTDialog(LPCTSTR lpszTemplateName,CWnd* pParent)
: CDialog(lpszTemplateName,pParent)
{
m_bActive = FALSE;
m_ExitButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
m_MaximizeButtonState = StateNormal;
m_NcMouseState = MouseStateNormal;
m_SelTitleButton = NoneButton;
}
CRTDialog::~CRTDialog()
{
}
COLORREF CRTDialog::m_BorderColor[4] = {0xAD9E9C,0xCEBEB5,0xCEBEB5,0xDED3CE};
BOOL CRTDialog::m_bEnableSkin = FALSE;
BOOL CRTDialog::m_bEnableBack = FALSE;
BOOL CRTDialog::m_bEnableBorder = FALSE;
BOOL CRTDialog::m_bEnableTitleBar = FALSE;
CBitmap* CRTDialog::m_TitleBarBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTDialog::m_MenuBarBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTDialog::m_MaximizeButtonBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTDialog::m_MinimizeButtonBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTDialog::m_RestoreButtonBitmap[5] ={ NULL,NULL,NULL,NULL,NULL};
CBitmap* CRTDialog::m_ExitButtonBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
UINT CRTDialog::m_TitleBarBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTDialog::m_MenuBarBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTDialog::m_MaximizeButtonBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTDialog::m_MinimizeButtonBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTDialog::m_ExitButtonBitmapDrawMode[5] = {0,0,0,0,0};
UINT CRTDialog::m_RestoreButtonBitmapDrawMode[5] = {0,0,0,0,0};
void CRTDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CRTDialog, CDialog)
END_MESSAGE_MAP()
// CRTDialog 消息处理程序
BOOL CRTDialog::RTDrawFrameBorder(CDC *pDC,HRGN hrgn)
{
//画框架
CRect rtWnd;
GetWindowRect(&rtWnd);
int Frame_BorderWidth = GetSystemMetrics(SM_CXDLGFRAME);
int Frame_BorderHeight =GetSystemMetrics(SM_CYDLGFRAME);
if(!m_bEnableBorder)
{
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))
{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
}
else
{
CDialog::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))
{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
else
{
CDialog::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))
{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
else
{
CDialog::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))
{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
else
{
CDialog::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 CRTDialog::RTDrawMenuBar(CDC *pDC,LPARAM lParam,HRGN hrgn)
{
CMenu *pMenu = GetMenu();
if(pMenu == NULL)return TRUE;
CRect rtMenu;
CRect rtWnd;
DWORD style = GetStyle();
int BorderWidth = 0;
int BorderHeight = 0;
int CaptionHeight = 0;
BorderWidth = GetSystemMetrics(SM_CXDLGFRAME);
BorderHeight =GetSystemMetrics(SM_CYDLGFRAME);
//no support toolswindow
if((style & WS_CAPTION) == WS_CAPTION)
{
CaptionHeight = GetSystemMetrics(SM_CYCAPTION);
}
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))
{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
}
else
{
CDialog::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 - BorderWidth,rtWnd.top + PrevTop + MenuItemHeight);
if(hrgn != NULL)
{
if(NULLREGION != CombineRgn(rgn,rgn,hrgn,RGN_AND))
{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
}
else
{
CDialog::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 - BorderWidth,rtWnd.top + PrevTop + MenuItemHeight);
if(hrgn != NULL)
{
if(NULLREGION != CombineRgn(rgn,rgn,hrgn,RGN_AND))
{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
}
else
{
CDialog::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 CRTDialog::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 CRTDialog::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 CRTDialog::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 CRTDialog::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 CRTDialog::SetBorderColor(COLORREF ColorArray[])
{
for(int i = 0; i < 4 ; i++)
m_BorderColor[i] = ColorArray[i];
return TRUE;
}
BOOL CRTDialog::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_CXDLGFRAME);
rtWnd.top = rtWnd.top + GetSystemMetrics(SM_CYDLGFRAME);
rtWnd.right = rtWnd.right - GetSystemMetrics(SM_CYDLGFRAME);
rtWnd.bottom = rtWnd.top + GetSystemMetrics(SM_CYCAPTION);
HRGN rgn = CreateRectRgn(rtWnd.left,rtWnd.top,rtWnd.right,rtWnd.bottom);
if(hrgn != NULL)
{
if(NULLREGION != CombineRgn(rgn,rgn,hrgn,RGN_AND))
{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
}
else
{
CDialog::WindowProc(WM_NCPAINT,(WPARAM)rgn,0);
}
DeleteObject(rgn);
return TRUE;
}
CRect rtTitle;
rtTitle.left = GetSystemMetrics(SM_CXDLGFRAME);
rtTitle.top = GetSystemMetrics(SM_CYDLGFRAME);
rtTitle.right = rtWnd.Width() - GetSystemMetrics(SM_CYDLGFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYCAPTION);
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;
GetWindowText(titleText);
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 CRTDialog::OnRTNcPaint(WPARAM wParam, LPARAM lParam)
{
//绘制非客户区
if(m_bEnableSkin == FALSE)
{
return CDialog::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 CRTDialog::EnableSkin(BOOL bEnable,BOOL bEnableBorder,BOOL bEnableBack,BOOL bEnableTitleBar)
{
m_bEnableSkin = bEnable;
m_bEnableBack = bEnableBack;
m_bEnableTitleBar = bEnableTitleBar;
m_bEnableBorder = bEnableBorder;
return bEnable;
}
LRESULT CRTDialog::OnRTNcActive(WPARAM wParam, LPARAM lParam)
{
if(!m_bEnableSkin)return CDialog::WindowProc(WM_NCACTIVATE,wParam,lParam);
if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_NCACTIVATE,wParam,lParam);
CWindowDC dc(this);
RTDrawTitleBar(&dc,m_bActive);
return TRUE;
}
LRESULT CRTDialog::OnRTActive(WPARAM wParam,LPARAM lParam)
{
LRESULT result = CDialog::WindowProc(WM_ACTIVATE,wParam,lParam);
if(!m_bEnableSkin)return result;
if(!m_bEnableTitleBar)return result;
CWindowDC dc(this);
if(wParam == WA_INACTIVE)
{
m_bActive = FALSE;
}
else
{
m_bActive = TRUE;
}
OnRTNcPaint(1,0);
return result;
}
LRESULT CRTDialog::OnRTNodify(WPARAM wParam, LPARAM lParam)
{
LRESULT result = CDialog::WindowProc(WM_NOTIFY,wParam,lParam);
if(!m_bEnableSkin)return result;
if(!m_bEnableTitleBar)return result;
CWindowDC dc(this);
RTDrawTitleBar(&dc,m_bActive);
return result;
}
LRESULT CRTDialog::OnRTActiveApp(WPARAM wParam,LPARAM lParam)
{
if(!m_bEnableSkin)return CDialog::WindowProc(WM_ACTIVATEAPP,wParam,lParam);
if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_ACTIVATEAPP,wParam,lParam);
LRESULT result = CDialog::WindowProc(WM_ACTIVATEAPP,wParam,lParam);
m_bActive = (BOOL)wParam;
return 0;
}
LRESULT CRTDialog::OnRTSetText(WPARAM wParam, LPARAM lParam)
{
LRESULT result = CDialog::WindowProc(WM_SETTEXT,wParam,lParam);
if(!m_bEnableSkin)return result;
if(!m_bEnableTitleBar)return result;
CWindowDC dc(this);
RTDrawTitleBar(&dc,m_bActive);
return result;
}
BOOL CRTDialog::SetRestoreButtonBitmap(CBitmap* RestoreButtonBitmap[],UINT DrawMode[])
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -