当前位置: 首页 > 图文教程 > 开发语言 > 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   浏览: 152 ::
收藏到网摘: n/a

美化你的应用程序的外观界面
作者:桂林电子工业学院990312 隋振国

下载本文源程序1(对话框版本)
下载本文源程序2(SDI版本)

  很多编程爱好者都有这样的经历,自己写的程序非常漂亮,但是在Windows平台下开发的程序却总是逃不出Windows默认风格的约束。标题栏、工具栏,一成不变的风格使得再有创意的作品也黯然失色。下面我们给对话框应用程序进行一次外科手术,旨于向各位读者介绍一种方法,希望大家在此基础上有进一步的发展。
  本例以对话框应用程序为基础,自画非客户区,完成应用程序美化,代码运行效果图如下:


下面我们来探讨具体的实现过程

一、定义资源:
  添加系统按钮的位图资源(本例中使用十个位图,分别显示帮助、最小化、最大化、恢复及关闭按钮的普通状态和焦点状态,当然可随程序的要求自定义添加)
  
二、定义全局变量及函数:

   	CRect m_rtButtExit;	//关闭按钮位置  	CRect m_rtButtMax;	//最大化按钮位置  	CRect m_rtButtMin;	//最小化按钮位置  	CRect m_rtButtHelp;	//帮助按钮位置  	CRect m_rtIcon;	//图标位置  	void DrawTitleBar(CDC *pDC);	//画非客户区主函数
三、函数实现:
  本例需要对以下消息进行重载DefWindowProc、ON_WM_NCMOUSEMOVE、ON_WM_NCLBUTTONDOWN。
  函数实现体如下:
//主函数,可根据实际情况进行自绘窗体
void CTitleBarDlg::DrawTitleBar(CDC *pDC) {	if (m_hWnd)	{	CBrush Brush(RGB(0,100,255));	CBrush* pOldBrush = pDC->SelectObject(&Brush);	CRect rtWnd, rtTitle, rtButtons;	GetWindowRect(&rtWnd); …………………………….. //因代码过长,未贴,见源程序 ……………………………... } } 
//将消息进行过滤,对可能影响界面初始及更新的消息,产生重画消息执行DrawTitleBar函数
LRESULT CTitleBarDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) {	LRESULT lrst=CDialog::DefWindowProc(message, wParam, lParam);	if (!::IsWindow(m_hWnd))	return lrst; if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT|| message== WM_NCACTIVATE ||message == WM_NOTIFY)	{	CDC* pWinDC = GetWindowDC();	if (pWinDC)	DrawTitleBar(pWinDC);	ReleaseDC(pWinDC);	}	return lrst; }
//实现标题栏按钮的鼠标移动效果
void CTitleBarDlg::OnNcMouseMove(UINT nHitTest, CPoint point) {	CDC* pDC = GetWindowDC();	if (pDC)	{ …………………………….. //因代码过长,未贴,见源程序 ……………………………...	}	ReleaseDC(pDC);	CDialog::OnNcMouseMove(nHitTest, point); }
//实现非客户区,用户鼠标点击操作
void CTitleBarDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) {	//检测各按钮是否按到	if (m_rtIcon.PtInRect(point))	AfxMessageBox("欢迎访问FlySnowStdio主页");	else if (m_rtButtHelp.PtInRect(point))	SendMessage(WM_HELP);	else if (m_rtButtExit.PtInRect(point))	SendMessage(WM_CLOSE);	else if (m_rtButtMin.PtInRect(point))	SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y));	else if (m_rtButtMax.PtInRect(point))	{	if (IsZoomed())	SendMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y));	else	{	SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y));	Invalidate();	}	}	else if (!IsZoomed())	Default(); }
四、总结
本例为对话框应用程序,单文档的基本原理也相似。对于包含菜单项的程序,可以采用自画菜单,将整个程序的界面融为一体,在此不做过多介绍,本人已经完成,请与我联系。