双缓冲画图背景色问题

pasdtniuren 2009-05-18 12:53:06
用双缓冲在内存中画图我在图片上画了一条位置可以更新的线,但图片是有默认的背景色(黑色)的,怎么把背景色变成透明(我想把图片后面的窗体背景露出来)
void CPlayerDlg::Playduration() 
{ .....
CDC *dc = this->GetDC();
dcmem.CreateCompatibleDC(dc);
m_Bmp.CreateCompatibleBitmap(dc, m_rcGPS.right-m_rcGPS.left, m_rcGPS.bottom-m_rcGPS.top);
dcmem.SelectObject(m_Bmp);

/*位置可以更新的线*/
CPen newpen(PS_DASH,1,RGB(0,100,255));
CPen *oldPen = dcmem.SelectObject(&newpen);
dcmem.MoveTo(curh,0);
dcmem.LineTo(curh,m_rcGPS.bottom);
dcmem.MoveTo(curh+1,0);
dcmem.LineTo(curh+1,m_rcGPS.bottom);
dcmem.SelectObject(oldPen);

dc->BitBlt(m_rcGPS.left,m_rcGPS.top,m_rcGPS.right-m_rcGPS.left,m_rcGPS.bottom-m_rcGPS.top,&dcmem,0,0,SRCCOPY);
m_Bmp.DeleteObject();
dcmem.DeleteDC();
....
}

知道的请指点一下,谢谢
...全文
284 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
doudouHuY 2009-05-18
  • 打赏
  • 举报
回复
每次重绘的时候把固定不变的也重绘一下
梧桐168 2009-05-18
  • 打赏
  • 举报
回复
dcWindow:保存窗口背景图,
大致代码如下:
// 拷贝背景图
dcmem.Bitblt(&dcWindow, ...);
// 绘制当前线段
dcmem.MoveTo(0, (rcGPS.bottom - rcGPS.top)* 1/4);
dcmem.LineTo(rcGPS.right, (rcGPS.bottom - rcGPS.top)*1/4);
...
// 拷贝到窗口DC
Bitbl(dc->m_hDC,
m_rcGPS.top,m_rcGPS.left,rcGPS.right,rcGPS.bottom,&dcmem,0,0,rcGPS.right,rcGPS.bottom,RGB(100,100,200))
pasdtniuren 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 IT_Fly 的回复:]
引用 6 楼 pasdtniuren 的回复:
引用 5 楼 IT_Fly 的回复:
加上这行代码:#pragma comment(lib, "Msimg32.lib")

可以用了,内存绘制的图片背景也透明了,我原来以为这样就可以了但新问题来了,"更新的线"(位置可以变化的)上一次的线也存在着,有什么好方法将它擦除后再将新线画上去?

ps:分不够可以再加


每次画线之前,将底图保存在一个dcBack里,每次在dcmem上画新的线段之前将
dcBack拷贝到dcmem里, 这样…
[/Quote]
能说的在细致一些?如下的代码要是想实现"背景的线"只画一次,具体怎么做?谢谢!

void Cxxx::Playduration()
{
.....
CDC *dc = this->GetDC();
dcmem.CreateCompatibleDC(dc);
m_Bmp.CreateCompatibleBitmap(dc, m_rcGPS.right-m_rcGPS.left, m_rcGPS.bottom-m_rcGPS.top);
dcmem.SelectObject(m_Bmp);

/*这三条是不想更新的作为背景的线*/
CBrush newBrush(RGB(100,200,200));
CBrush *oldBrush = dcmem.SelectObject(&newBrush);
dcmem.SelectObject(oldBrush);
dcmem.MoveTo(0, (rcGPS.bottom - rcGPS.top)* 1/4);
dcmem.LineTo(rcGPS.right, (rcGPS.bottom - rcGPS.top)*1/4);
dcmem.MoveTo(0, (rcGPS.bottom - rcGPS.top)* 2/4);
dcmem.LineTo(rcGPS.right, (rcGPS.bottom - rcGPS.top)* 2/4);
dcmem.MoveTo(0, (rcGPS.bottom - rcGPS.top)* 3/4);
dcmem.LineTo(rcGPS.right, (rcGPS.bottom - rcGPS.top)* 3/4);


/*位置可以更新(移动)的线*/
CPen newpen(PS_DASH,1,RGB(0,100,255));
CPen *oldPen = dcmem.SelectObject(&newpen);
dcmem.MoveTo(curh,0);
dcmem.LineTo(curh,m_rcGPS.bottom);
dcmem.MoveTo(curh+1,0);
dcmem.LineTo(curh+1,m_rcGPS.bottom);
dcmem.SelectObject(oldPen);

//dc->BitBlt(m_rcGPS.left,m_rcGPS.top,m_rcGPS.right-m_rcGPS.left,m_rcGPS.bottom-m_rcGPS.top,&dcmem,0,0,SRCCOPY);
TransparentBlt(dc->m_hDC,m_rcGPS.top,m_rcGPS.left,rcGPS.right,rcGPS.bottom,dcmem,0,0,rcGPS.right,rcGPS.bottom,RGB(100,100,200));//链接(link)错误
m_Bmp.DeleteObject();
dcmem.DeleteDC();
....
}

梧桐168 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pasdtniuren 的回复:]
引用 5 楼 IT_Fly 的回复:
加上这行代码:#pragma comment(lib, "Msimg32.lib")

可以用了,内存绘制的图片背景也透明了,我原来以为这样就可以了但新问题来了,"更新的线"(位置可以变化的)上一次的线也存在着,有什么好方法将它擦除后再将新线画上去?

ps:分不够可以再加
[/Quote]
每次画线之前,将底图保存在一个dcBack里,每次在dcmem上画新的线段之前将
dcBack拷贝到dcmem里, 这样就不需要TransparentBlt了
pasdtniuren 2009-05-18
  • 打赏
  • 举报
回复
为啥没人说说那。。。我没说明白?
pasdtniuren 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 IT_Fly 的回复:]
加上这行代码:#pragma comment(lib, "Msimg32.lib")
[/Quote]
可以用了,内存绘制的图片背景也透明了,我原来以为这样就可以了但新问题来了,"更新的线"(位置可以变化的)上一次的线也存在着,有什么好方法将它擦除后再将新线画上去?

ps:分不够可以再加
梧桐168 2009-05-18
  • 打赏
  • 举报
回复
加上这行代码:#pragma comment(lib, "Msimg32.lib")
pasdtniuren 2009-05-18
  • 打赏
  • 举报
回复
为什么使用TransParentBlt 的时候编译后链接(Link)错误啊
xxx.obj : error LNK2001: unresolved external symbol __imp__TransparentBlt@44
xxx.exe : fatal error LNK1120: 1 unresolved externals

代码如下

void Cxxx::Playduration() 
{
.....
CDC *dc = this->GetDC();
dcmem.CreateCompatibleDC(dc);
m_Bmp.CreateCompatibleBitmap(dc, m_rcGPS.right-m_rcGPS.left, m_rcGPS.bottom-m_rcGPS.top);
dcmem.SelectObject(m_Bmp);

/*位置可以更新的线*/
CPen newpen(PS_DASH,1,RGB(0,100,255));
CPen *oldPen = dcmem.SelectObject(&newpen);
dcmem.MoveTo(curh,0);
dcmem.LineTo(curh,m_rcGPS.bottom);
dcmem.MoveTo(curh+1,0);
dcmem.LineTo(curh+1,m_rcGPS.bottom);
dcmem.SelectObject(oldPen);

//dc->BitBlt(m_rcGPS.left,m_rcGPS.top,m_rcGPS.right-m_rcGPS.left,m_rcGPS.bottom-m_rcGPS.top,&dcmem,0,0,SRCCOPY);
TransparentBlt(dc->m_hDC,m_rcGPS.top,m_rcGPS.left,rcGPS.right,rcGPS.bottom,dcmem,0,0,rcGPS.right,rcGPS.bottom,RGB(100,100,200));//链接(link)错误
m_Bmp.DeleteObject();
dcmem.DeleteDC();
....
}
pasdtniuren 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 IT_Fly 的回复:]
TransParentBlt
[/Quote]
我查查文档实验一下
m_tornado 2009-05-18
  • 打赏
  • 举报
回复
嗯~ls的方法可以。
贴出来时处理,把TransParentBlt的最后颜色写成黑色。会自动过滤掉黑色,显示除黑色意外的数据。
梧桐168 2009-05-18
  • 打赏
  • 举报
回复
TransParentBlt

19,469

社区成员

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

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