文章类型: VC&C++
关键词: VC,动态,显示,移动,透明,图片,实现方法,源码,下载
内容摘要: “VC动态显示并移动透明图片"的实现方法并附源码下载

“VC动态显示并移动透明图片"的实现方法并附源码下载

2018/3/9 12:00:40    来源:apple    阅读:

最近做项目时,用到了动态移动透明图片的功能,在网上找了很多资料,但是没有找到动态移动透明图片的代码和思路,于是自己想方设法进行实现了,下面给出代码和实现思路。

首先:将上一篇文章中的Picture Control,即图片控件,改为动态实现,由于图片控件也是基础CStatic类实现的,所以首先定义其对象:

CStatic *myStatic;

接着在函数“virtual BOOL OnInitDialog();”中生成myStatic的对象,代码如下:

BOOL CMovepicDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here

	myStatic = new CStatic;
	myStatic->Create(_T("静态文本"), WS_CHILD | SS_BITMAP | SS_NOTIFY, CRect(0, 0, 0, 0), this, 2000);
	myStatic->ShowWindow(true);
	x = 5;
	y = 5;
	return TRUE;  // return TRUE  unless you set the focus to a control
}


接着在函数OnPaint()中实现透明图片显示功能

void CMovepicDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		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;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}

	CDC *pDC = NULL;
	HDC hDC = NULL;
	HBITMAP m_hBitmap;
	m_hBitmap = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));

	pDC = myStatic->GetDC();
	hDC = pDC->m_hDC;
	pDC->SetBkMode(TRANSPARENT);
	DrawTransparentBitmap(hDC, m_hBitmap, 0, 0, RGB(255, 255, 255));
	
	ReleaseDC(pDC);
	pDC = NULL;
	//Invalidate(FALSE);
}

void CMovepicDlg::DrawTransparentBitmap(HDC hdc, HBITMAP hBitmap, short xStart,
										short yStart, COLORREF cTransparentColor)
{
	BITMAP     bm;
	COLORREF   cColor;
	HBITMAP    bmAndBack, bmAndObject, bmAndMem, bmSave;
	HBITMAP    bmBackOld, bmObjectOld, bmMemOld, bmSaveOld;
	HDC        hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave;
	POINT      ptSize;
	
	hdcTemp = CreateCompatibleDC(hdc);
	SelectObject(hdcTemp, hBitmap);   // Select the bitmap
	
	GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
	ptSize.x = bm.bmWidth;            // Get width of bitmap
	ptSize.y = bm.bmHeight;           // Get height of bitmap
	//	DPtoLP(hdcTemp, &ptSize, 1);      // Convert from device
	
	// to logical points
	
	// Create some DCs to hold temporary data.
	hdcBack   = CreateCompatibleDC(hdc);
	hdcObject = CreateCompatibleDC(hdc);
	hdcMem    = CreateCompatibleDC(hdc);
	hdcSave   = CreateCompatibleDC(hdc);
	
	// Create a bitmap for each DC. DCs are required for a number of
	// GDI functions.
	
	// Monochrome DC
	bmAndBack   = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);
	
	// Monochrome DC
	bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);
	
	bmAndMem    = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
	bmSave      = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
	
	// Each DC must select a bitmap object to store pixel data.
	bmBackOld   = (HBITMAP)SelectObject(hdcBack, bmAndBack);
	bmObjectOld = (HBITMAP)SelectObject(hdcObject, bmAndObject);
	bmMemOld    = (HBITMAP)SelectObject(hdcMem, bmAndMem);
	bmSaveOld   = (HBITMAP)SelectObject(hdcSave, bmSave);
	
	// Set proper mapping mode.
	//	SetMapMode(hdcTemp, GetMapMode(hdc));
	
	// Save the bitmap sent here, because it will be overwritten.
	BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);
	
	// Set the background color of the source DC to the color.
	// contained in the parts of the bitmap that should be transparent
	cColor = SetBkColor(hdcTemp, cTransparentColor);
	
	// Create the object mask for the bitmap by performing a BitBlt
	// from the source bitmap to a monochrome bitmap.
	BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0,
		SRCCOPY);
	
	// Set the background color of the source DC back to the original
	// color.
	SetBkColor(hdcTemp, cColor);
	
	// Create the inverse of the object mask.
	BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0,
		NOTSRCCOPY);
	
	// Copy the background of the main DC to the destination.
	BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart,
		SRCCOPY);
	
	// Mask out the places where the bitmap will be placed.
	BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);
	
	// Mask out the transparent colored pixels on the bitmap.
	BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);
	
	// XOR the bitmap with the background on the destination DC.
	BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT);
	
	// Copy the destination to the screen.
	BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0,
		SRCCOPY);
	
	// Place the original bitmap back into the bitmap sent here.
	BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);
	
	// Delete the memory bitmaps.
	DeleteObject(SelectObject(hdcBack, bmBackOld));
	DeleteObject(SelectObject(hdcObject, bmObjectOld));
	DeleteObject(SelectObject(hdcMem, bmMemOld));
	DeleteObject(SelectObject(hdcSave, bmSaveOld));
	
	// Delete the memory DCs.
	DeleteDC(hdcMem);
	DeleteDC(hdcBack);
	DeleteDC(hdcObject);
	DeleteDC(hdcSave);
	DeleteDC(hdcTemp);
}


接下来实现移动功能:

void CMovepicDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	y=y+5;
	x=x+5;

	myStatic->MoveWindow(x, y, 32, 32, TRUE);
	Invalidate();
}


示例图如下:

blob.png


下面附源码下载:

movepic_动态改进版.rar

↑ 上一篇文章:“VC picture控件显示透明图片,并移动图片,透明可以了,但是有重影”的解决方法 关键词:VC,移动,透明,图,阴影,picture,控件 发布日期:2018/3/7 16:33:05
↓ 下一篇文章:MFC数组类CArray的使用的操作详解 关键词:MFC,数组,类,CArray,使用,操作,详解 发布日期:2018/3/14 14:37:23
相关文章:
Winform中ListView鼠标移动使用ToolTip动态显示信息 关键词:C#,Winform,ListView,鼠标移动,ToolTip,动态,显示,位置,信息 发布日期:2015-07-21 16:05
“VC picture控件显示透明图片,并移动图片,透明可以了,但是有重影”的解决方法 关键词:VC,移动,透明,图,阴影,picture,控件 发布日期:2018-03-07 16:33
VC中MFC框架中实现接口的思路及其源码下载 关键词:VC,MFC,接口,实现,源码,下载,LNK2019,LNK1120,无法解析的外部符号 发布日期:2016-08-26 12:20
相关目录:.NETVC&C++软件开发
我要评论
正在加载评论信息......