溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用CImage類在Pictrue控件上畫圖片

發(fā)布時間:2020-07-22 17:00:07 來源:網(wǎng)絡(luò) 閱讀:1390 作者:Chinayu2014 欄目:編程語言

(1)從文件中加載圖片

void CScale3DCUserManageView::OnDraw(CDC* pDC)
{
	// TODO: 在此添加專用代碼和/或調(diào)用基類
	CImage image; //創(chuàng)建圖片類  
	USES_CONVERSION;
	INT re = _access(W2A(m_strUserPicPath), 0);//判文件是否存在
	if (re == -1)return;

	image.Load(m_strUserPicPath); //根據(jù)圖片路徑加載圖片  
	CRect rect;//定義矩形類  
	int cx = image.GetWidth();//獲取圖片寬度  
	int cy = image.GetHeight();//獲取圖片高度  

	m_picUserIcon.GetClientRect(&rect);//獲得pictrue控件所在的矩形區(qū)域  
	CDC *pDC1 = m_picUserIcon.GetDC();//獲得pictrue控件的DC  

	rect.right = rect.left + 126;
	rect.bottom = rect.top + 126;
	image.Draw(pDC1->m_hDC, rect); //將圖片畫到Picture控件表示的矩形區(qū)域  
	ReleaseDC(pDC1);//釋放picture控件的DC  
}

(2)將CImage轉(zhuǎn)成HBITMAP,代碼如下:

CImage img;
CBitmap  bitmap;
img.Load(strIcon);
HBITMAP hbmp = (HBITMAP)img.operator HBITMAP();

在要HBITMAP的地方使用.

(3)和用CImage縮小圖像,代碼如下:

m_img.Load(strIcon);//CImage從路徑中加載圖片
m_iconImage.Create(32, 32, 32);//CImage相當于創(chuàng)一幅空白圖片
m_img.StretchBlt(m_iconImage.GetDC(), CRect(0,0,32,32));//畫圖
m_iconImage.ReleaseDC();//釋放
pAppButton->SetImage(m_iconImage.operator HBITMAP());//畫到主按鈕上

(4)CImage取出DLL中的位圖資源并顯示,如下:

#include <atlimage.h>//在.h中聲明CImge類的變量可能需要
HINSTANCE temp = AfxGetResourceHandle();
AfxSetResourceHandle(GetModuleHandle(_T("Scale3DCDeviceManage")));//DLL名稱
m_img.LoadFromResource(AfxGetResourceHandle(), IDB_BITMAP7);
AfxSetResourceHandle(temp);

//將圖片顯示到窗口上
CPaintDC dc(this); 
m_img.SetTransparentColor(RGB(255, 255, 255));//透明色
m_img.TransparentBlt(dc.m_hDC, CRect(5, 5, 40, 40));

(5)圖像上有CStatic控件,需要局部刷新圖像控件

CRect rt;
m_staTitle.GetWindowRect(&rt);
ScreenToClient(&rt);
InvalidateRect(rt);

(6)取出資源中的PNG圖片,并顯示到Pictrue控件上.

BOOL CInstallDlg::LoadImageFromResource(ATL::CImage *pImage, UINT nResID, LPCTSTR lpTyp)
{
	if(pImage == NULL)return false;
	pImage->Destroy();
	// 查找資源
	HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp);
	if (hRsrc == NULL)return false;
	// 加載資源
	HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc);
	if (hImgData == NULL)
	{
		::FreeResource(hImgData);
		return false;
	}
	// 鎖定內(nèi)存中的指定資源
	LPVOID lpVoid    = ::LockResource(hImgData);

	LPSTREAM pStream = NULL;
	DWORD dwSize     = ::SizeofResource(AfxGetResourceHandle(), hRsrc);
	HGLOBAL hNew     = ::GlobalAlloc(GHND, dwSize);
	LPBYTE lpByte    = (LPBYTE)::GlobalLock(hNew);
	::memcpy(lpByte, lpVoid, dwSize);
	//解除內(nèi)存中的指定資源
	::GlobalUnlock(hNew);
	//從指定內(nèi)存創(chuàng)建流對象
	HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &pStream);
	if (ht != S_OK)
	{
		GlobalFree(hNew);
	}
	else
	{
		// 加載圖片
		pImage->Load(pStream);
		GlobalFree(hNew);
	}
	// 釋放資源
	::FreeResource(hImgData);
	return true;
}

void CInstallDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息處理程序代碼和/或調(diào)用默認值
	static INT  uID = IDB_PNG1;
	LoadImageFromResource(&m_img, uID, _T("PNG"));

	SendMessage(WM_PAINT, 0, 0);
	SendMessage(WM_ERASEBKGND, 0, 0);

	uID++;
	if (uID >= IDB_PNG4)uID = IDB_PNG1;

	CDialogEx::OnTimer(nIDEvent);
}

顯示到圖片控件中,如下

void CInstallDlg::OnPaint()
{
	CPaintDC  dc(this);

	CRect  rect;
	CDC *pDC1 = m_pic.GetDC();//獲得pictrue控件的DC  

	rect.top    = 260;
	rect.left   = 0;
	rect.right  =  600;
	rect.bottom = 260+ 328;
	m_img.SetTransparentColor(RGB(255, 255, 255));
	//m_img.Draw(pDC1->m_hDC, rect); //將圖片畫到Picture控件表示的矩形區(qū)域  
	m_img.TransparentBlt(pDC1->m_hDC, rect);

	ReleaseDC(pDC1);//釋放picture控件的DC  
}

圖片控件刷新后,才能顯示,如下:

	SendMessage(WM_PAINT, 0, 0);
	SendMessage(WM_ERASEBKGND, 0, 0);


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI