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);
}
{
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);
}
解决方案 »
- 如何选择一个矩形区域,然后只改变这一部分的颜色(GDI+)
- socket客服端如何检测到服务器上线?
- 请问谁有《com+编程指南》的配套源代码
- 是CListCtrl的问题...
- 如何重畫屏幕的某個區域,用InvalidateRect太慢了
- 哪位大神能提供一个C#与C++之间进行相互通信的源代码啊,能够相互发送数据和接收数据?求求您了,急用啊
- 请帮忙看一下sql语句能否执行
- 在C++编辑中,怎么可以对文件进行操作?
- 高手速度来 Visual Studio 2008的问题
- 请问怎么解码DVD格式的文件啊,以前没接触过这方面的东西,现在一点头绪都没有,是否有开源的工程呢?
- 怎么使用进度条?
- 有誰知道 開三次方的函數是什麼?
memDC.Attach(hdc);///
...
memDC.Detach();
总之,我认为问题出在这里。
不过看起来你好像已经正确地初始化了,看不出别的问题
要得到Bmp的大小,你试试
BITMAP bt;
bgbmp.getobject(&bt);
bt.width
bt.height;
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
-------------------------------------------应该是DC没有初始化吧,传递的参数hdc有没有问题?
我是在OnPaint中传递hdc的,代码如下
CClientDC dc(this)
DrawBMP(dc.GetSaftHDC(),bgbmp,.....);//后面的省略了To:wjqname(ccw) 、cnjj(待业王子)
我的代码你们没看懂这个函数,我不是画透明位图而是画遮照位图To:Mackz(在相互)、wjqname(ccw)
GetBMPSize(bgbmp)方法没问题实现和wjqname(ccw)写的一样只不过返回给一个SIZE变量
mdc.CreateCompatibleDC(&dc);
.......
还能正确吗?
{
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();
}
1.bgbmp.CreateCompatibleBitmap试了这句也通不过
-------------------------------------------你给出的代码没有这句话,所以我估计是DC的问题,现在好像不是2.到了mdc1.SelectObject(bgbmp);调试过不去
----------------------------------------
按说应该是这句话mdc1.SelectObject(bmp);调试不过去,因为你前面已经mdc1.SelectObject(bgbmp);再此调用SelectObject需要释放原来的资源,所以同意楼上, 也可以在BitBlt完后,DeleteObject。
{
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);
}