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

📄 rtwnd.cpp

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