Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1569228
  • 博文数量: 884
  • 博客积分: 52280
  • 博客等级: 大将
  • 技术积分: 13060
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-06 09:46
文章分类

全部博文(884)

文章存档

2008年(884)

我的朋友

分类: C/C++

2008-08-06 09:50:25

下载本文示例代码
下面我们来探讨具体的实现过程

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

   	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();

     }

四、总结
本例为对话框应用程序,单文档的基本原理也相似。对于包含菜单项的程序,可以采用自画菜单,将整个程序的界面融为一体,在此不做过多介绍,本人已经完成,请与我联系。如果你想使你的程序更漂亮,也可以尽情放至贴图到背景上,愿你的程序多姿多彩。本文是在百忙中匆匆完成,错误之处希望大家批评指正!

上述程序在Win2000 Advanced Server VC6 SP5 2002.3下编译运行通过。Win98测试顺利运行。 下载本文示例代码
阅读(146) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~