CDC绘图的问题 坐标使用不好
究级邪恶 2013-02-21 03:46:23 我根据《Windows CE嵌入式高级编程及其实例详解》上的2.4节编的程序,当x=0,y=0,应用程序能正确切换我的图片,如果我把调用函数换几个坐标,程序加载的图片就完全不对。
代码如下:
void CBitmap1Dlg::drawTransparent(CBitmap &bmp,int x,int y,int cx,int cy,int srcx,int srcy,CDC *pDC,COLORREF TransparentColor)
{
//定义源、掩码、透明绘制环境
CDC SrcDC,MaskDC,TransDC;
//定义掩码、透明位图
CBitmap MaskBmp,TransBmp;
BITMAP bm;
//创建源、掩码、透明绘制环境
SrcDC.CreateCompatibleDC(pDC);
MaskDC.CreateCompatibleDC(pDC);
TransDC.CreateCompatibleDC(pDC);
//得到位图结构
bmp.GetBitmap(&bm);
//创建透明位图
TransBmp.CreateCompatibleBitmap(pDC,cx,cy);
//创建掩码位图
MaskBmp.CreateBitmap(cx,cy,1,1,NULL);
//将透明位图对象选入透明位图环境
CBitmap *pTransBmp = TransDC.SelectObject(&TransBmp);
//将目标位图绘制到透明位图中
TransDC.BitBlt(x,y,cx,cy,pDC,srcx,srcy,SRCCOPY);
//将实际位图对象选入源绘图环境
CBitmap *pSrcBmp=SrcDC.SelectObject(&bmp);
//设背景为透明模式
SrcDC.SetBkMode(TRANSPARENT);
//设置背景色
if(TransparentColor)
SrcDC.SetBkColor(TransparentColor);
else
{
//设置位图左下角颜色为透明色
COLORREF col=SrcDC.GetPixel(0,bm.bmHeight-1);
SrcDC.SetBkColor(col);
}
CBitmap *pMaskBmp = MaskDC.SelectObject(&MaskBmp);
//将源绘图环境绘制到掩码绘图环境中
MaskDC.BitBlt(x,y,cx,cy,&SrcDC,0,0,SRCCOPY);
//将源位图和透明位图进行异或操作融合
TransDC.BitBlt(x,y,cx,cy,&SrcDC,0,0,SRCINVERT);
//将透明位图和掩码位图进行与操作
TransDC.BitBlt(x,y,cx,cy,&MaskDC,0,0,SRCAND);
//将源位图和透明位图进行异或操作
TransDC.BitBlt(x,y,cx,cy,&SrcDC,0,0,SRCINVERT);
//此时将透明位图绘制到目标设备上
BOOL bRet=pDC->BitBlt(x,y,cx,cy,&TransDC,srcx,srcy,SRCCOPY);
//绘制绘图环境对象,并释放相应绘图环境和位图对象
SrcDC.SelectObject(pSrcBmp);
SrcDC.DeleteDC();
TransDC.SelectObject(pTransBmp);
TransBmp.DeleteObject();
TransDC.DeleteDC();
MaskDC.SelectObject(pMaskBmp);
MaskDC.DeleteDC();
MaskBmp.DeleteObject();
}
按钮触发函数,按照坐标、图片进行显示:
void CBitmap1Dlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
CClientDC dc(this);
CBitmap bmp1;
BITMAP bm1;
bmp1.LoadBitmap(IDB_BITMAP1);
bmp1.GetBitmap(&bm1);
drawTransparent(bmp1,0,0,bm1.bmWidth,bm1.bmHeight,0,0,&dc,NULL);
bmp1.DeleteObject();
}
void CBitmap1Dlg::OnBnClickedButton2()
{
// TODO: Add your control notification handler code here
CClientDC dc(this);
CBitmap bmp2;
BITMAP bm2;
bmp2.LoadBitmap(IDB_BITMAP2);
bmp2.GetBitmap(&bm2);
drawTransparent(bmp2,0,0,bm2.bmWidth,bm2.bmHeight,0,0,&dc,NULL);
bmp2.DeleteObject();
}
void CBitmap1Dlg::OnBnClickedButton3()
{
// TODO: Add your control notification handler code here
CClientDC dc(this);
CBitmap bmp3;
BITMAP bm3;
bmp3.LoadBitmap(IDB_BITMAP3);
bmp3.GetBitmap(&bm3);
drawTransparent(bmp3,0,0,bm3.bmWidth,bm3.bmHeight,0,0,&dc,NULL);
bmp3.DeleteObject();
}
当三个调用函数drawTransparent(bmp3,0,0,bm3.bmWidth,bm3.bmHeight,0,0,&dc,NULL),都是x=0,y=0,应用程序能正确的切换图片,当坐标变了如,即使是同一个点(60,60)图片加载都会出现问题,有时是和源位图略有区别,有是只能显示一种位图,但我明明有三个不同的位图,急求解决方法