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

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 67 ::
收藏到网摘: 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