当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 让你的软件界面更漂亮(一)

VC++
如何在运行时确定对象类型(RTTI)
FMD开发文集 -- CArchive原理
FMD开发文集 -- MFC调试模式下new操作符的特殊处理
FMD开发文集 -- MFC CObject浅析
生死疆界(下)--- 在new与delete之间
生死疆界(上)--- 在new与delete之间
Pointers 与 References(四)
Pointers 与 References(三)
Pointers 与 References(二)
Pointers 与 References(一)
介绍一个专门处理C++异常的类和例子
关于构造单实例类的一个问题
模板友元化
C++中类的数据成员的安全隐患
关于对象生命历程的会话
接触VC之二:MFC类基础,C++程序编写规范介绍
内联汇编基础知识
命名空间的概念
捕获数学函数异常
MMX指令集在C++中的使用

VC++ 中的 让你的软件界面更漂亮(一)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 80 ::
收藏到网摘: n/a

让你的软件界面更漂亮(一)

作者:朱一松

下载源代码

  我们使用过很多的软件, 给我们留下印象很深的是那些界面漂亮且迷人的软件, 国外的软件象QuickTime,国产的象金山词霸等,它们的软件界面设计风格都有独特之处。本人跟据自已的经验和大家探讨一下软件的漂亮界面实现的原理并提供DEMO程序。本人经验不多,经常从VCKBASE.COM吸取知识,共同学习,如有不足之处,请指正!也欢迎和我联系。下面就开始吧!

一、漂亮界面实现的原理

  用图象元素自绘窗口标题样栏,边框,系统按钮(最大化、最小化、关闭按钮)还有按窗口中的控件。图象当然是美工画的,但要你教美工怎么去画,是不是不能理解? ,呆会我会告诉你你如何去教美工画.请先仔细看下图。




明白了吧,被红线包括的部分都是要画的图象。画得好不好会直接影响你的软件界面。

二、原理说玩了,来说一下实现的基本知识

1、VC软件绘图技术:

	CBitmap* pBitmap = new CBitmap;	BITMAP BmpInfo;	CBitmap* pOldBitmap;	CDC* pDisplayMemDC=new CDC;	pDisplayMemDC->CreateCompatibleDC(pDC);	pBitmap->LoadBitmap(IDB_TITLE_LEFT);	pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);	pBitmap->GetBitmap(&BmpInfo);	// x,y为绘图位置 ,必要时此语句要有For(..;..;..)控制	pDC->BitBlt(x,y, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);	pDisplayMemDC->SelectObject(pOldBitmap);	pBitmap->DeleteObject();	ReleaseDC(pDisplayMemDC);//记得执行以下的语句	delete pDisplayMemDC;	delete pBitmap; 
2、坐标的概念:点、窗口坐标和屏幕坐标及转换,很重要!如不清楚请先复习相关知识。

下图是我写在一个界面,就是基于上述原理实现的:



下面介绍软件如何实现的:

①、重载对话框的消息函数:
void OnNcLButtonDown(UINT nHitTest, CPoint point);
//单击标题栏时是响应
void OnNcMouseMove(UINT nHitTest, CPoint point);
//Mous 在标题移动时响应
LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
②、添加关键成员函数为:BOOL DrawTitleBar(CDC *pDC)

③、添加完消息涵数后,在.cpp中实现它们的代码:
void CTitleBarDlg::OnNcMouseMove(UINT nHitTest, CPoint point) {	CDC* pDC = GetWindowDC();	CDC* pDisplayMemDC=new CDC;	pDisplayMemDC->CreateCompatibleDC(pDC);	CBitmap* pBitmap = new CBitmap;	CBitmap* pOldBitmap;	CRect rtWnd, rtButton;	if (pDC)	{	CString StrTemp = "";	GetWindowRect(&rtWnd);	//mouse坐标转化为本窗口坐标 重要	point.x = point.x - rtWnd.left;	point.y = point.y - rtWnd.top;	//判断mouse是否移到系统按钮上	if (m_rtButtExit.PtInRect(point))	{	pBitmap->LoadBitmap(IDB_EXIT_FOCUS);	StrTemp = _T("关闭");	}	else	{	if(m_rtButtMin.PtInRect(point))	{	pBitmap->LoadBitmap(IDB_MIN_FOCUS);	StrTemp = _T("最小化窗口");	}	else	{	if(m_rtButtMax.PtInRect(point))	{	pBitmap->LoadBitmap(IDB_MAX_FOCUS);	if(IsZoomed())	{	StrTemp = _T("还原窗口");	}	else	{	StrTemp = _T("最化大窗口");	}	}	else	{	pBitmap->LoadBitmap(IDB_NORMAL);	}	}	}	rtButton = m_rtButtMin;	BITMAP BmpInfo;	pBitmap->GetBitmap(&BmpInfo);	pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);	pDC->BitBlt(rtButton.left-6,	rtButton.top-2,	BmpInfo.bmWidth,	BmpInfo.bmHeight,	pDisplayMemDC,	0,	0,	SRCCOPY);	pDisplayMemDC->SelectObject(pOldBitmap);	pBitmap->DeleteObject();	CRect ShowTipRec;	ShowTipRec = m_rtButtMin;	if(!StrTemp.IsEmpty())	{	//	ScreenToClient(&ShowTipRec);	// m_ToolTip.AddToolTip(IDD_TITLEBAR_DIALOG,&ShowTipRec,StrTemp);	//	m_ToolTip.SetDelayTime(200);	}	}	ReleaseDC(pDisplayMemDC);	ReleaseDC(pDC);	delete pDisplayMemDC;	delete pBitmap;	CDialog::OnNcMouseMove(nHitTest, point);}//此为关键函数void CTitleBarDlg::DrawTitleBar(CDC *pDC){	if (m_hWnd)	{	CBrush Brush(RGB(0,100,255));	CBrush* pOldBrush = pDC->SelectObject(&B