VC++ CButton绘制总结

主窗体背景发生改变,发现CButton虽然重绘了,但是背景仍旧是之前的背景,没有改变,所以在主窗体背景发生改变,需要通知所以子控件(CSWButton)重新绘制背景。

#define RIGHT_EDGE	10
#define TOP_EDGE	10
void CSWDialog::OnSize(UINT nType, int cx, int cy)
{
	CDialog::OnSize(nType, cx, cy);

	// TODO: 在此处添加消息处理程序代码
	if (m_pSysCloseBitmap && m_pSysMaxBitmap && m_pSysMinBitmap)
	{
		CRect rcClient; GetClientRect(rcClient);
		m_rcClose.left = rcClient.right - m_pSysCloseBitmap->GetWidth() / 3 - RIGHT_EDGE;
		m_rcClose.right = m_rcClose.left + m_pSysCloseBitmap->GetWidth() / 3;
		m_rcClose.top = TOP_EDGE;
		m_rcClose.bottom = m_rcClose.top + m_pSysCloseBitmap->GetHeight();

		m_rcMax.left = m_rcClose.left - 5 - m_pSysMaxBitmap->GetWidth() / 3;
		m_rcMax.right = m_rcMax.left + m_pSysMaxBitmap->GetWidth() / 3;
		m_rcMax.top = TOP_EDGE;
		m_rcMax.bottom = m_rcMax.top + m_pSysMaxBitmap->GetHeight() / 2;

		m_rcMin.left = m_rcMax.left - 5 - m_pSysMinBitmap->GetWidth() / 3;
		m_rcMin.right = m_rcMin.left + m_pSysMinBitmap->GetWidth() / 3;
		m_rcMin.top = TOP_EDGE;
		m_rcMin.bottom = m_rcMin.top + m_pSysMinBitmap->GetHeight();
	}

	if (nType == SIZE_MAXIMIZED || nType == SIZE_RESTORED)
	{
		DoNcPaint();
		InvalidateRect(NULL, TRUE);
		//::RedrawWindow(m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);// 通知窗口和所有子窗口重绘
		
		EnumChildWindows(m_hWnd, EnumChildWindowsProc, (LPARAM)&nType);
	}
}

此外,主窗体有3个系统按钮(最小化、最大化、关闭),这3个按钮刷新的时候不需要重绘整个背景,否则窗体上子控件会闪烁。

void CSWDialog::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (!m_bTracking)
	{
		TRACKMOUSEEVENT tme;
		tme.cbSize = sizeof(tme);
		tme.hwndTrack = m_hWnd;
		tme.dwFlags = TME_LEAVE;
		tme.dwHoverTime = 1;
		m_bTracking = _TrackMouseEvent(&tme);
	}

	int nOldSysMnuHover = m_nSysMnuHover;
	if (PtInRect(&m_rcMin, point))
		m_nSysMnuHover = SYSMNU_MIN;
	else if (PtInRect(&m_rcMax, point))
		m_nSysMnuHover = SYSMNU_MAX;
	else if (PtInRect(&m_rcClose, point))
		m_nSysMnuHover = SYSMNU_CLOSE;
	else
		m_nSysMnuHover = -1;
	
	if (m_nSysMnuHover != nOldSysMnuHover)
	{
        // 此处设计不够严谨,应该只刷新之前的焦点按钮和当前焦点的按钮
		InvalidateRect(&m_rcMin, FALSE);
		InvalidateRect(&m_rcMax, FALSE);
		InvalidateRect(&m_rcClose, FALSE);
	}

	CDialog::OnMouseMove(nFlags, point);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值