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)图片加载都会出现问题,有时是和源位图略有区别,有是只能显示一种位图,但我明明有三个不同的位图,急求解决方法


...全文
87 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
91program 2013-02-23
  • 打赏
  • 举报
回复
一直来说不行,就是因为代码中直接使用(0,0) 分析代码吧,应该不是什么难事。

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧