BitBlt无法实现图片显示

fjw666 2010-12-08 05:29:06
CPaintDC dc(this);
CRect rectClient;
GetClientRect(rectClient);

CDC memDC;
CBitmap memBitmap;
CBitmap *oldBitmap;

memDC.CreateCompatibleDC(&dc);
memBitmap.CreateCompatibleBitmap(&dc,rectClient.Width(),rectClient.Height());
oldBitmap=(CBitmap *)memDC.SelectObject(&memBitmap);

InvalidateCtrl();//第一张图:画出的坐标背景图
DrawPoints();//第二张图:实时的画出连线
memDC.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&m_dcGrid,0,0,SRCCOPY);
memDC.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&m_dcLine,0,0,SRCPAINT);
dc.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&memDC,0,0,SRCCOPY);


为什么只能显示出第一个图像,而第二张图是显示不出来的;
第一个图是一张背景,第二张是根据每秒钟输入点然后实时画直线;
我在调试中发现程序已经执行了画线,但是无法显示出来,一直都这都能出现第一张图像
...全文
426 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
fjw666 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 meiyu1986 的回复:]
没有必要这么麻烦

双缓冲主要解决屏幕重绘时闪烁的问题,

我一般步骤是
根据dc创建memDC
先在memDC中把所有的内容画出来
再用BitBlt转到dc中
最后删除memDC //要把你创建的的对象回收
[/Quote]

现在我也是这么做的
梵海木 2010-12-14
  • 打赏
  • 举报
回复
先用dc画,再转到memDC上,再用dc画出来。我用了好几个BitBlt啊
没有必要这么麻烦

双缓冲主要解决屏幕重绘时闪烁的问题,

我一般步骤是
根据dc创建memDC
在memDC中把所有的内容画出来
再用BitBlt转到dc中
最后删除memDC //要把你创建的的对象回收
fjw666 2010-12-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 meiyu1986 的回复:]
还有一点很奇怪:

InvalidateCtrl();//第一张图:画出的坐标背景图
DrawPoints();//第二张图:实时的画出连线


你在哪儿画这两个图,直接在memDC里画不就可以了吗 你不会在dc上画的吧??
[/Quote]

先用dc画,再转到memDC上,再用dc画出来。我用了好几个BitBlt啊
梵海木 2010-12-10
  • 打赏
  • 举报
回复
还有一点很奇怪:

InvalidateCtrl();//第一张图:画出的坐标背景图
DrawPoints();//第二张图:实时的画出连线


你在哪儿画这两个图,直接在memDC里画不就可以了吗 你不会在dc上画的吧??
梵海木 2010-12-10
  • 打赏
  • 举报
回复
双缓冲技术

//不知道你这第一张图是怎么画的?
//要先画一个非透明的矩形(假设你的图是矩形)把整个图覆盖,再画坐标系
InvalidateCtrl();//第一张图:画出的坐标背景图

个人建议要把这个分成两部分:
1 画一个填充矩形把整个画布给覆盖,画完之后这个图就是全白的
2 画坐标系


//VC 非MFC
HBITMAP bmp = ::CreateCompatibleBitmap(hdc, rect.right - rect.left, rect.bottom - rect.top);
m_bmpMemory = (HBITMAP)SelectObject(m_hdcMemory, bmp);

HFONT m_hFontNodeText;
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
lf.lfHeight = 14L;

m_hFontNodeText = CreateFontIndirect(&lf);

::SetBkMode(m_hdcMemory,TRANSPARENT);
SelectObject(m_hdcMemory, m_hFontNodeText);
Render(m_hdcMemory, m_dblZoom, rect); //BitBlt(hdc, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, m_hdcMemory, 0, 0, SRCCOPY);
BitBlt(hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, m_hdcMemory, 0, 0, SRCCOPY);
SelectObject(m_hdcMemory, m_hFontNodeText);
DeleteObject(m_hFontNodeText);
::DeleteObject(bmp);

DeleteDC(hdc);



void CNetControl::Render(HDC hdcMemory, double zoom, RECT rect)
{
DrawBackGround(hdcMemory, RGB(0, 0, 0), rect); if (NULL != m_pFibers)
{
m_pFibers->Render(hdcMemory, zoom, m_fInEditMode, m_iXOffSet, m_iYOffSet);
}

void CNetControl::DrawBackGround(HDC hdc, COLORREF fillColor, RECT rect)
{
HPEN hPenBorder = ::CreatePen(0, 1, RGB(0, 0, 0));
HBRUSH hBrushBackGround;
if (TRUE == m_fInEditMode)
{
hBrushBackGround = ::CreateSolidBrush(RGB(215, 215, 215));
}
else
{
hBrushBackGround = ::CreateSolidBrush(RGB(250, 250, 250));
}
::SelectObject(hdc, hPenBorder);
::SelectObject(hdc, hBrushBackGround);
::Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom); ::DeleteObject(hBrushBackGround);
::DeleteObject(hPenBorder);
}
if (NULL != m_pNodes)
{
m_pNodes->Render(hdcMemory, zoom, m_fInEditMode, m_iXOffSet, m_iYOffSet);
}
DrawCurrentState(m_hdcMemory, rect);
DrawBorder(m_hdcMemory, rect);
}
nscboy 2010-12-09
  • 打赏
  • 举报
回复
第二张图把第一张覆盖了.
建议你就将绘制操作分成两个函数(使用CDC* pDC作为参数),但都在同一个DC上完成.这样就没有问题了.
fjw666 2010-12-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 meiyu1986 的回复:]
重绘背景试试
[/Quote]

我就是用Invalidate()重绘的,然后就执行以下程序。第一二张都是重绘的,怎么还会有上一次的连线存在

InvalidateCtrl();//第一张图:画出的坐标背景图
DrawPoints();//第二张图:实时的画出连线
memDC.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&m_dcGrid,0,0,SRCCOPY);
memDC.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&m_dcLine,0,0,SRCPAINT);
dc.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&memDC,0,0,SRCCOPY);

梵海木 2010-12-09
  • 打赏
  • 举报
回复
重绘背景试试
梵海木 2010-12-09
  • 打赏
  • 举报
回复
是不是你第二张图背景色设为透明了,这样他就用原来图作为背景,那样前面的线当然不会被覆盖,你重绘试试看
fjw666 2010-12-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 nscboy 的回复:]
第二张图把第一张覆盖了.
建议你就将绘制操作分成两个函数(使用CDC* pDC作为参数),但都在同一个DC上完成.这样就没有问题了.
[/Quote]

我用的就是这个方法
fjw666 2010-12-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wltg2001 的回复:]
引用 6 楼 fjw666 的回复:
现在这个问题是解决了,但是显示出来的图片无法移动。
也就是之前画的线条还是出现在图片上,我明显用了Invalidate()重画了啊。

用Invalidate重画和移动有什么关系啊?
memDC.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&m_dcGrid,0,0,SRCCOPY);……
[/Quote]
我指的是图像的移动,因为是实时的根据输入的点进行各个点的连接。我做的是每秒中输入一个数据,这样就保证每秒钟连接一条线。给人感觉图像是动态。但是现在是在一秒钟以前的连线没有被清除,依然出现在图像上。
wltg2001 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fjw666 的回复:]
现在这个问题是解决了,但是显示出来的图片无法移动。
也就是之前画的线条还是出现在图片上,我明显用了Invalidate()重画了啊。
[/Quote]
用Invalidate重画和移动有什么关系啊?
memDC.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&m_dcGrid,0,0,SRCCOPY);
memDC.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&m_dcLine,0,0,SRCPAINT);
dc.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&memDC,0,0,SRCCOPY);
你上面的三个BitBlt都是从(0,0)点开始显示的,怎么会移动呢?
fjw666 2010-12-08
  • 打赏
  • 举报
回复
现在这个问题是解决了,但是显示出来的图片无法移动。
也就是之前画的线条还是出现在图片上,我明显用了Invalidate()重画了啊。
fjw666 2010-12-08
  • 打赏
  • 举报
回复
之前的问题是因为坐标的设置出现了问题
fjw666 2010-12-08
  • 打赏
  • 举报
回复
现在这个问题是解决了,但是显示出来的图片无法移动。
也就是之前画的线条还是出现在图片上,我明显用了Invalidate()重画了啊。
whrspsoft3723 2010-12-08
  • 打赏
  • 举报
回复
先不画第一张,看第二张能不能画出来。
yihandrensunyong 2010-12-08
  • 打赏
  • 举报
回复
是不是线颜色问题 或者 你背景图片 把线覆盖了
VC天下 2010-12-08
  • 打赏
  • 举报
回复
实时的画出连线
是不是用了局部变量,函数执行完就没了,所以没有显现出来,但在过程中“我在调试中发现程序已经执行了画线”

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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