超级版主
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
|
回复: 在vc环境中,如何将一附图嵌入到另一幅图中
混叠:
G(x,y)=A(x,y)+B(x,y)
剪影:
G(x,y)=A(x,y)-B(x,y)
/////////////////////////////////
这是我的一段代码(用在CButton中的),楼主参照着用吧!
CClientDC dcClient(this);
CDC dcMem, dcMemBK, dcMemText;
CRect rectClient;
CBrush brDlg(m_clBK);
BITMAP biTemp;
//获取当前按钮的客户区矩形
this->GetClientRect(rectClient);
//创建当前按钮的内存设备对象
dcMem.CreateCompatibleDC(&dcClient);
if(m_pBitmap == NULL)
m_pBitmap = new CBitmap;
if(m_pBitmap->m_hObject == NULL)
m_pBitmap->CreateCompatibleBitmap(&dcClient, rectClient.Width(), rectClient.Height());
//设定当前的设备环境变量
CBitmap *pBitmapOld = dcMem.SelectObject(m_pBitmap);
COLORREF clBKOld = dcMem.SetBkColor(m_clBK);
CBrush *pbrOld = dcMem.SelectObject(&brDlg);
m_pBitmap->GetBitmap(&biTemp);
dcMem.Rectangle(rectClient);
/////////////////////////////////////////////////////////
////显示当前图片背景 Begin///////////////////////////////
//创建当前按钮背景图片的内存设备对象
if(m_pBKBitmap != NULL && m_pBKBitmap->m_hObject != NULL)
{
CRect rectScr, rectDesc;
dcMemBK.CreateCompatibleDC(&dcMem);
CBitmap *pBitmapOld_BK = dcMemBK.SelectObject(m_pBKBitmap);
COLORREF clOld_BK = dcMemBK.SetBkColor(m_clBK);
CBrush *pbrOld_BK = dcMemBK.SelectObject(&brDlg);
m_pBKBitmap->GetBitmap(&biTemp);
rectScr.left = 0;
rectScr.top = 0;
rectScr.right = biTemp.bmWidth;
rectScr.bottom = biTemp.bmHeight;
switch(m_eShowType)
{
case MBBST_LEFTTOP:
rectDesc.left = rectClient.left;
rectDesc.right = rectDesc.left + rectScr.Width();
rectDesc.top = rectClient.top;
rectDesc.bottom = rectDesc.top + rectScr.Height();
break;
case MBBST_FULLBUTTON:
rectDesc.left = rectClient.left;
rectDesc.right = rectClient.right;
rectDesc.top = rectClient.top;
rectDesc.bottom = rectClient.bottom;
break;
case MBBST_CENTER:
default:
rectDesc.left = rectClient.left + (rectClient.Width() - rectScr.Width()) / 2;
rectDesc.right = rectDesc.left + rectScr.Width();
rectDesc.top = rectClient.top + (rectClient.Height() - rectScr.Height()) / 2;
rectDesc.bottom = rectDesc.top + rectScr.Height();
break;
}
if(m_bTransparent)
::TransparentBlt(dcMem, rectDesc.left, rectDesc.top, rectDesc.Width(), rectDesc.Height(), dcMemBK, rectScr.left, rectScr.top, rectScr.Width(), rectScr.Height(), m_clTransparent);
else
::StretchBlt(dcMem, rectDesc.left, rectDesc.top, rectDesc.Width(), rectDesc.Height(), dcMemBK, rectScr.left, rectScr.top, rectScr.Width(), rectScr.Height(), SRCCOPY);
dcMemBK.SelectObject(pbrOld_BK);
dcMemBK.SetBkColor(clOld_BK);
dcMemBK.SelectObject(pBitmapOld_BK);
dcMemBK.DeleteDC();
}
////显示当前图片背景 End///////////////////////////////
//显示文本信息 Begin/////////////////////////////////////
CString strTemp;
this->GetWindowText(strTemp);
if(strTemp.GetLength() > 0)
{
dcMemText.CreateCompatibleDC(&dcClient);
if(m_pTextBitmap == NULL)
m_pTextBitmap = new CBitmap;
if(m_pTextBitmap->m_hObject == NULL)
m_pTextBitmap->CreateCompatibleBitmap(&dcMem, rectClient.Width(), rectClient.Height());
CBitmap *pBitmapOld_Text = dcMemText.SelectObject(m_pTextBitmap);
COLORREF clBKOld_Text = dcMemText.SetBkColor(m_clBK);
CBrush *pbrOld_Text = dcMemText.SelectObject(&brDlg);
CFont *pFontOld = dcMemText.SelectObject(this->GetFont());
dcMemText.Rectangle(rectClient);
dcMemText.DrawText(strTemp, rectClient, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
::TransparentBlt(dcMem, rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(), dcMemText, rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(), m_clBK);
dcMemText.SelectObject(pFontOld);
dcMemText.SetBkColor(clBKOld_Text);
dcMemText.SelectObject(pbrOld_Text);
dcMemText.SelectObject(pBitmapOld_Text);
dcMemText.DeleteDC();
}
//显示文本信息 End///////////////////////////////////////
/////////////////////////////////////////////////////////
dcMem.GetCurrentBitmap()->GetBitmap(&biTemp);
//设定当前按钮的最终位图图片
this->SetBitmap(*(dcMem.GetCurrentBitmap()));
//还原当前设备环境变量信息
dcMem.SelectObject(pbrOld);
dcMem.SetBkColor(clBKOld);
dcMem.SelectObject(pBitmapOld);
dcMem.DeleteDC();
this->Invalidate();
__________________
借用达朗贝尔的名言:前进吧,你会得到信心!
[url="http://www.dimcax.com"]几何尺寸与公差标准[/url]
|