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

📄 rtdialog.cpp

📁 vc++编写的界面源代码,对C++爱好者是很发的帮助。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -