窗口的美化2

1.改变窗口的形状可以在OnCreate()中   一般是通过调用SetWindowRgn((HRGN)rgn,true)修改

2.为窗口添加默认处理函数拦截里面的一些消息:

添加DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 在其中添加

if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||message==WM_NCACTIVATE ||message == WM_NOTIFY)
{

//这里是添加重画标题栏 下边框 左边框 右边框以及退出按钮 最小化按钮的地方

重要代码如下:

GetSystemMetrics(SM_CXFRAME);//窗口边框的边缘宽度

GetSystemMetrics(SM_CYFRAME);//窗口边框的边缘高度

GetSystemMetrics(SM_CXSIZE); //窗口标题栏宽度

GetSystemMetrics(SM_CYSIZE); //窗口标题栏高度

//顶部非客户区等于 标题栏的宽度加上边框

标题栏坐标如下

m_rtIcon.left = rtTitle.left ;
m_rtIcon.top = rtTitle.top;
m_rtIcon.right = m_rtIcon.left + 16;
m_rtIcon.bottom = m_rtIcon.top + 15;


关闭按钮坐标如下

rtButtons.left = rtTitle.right - 16;
rtButtons.top = rtTitle.top - 1;
rtButtons.right = rtButtons.left + 16;
rtButtons.bottom = rtButtons.top + 15;


获得窗口标题,然后在标题栏适当位置绘制标题文字

具体代码如:

rtTitle.left += m_rtIcon.Width ()+3;
rtTitle.top = rtTitle.top;
rtTitle.bottom = rtTitle.top + 30;
CString m_strTitle;

填充函数用PatBlt();

}

添加OnNcLButtonDown(UINT nHitTest, CPoint point) 

{

判断鼠标是否在关闭按钮内?yes 就关闭程序SendMessage(WM_CLOSE);

判断鼠标是否在最小化按钮内?yes就最小化 SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y));

判断鼠标是否在最大化按钮内?yes就最大

}

添加OnNcMouseMove(UINT nHitTest, CPoint point) 

{

判断鼠标是否在关闭按钮内,是则重画

}

具体的设计代码如下:

void CTitleBarColorDlg::DrawTitleBar(CDC *pDC)
{
	if (m_hWnd)
	{
		CBrush Brush(RGB(187,200,143));
		CBrush* pOldBrush = pDC->SelectObject(&Brush);

		CRect rtWnd, rtTitle, rtButtons;
		GetWindowRect(&rtWnd);
		
		//取得标题栏的位置
		  //SM_CXFRAME 窗口边框的边缘宽度
		  //SM_CYFRAME 窗口边框的边缘高度
		  //SM_CXSIZE  窗口标题栏宽度
	   	  //SM_CYSIZE  窗口标题栏高度
		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);

		CPoint point;
		//填充顶部框架
		point.x = rtWnd.Width();						
		point.y = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CYFRAME) + 0;
		pDC->PatBlt(0, 0, point.x, point.y, PATCOPY);
		//填充左侧框架
		point.x = GetSystemMetrics(SM_CXFRAME) -1;
		point.y = rtWnd.Height()- 1;
		pDC->PatBlt(0, 0, point.x, point.y, PATCOPY);
		//填充底部框架
		point.x = rtWnd.Width(); 
		point.y = GetSystemMetrics(SM_CYFRAME);
		pDC->PatBlt(0, rtWnd.Height()-point.y, point.x, point.y, PATCOPY);
		//填充右侧框架
		point.x = GetSystemMetrics(SM_CXFRAME);
		point.y = rtWnd.Height();
		pDC->PatBlt(rtWnd.Width()-point.x, 0, point.x, point.y, PATCOPY);
		
		
		//重画标题栏图标
		m_rtIcon.left = rtTitle.left ;
		m_rtIcon.top = rtTitle.top;
		m_rtIcon.right = m_rtIcon.left + 16;
		m_rtIcon.bottom = m_rtIcon.top + 15;
		::DrawIconEx(pDC->m_hDC, m_rtIcon.left, m_rtIcon.top,  AfxGetApp()->LoadIcon(IDR_MAINFRAME), 
			m_rtIcon.Width(), m_rtIcon.Height(), 0, NULL, DI_NORMAL);
		m_rtIcon.OffsetRect(rtWnd.TopLeft());
	
		CBitmap* pBitmap = new CBitmap;
		CBitmap* pOldBitmap;
		CDC* pDisplayMemDC=new CDC;
		pDisplayMemDC->CreateCompatibleDC(pDC);
		
		//重画关闭button
		rtButtons.left = rtTitle.right - 16;
		rtButtons.top = rtTitle.top - 1;
		rtButtons.right = rtButtons.left + 16;
		rtButtons.bottom = rtButtons.top + 15;
		pBitmap->LoadBitmap(IDB_EXIT_FOCUS);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
		pDisplayMemDC->SelectObject(pOldBitmap);
		m_rtButtExit = rtButtons;
		m_rtButtExit.OffsetRect(rtWnd.TopLeft()); 
		pBitmap->DeleteObject();
		
		//重画最大化/恢复button
		rtButtons.right = rtButtons.left - 3;
		rtButtons.left = rtButtons.right - 16;
		if (IsZoomed())
			pBitmap->LoadBitmap(IDB_RESTORE_NORMAL);
		else
			pBitmap->LoadBitmap(IDB_MAX_NORMAL);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
		pDisplayMemDC->SelectObject(pOldBitmap);
		m_rtButtMax = rtButtons;
		m_rtButtMax.OffsetRect(rtWnd.TopLeft());
		pBitmap->DeleteObject();
		
		//重画最小化button
		rtButtons.right = rtButtons.left - 3;
		rtButtons.left = rtButtons.right - 16;
		pBitmap->LoadBitmap(IDB_MIN_NORMAL);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
		pDisplayMemDC->SelectObject(pOldBitmap);
		m_rtButtMin = rtButtons;
		m_rtButtMin.OffsetRect(rtWnd.TopLeft());
		pBitmap->DeleteObject();

		//重画caption
		int nOldMode = pDC->SetBkMode(TRANSPARENT);
		COLORREF clOldText=pDC->SetTextColor(RGB(255, 255, 255));
		
		CFont m_captionFont;
		m_captionFont.CreateFont(
			18,                        // 字体的高度			
			0,                         // 字体的宽度
			0,                         // 字体显示的角度
			0,                         // 字体的角度
			FW_BOLD,                   // 字体的磅数
			FALSE,                     // 斜体字体
			FALSE,                     // 带下划线的字体
			0,                         // 带删除线的字体
			ANSI_CHARSET,              // 所需的字符集
			OUT_DEFAULT_PRECIS,        // 输出的精度
			CLIP_DEFAULT_PRECIS,       // 裁减的精度
			DEFAULT_QUALITY,           // 逻辑字体与输出设备的实际字体之间的精度
			DEFAULT_PITCH | FF_SWISS,  // 字体间距和字体集
			_T("Arial"));              // 字体名称
			
		CFont* pOldFont = NULL;			
		pOldFont = pDC->SelectObject(&m_captionFont);
		
		rtTitle.left += m_rtIcon.Width ()+3;
		rtTitle.top = rtTitle.top;
		rtTitle.bottom = rtTitle.top + 30;
		CString m_strTitle;
		GetWindowText(m_strTitle);
		pDC->DrawText(m_strTitle, &rtTitle, DT_LEFT);
		pDC->SetBkMode(nOldMode);
		pDC->SetTextColor(clOldText);
		
		ReleaseDC(pDisplayMemDC);
		delete pDisplayMemDC;
		delete pBitmap;
	}
}


// 函 数 名:OnNcLButtonDown
// 功能描述:在非客户区单击 绘制消息
// 输入参数:
// 输出参数:void
// 创建日期:2006-2-20
// 修改日期:2006-2-20
// 作    者:joinclear
// 附加说明:无
void CTitleBarColorDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) 
{
	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));
			CRect rtWnd;
			GetWindowRect(&rtWnd);
			CRgn rgn;
			rgn.CreateRoundRectRgn(0,0,rtWnd.Width(),rtWnd.Height(),5,5);
			SetWindowRgn((HRGN)rgn,true); 
			Invalidate();
		}
		else
		{
			SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y));
			
			CRect rtWnd;
			GetWindowRect(&rtWnd);
			CRgn rgn;
			rgn.CreateRoundRectRgn(0,0,rtWnd.Width(),rtWnd.Height(),5,5);
			SetWindowRgn((HRGN)rgn,true); 
			Invalidate();
		}
	}
	else if (!IsZoomed())
		Default();
}

// 函 数 名:OnNcMouseMove
// 功能描述:在非客户区 鼠标移动 绘制消息
// 输入参数:
// 输出参数:void
// 创建日期:2006-2-20
// 修改日期:2006-2-20
// 作    者:joinclear
// 附加说明:无
void CTitleBarColorDlg::OnNcMouseMove(UINT nHitTest, CPoint point) 
{
	CWindowDC dc(this);
	CWindowDC* pDC = &dc;
	CDC* pDisplayMemDC=new CDC;
	pDisplayMemDC->CreateCompatibleDC(pDC);
	CBitmap* pBitmap = new CBitmap;
	CBitmap* pOldBitmap;
	CRect rtWnd, rtButton;
	
	if (pDC)
	{
		GetWindowRect(&rtWnd);
		
		//关闭button
		if (m_rtButtExit.PtInRect(point))
			pBitmap->LoadBitmap(IDB_EXIT_NORMAL);
		else
			pBitmap->LoadBitmap(IDB_EXIT_FOCUS);
		rtButton = m_rtButtExit;
		rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();
		
		//最大化/恢复button
		if (m_rtButtMax.PtInRect(point))
		{
			if (IsZoomed())
				pBitmap->LoadBitmap(IDB_RESTORE_FOCUS);
			else
				pBitmap->LoadBitmap(IDB_MAX_FOCUS);
		}
		else
		{
			if (IsZoomed())
				pBitmap->LoadBitmap(IDB_RESTORE_NORMAL);
			else
				pBitmap->LoadBitmap(IDB_MAX_NORMAL);
		}
		rtButton = m_rtButtMax;
		rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();
		
		//最小化button
		if (m_rtButtMin.PtInRect(point))
			pBitmap->LoadBitmap(IDB_MIN_FOCUS);
		else
			pBitmap->LoadBitmap(IDB_MIN_NORMAL);
		rtButton = m_rtButtMin;
		rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();
		
	}
	
	pDisplayMemDC->DeleteDC();
	
	delete pDisplayMemDC;
	delete pBitmap;

	CDialog::OnNcMouseMove(nHitTest, point);
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值