当前位置:C++技术网 > 资讯 > 鼠标移动时的背景透明文字不透明的实时提示框效果MFC实现

鼠标移动时的背景透明文字不透明的实时提示框效果MFC实现

更新时间:2016-01-14 17:25:51浏览次数:1+次

鼠标移动时的背景透明文字不透明的实时提示框效果MFC实现

鼠标移动时的背景透明文字不透明的实时提示框效果实现》用win32完美的实现出来了,并且做了详细的解释,请你仔细看看。在这里我就不多说了,直接贴出MFC的代码:

void C提示框Dlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		PAINTSTRUCT ps;
		CDC *pDC=BeginPaint(&ps);
		GetClientRect(&rectClient);
		pDC->SelectObject(CreatePen(PS_SOLID,0,RGB(120,120,120)));
		for(int i=0; i<rectClient.Width(); i+=50)
		{
			pDC->MoveTo(i,0);
			pDC->LineTo(i,rectClient.bottom);
		}
		for(int j=0; j<rectClient.Height();j+=50)
		{
			pDC->MoveTo(0,j);
			pDC->LineTo(rectClient.right,j);
		}
		DeleteObject(pDC->SelectObject(GetStockObject(WHITE_PEN)));
		if(!IsFirst)
		{
			pDC->SetBkColor(RGB(255,244,10));
			wsprintf(msg,_T(" %d,%d "),ptNew.x,ptNew.y);
			pDC->SetTextColor(RGB(0,0,0));
			pDC->TextOutW(ptNew.x+15,ptNew.y+10,msg);
		}
		else
		{
			IsFirst=false;
		}
		EndPaint(&ps);
		CDialogEx::OnPaint();
	}
}
void C提示框Dlg::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	ptNew.x=point.x;
	ptNew.y=point.y;
	CDC *pDC=GetDC();

	pDC->SelectObject(GetStockObject(WHITE_BRUSH));
	pDC->SelectObject(GetStockObject(NULL_PEN));
	pDC->Ellipse(ptOld.x,ptOld.y,ptOld.x+100,ptOld.y+35);

	pDC->SelectObject(CreateSolidBrush(RGB(255,150,10)));
	pDC->SelectObject(GetStockObject(NULL_PEN));
	pDC->Ellipse(ptNew.x,ptNew.y,ptNew.x+100,ptNew.y+35);
	DeleteObject(pDC->SelectObject(GetStockObject(WHITE_BRUSH)));

	ptOld.x=ptNew.x;
	ptOld.y=ptNew.y;
	
	Invalidate(FALSE);
	SetTimer(1,500,NULL);
	ReleaseDC(pDC);
	CDialogEx::OnMouseMove(nFlags, point);
}


void C提示框Dlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CDC *pDC=GetDC();
	pDC->SelectObject(GetStockObject(WHITE_BRUSH));
	pDC->SelectObject(GetStockObject(NULL_PEN));
	pDC->Ellipse(ptOld.x,ptOld.y,ptOld.x+100,ptOld.y+35);

	pDC->SelectObject(CreatePen(PS_SOLID,0,RGB(120,120,120)));

	for(int i=0; i<rectClient.Width(); i+=50)
	{
		pDC->MoveTo(i,0);
		pDC->LineTo(i,rectClient.bottom);
	}
	for(int j=0; j<rectClient.Height();j+=50)
	{
		pDC->MoveTo(0,j);
		pDC->LineTo(rectClient.right,j);
	}
	ReleaseDC(pDC);
	CDialogEx::OnTimer(nIDEvent);
}
代码实现: