这段CDC 画图代码 请问哪里错了?

winsunII 2003-11-22 05:03:08
void DrawBMP(HDC hdc , CBitmap * bgbmp , CBitmap * bmp , CBitmap * bmpmask , POINT pt , int num)
{
CDC dc;
CDC mdc,mdc1;
dc.Attach(hdc);
mdc.CreateCompatibleDC(&dc);
mdc1.CreateCompatibleDC(&dc);

SIZE bgbmpsize = GetBMPSize(bgbmp); //GetBMPSize()为获得Bmp图的宽和高

mdc1.SelectObject(bgbmp);
mdc.BitBlt(0,0,bgbmpsize.cx,bgbmpsize.cy,&mdc1,0,0,SRCCOPY);

SIZE bmpsize = GetBMPSize(bmp);
mdc1.SelectObject(bmp);
mdc.BitBlt(pt.x,pt.y,bmpsize.cx/4,bmpsize.cy,&mdc1,bmpsize.cx/4*num,0,SRCAND);
mdc1.SelectObject(bmpmask);
mdc.BitBlt(pt.x,pt.y,bmpsize.cx/4,bmpsize.cy,&mdc1,0,0,SRCPAINT);

dc.BitBlt(0,0,GetBMPSize(bgbmp).cx,GetBMPSize(bgbmp).cy,&mdc,0,0,SRCCOPY);

}
...全文
78 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2003-11-25
  • 打赏
  • 举报
回复
试试下面这样:

void DrawBMP(HDC hdc , CBitmap * bgbmp , CBitmap * bmp , CBitmap * bmpmask , POINT pt , int num)
{
CDC *dc;
CDC mdc,mdc1;
dc = CDC::FromHandle(hdc);
mdc.CreateCompatibleDC(dc);
mdc1.CreateCompatibleDC(dc);

//SIZE bgbmpsize = GetBMPSize(bgbmp); //GetBMPSize()为获得Bmp图的宽和高

mdc.SelectObject(bgbmp);
//mdc.BitBlt(0,0,bgbmpsize.cx,bgbmpsize.cy,&mdc1,0,0,SRCCOPY);

SIZE bmpsize = GetBMPSize(bmp);
mdc1.SelectObject(bmp);
mdc.BitBlt(pt.x,pt.y,bmpsize.cx/4,bmpsize.cy,&mdc1,bmpsize.cx/4*num,0,SRCAND);
mdc1.SelectObject(bmpmask);
mdc.BitBlt(pt.x,pt.y,bmpsize.cx/4,bmpsize.cy,&mdc1,0,0,SRCPAINT);

dc->BitBlt(0,0,GetBMPSize(bgbmp).cx,GetBMPSize(bgbmp).cy,&mdc,0,0,SRCCOPY);

}
winsunII 2003-11-24
  • 打赏
  • 举报
回复
To:xinyu()
我是在OnPaint中传递hdc的,代码如下
CClientDC dc(this)
DrawBMP(dc.GetSaftHDC(),bgbmp,.....);//后面的省略了

To:wjqname(ccw) 、cnjj(待业王子)
我的代码你们没看懂这个函数,我不是画透明位图而是画遮照位图

To:Mackz(在相互)、wjqname(ccw)
GetBMPSize(bgbmp)方法没问题实现和wjqname(ccw)写的一样只不过返回给一个SIZE变量
xinyu 2003-11-24
  • 打赏
  • 举报
回复
错了,DeleteObject不是CDC的函数
xinyu 2003-11-24
  • 打赏
  • 举报
回复

1.bgbmp.CreateCompatibleBitmap试了这句也通不过
-------------------------------------------

你给出的代码没有这句话,所以我估计是DC的问题,现在好像不是

2.到了mdc1.SelectObject(bgbmp);调试过不去
----------------------------------------
按说应该是这句话mdc1.SelectObject(bmp);调试不过去,因为你前面已经mdc1.SelectObject(bgbmp);再此调用SelectObject需要释放原来的资源,所以同意楼上, 也可以在BitBlt完后,DeleteObject。
fingerfox 2003-11-24
  • 打赏
  • 举报
回复
void DrawBMP(HDC hdc , CBitmap * bgbmp , CBitmap * bmp , CBitmap * bmpmask , POINT pt , int num)
{
CDC dc;
CDC mdc,mdc1;
dc.Attach(hdc);
mdc.CreateCompatibleDC(&dc);
mdc1.CreateCompatibleDC(&dc);

SIZE bgbmpsize = GetBMPSize(bgbmp); //GetBMPSize()为获得Bmp图的宽和高

CBitmap* pOldBMP = mdc1.SelectObject(bgbmp);
mdc.BitBlt(0,0,bgbmpsize.cx,bgbmpsize.cy,&mdc1,0,0,SRCCOPY);

SIZE bmpsize = GetBMPSize(bmp);
mdc1.SelectObject(pOldBMP);
pOldBMP = mdc1.SelectObject(bmp);
mdc.BitBlt(pt.x,pt.y,bmpsize.cx/4,bmpsize.cy,&mdc1,bmpsize.cx/4*num,0,SRCAND);
mdc1.SelectObject(pOldBMP);
pOldBMP = mdc1.SelectObject(bmpmask);
mdc.BitBlt(pt.x,pt.y,bmpsize.cx/4,bmpsize.cy,&mdc1,0,0,SRCPAINT);
mdc1.SelectObject(pOldBMP);
dc.BitBlt(0,0,GetBMPSize(bgbmp).cx,GetBMPSize(bgbmp).cy,&mdc,0,0,SRCCOPY);
dc.Detach();
}
fingerfox 2003-11-24
  • 打赏
  • 举报
回复
我犯错误了,FAINT!....
fingerfox 2003-11-24
  • 打赏
  • 举报
回复
CDC dc;
mdc.CreateCompatibleDC(&dc);
.......
还能正确吗?
xinyu 2003-11-23
  • 打赏
  • 举报
回复
bgbmp.CreateCompatibleBitmap试了这句也通不过
-------------------------------------------

应该是DC没有初始化吧,传递的参数hdc有没有问题?
ACA 2003-11-22
  • 打赏
  • 举报
回复
try it

BOOL TransparentBlt(
HDC hdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int hHeightDest, // 目标高度
HDC hdcSrc, // 源DC
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
int nWidthSrc, // 源宽度
int nHeightSrc, // 源高度
UINT crTransparent // 透明色,COLORREF类型
);

api函数,用来画透明位图,工程中加入msimg32.lib
wjqname 2003-11-22
  • 打赏
  • 举报
回复
你要画透明位图,其实有很多方法,
要得到Bmp的大小,你试试
BITMAP bt;
bgbmp.getobject(&bt);
bt.width
bt.height;
菜牛 2003-11-22
  • 打赏
  • 举报
回复
GetBMPSize(bgbmp)里是否有改变了bgbmp的操作。
winsunII 2003-11-22
  • 打赏
  • 举报
回复
bgbmp.CreateCompatibleBitmap试了这句也通不过
romberg2002 2003-11-22
  • 打赏
  • 举报
回复
bgbmp.CreateCompatibleBitmap(&dc,nW,nH);///nW:宽;nH:高

不知道bgbmp是否已经用兼容的DC初始化,你试试吧
不过看起来你好像已经正确地初始化了,看不出别的问题
romberg2002 2003-11-22
  • 打赏
  • 举报
回复
不好意思,上面代码没看清,我再看看!!!!
romberg2002 2003-11-22
  • 打赏
  • 举报
回复
CDC dc;///这里dc没有初始化
memDC.Attach(hdc);///
...
memDC.Detach();
总之,我认为问题出在这里。
winsunII 2003-11-22
  • 打赏
  • 举报
回复
到了mdc1.SelectObject(bgbmp);调试过不去
enoloo 2003-11-22
  • 打赏
  • 举报
回复
楼主是什么错误?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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