CDC绘图,为什么闪一下就没了?

dxiuquan 2009-12-14 10:41:38
我的代码:

CDC* pDC=mTabChart.GetDC();
CDC* m_pMemoryDC = new CDC();
CBitmap * m_pBitmap = new CBitmap();
m_pMemoryDC->CreateCompatibleDC(pDC);
m_pBitmap->CreateCompatibleBitmap(pDC,mRectChart.right+1,mRectChart.bottom+1);
CBitmap * pOldbmp=m_pMemoryDC->SelectObject(m_pBitmap);
m_pMemoryDC->PatBlt(0,0,mRectChart.right, mRectChart.bottom,PATCOPY);//画出白色背景
m_pMemoryDC->SetROP2(R2_COPYPEN);//设定绘图模式
pDC->SetBkMode(TRANSPARENT);
m_pMemoryDC->SetBkMode(TRANSPARENT);
this->DrawSignal(m_pMemoryDC); //绘测量信号
pDC->BitBlt(0, 0, mRectChart.right, mRectChart.bottom, m_pMemoryDC, 0, 0, SRCCOPY);

m_pMemoryDC->SelectObject(pOldbmp);
m_pMemoryDC->DeleteDC();
m_pBitmap->DeleteObject();

delete m_pBitmap;
delete m_pMemoryDC;

mTabChart.ReleaseDC(pDC);

void DrawSignal(CDC* m_pMemoryDC)
{
m_pMemoryDC->Rectangle(mRectSignal); //信号图外框
m_pMemoryDC->SelectObject(mPenBox);
DrawLine(m_pMemoryDC,mpCLZero.x,mpCLZero.y,mpCLZero.x+250,mpCLZero.y);
DrawLine(m_pMemoryDC,mpCHZero.x,mpCHZero.y,mpCHZero.x+250,mpCHZero.y);

//刻度线
m_pMemoryDC->SelectObject(mPenCL);
DrawLine(m_pMemoryDC,mpCLZero.x,mpCLZero.y-mHeightSignal/9,mpCLZero.x+250,mpCLZero.y-mHeightSignal/9);
DrawLine(m_pMemoryDC,mpCLZero.x,mpCLZero.y-mHeightSignal/9*2,mpCLZero.x+250,mpCLZero.y-mHeightSignal/9*2);
.......



现在的问题是:打开窗口图一闪就没有了,是怎么回事呢?需要怎么解决啊
...全文
172 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yujunnb 2009-12-15
  • 打赏
  • 举报
回复
看看
fandh 2009-12-15
  • 打赏
  • 举报
回复
是不是在static控件上面?你改成picturectrl控件!
dxiuquan 2009-12-15
  • 打赏
  • 举报
回复
发现只要是静态控件就不会被覆盖,否则就要被覆盖。
xxfxiazai 2009-12-15
  • 打赏
  • 举报
回复
onDraw函数里有没有写贴图代码?
mmilmf 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dxiuquan 的回复:]
我发现可能是这个原因:我在窗体上加了一个tab control,其成员变量为:mTabChart,绘图就是在这个mTabChart里面绘的,估计是我首先在这个mTabChart里面绘了图,然后又被窗体的paint事件涂掉了。但是如果是这样的话,那应该怎么处理呢?
[/Quote]

定义一个CBitmap m_Bit;//.h
在窗口的OnPaint()函数中写上

CDC mapDC;
mapDC.CreateCompatibleDC( &dc );
CBitmap* pOB = mapDC.SelectObject( &m_Bit );

dc.BitBlt( 0, 0, MAXSIZEX , MAXSIZEY, &mapDC, 0, 0, SRCCOPY );

mapDC.SelectObject( pOB );

MAXSIZEX , MAXSIZEY可以换成Tab control的大小,

在Tab Ctrl控件上绘图的时候

CClientDC dc(pMainWnd);

CBitmap m_Bitmap ;
m_Bitmap.LoadBitmap(IDB_INFOMAP );

BITMAP bmp ;
m_Bitmap.GetObject(sizeof(bmp) ,&bmp );

CDC tDC;
tDC.CreateCompatibleDC(&dc);

CBitmap *pOldBmp = tDC.SelectObject( &m_Bitmap);

dc.BitBlt(0 ,0 , bmp.bmWidth , bmp.bmHeight ,&tDC , 0 , 0 ,SRCCOPY);

CDC dcMem ;
dcMem.CreateCompatibleDC(&dc);
CBitmap *pOldBmpSrc = dcMem.SelectObject(&m_Bit);

dcMem.BitBlt(0 ,0 , bmp.bmWidth , bmp.bmHeight ,&tDC , 0 , 0 , SRCCOPY);

tDC.SelectObject(pOldBmp);
dcMem.SelectObject(pOldBmpSrc);

这里写的我的绘图程序,你可以适当改一下
CDC dcMem ;
dcMem.CreateCompatibleDC(&dc);
CBitmap *pOldBmpSrc = dcMem.SelectObject(&m_Bit);
这个是必须的,这样就可以防止对话框刷新时导致控件上图片消失。

ps:保证控件和OnPaint()函数在同一个对话框类中
chaochaoengle1991 2009-12-14
  • 打赏
  • 举报
回复
我平时用的时候还挺好的呀。。
dxiuquan 2009-12-14
  • 打赏
  • 举报
回复
我发现可能是这个原因:我在窗体上加了一个tab control,其成员变量为:mTabChart,绘图就是在这个mTabChart里面绘的,估计是我首先在这个mTabChart里面绘了图,然后又被窗体的paint事件涂掉了。但是如果是这样的话,那应该怎么处理呢?
dxiuquan 2009-12-14
  • 打赏
  • 举报
回复
那应该怎么处理啊?
huangkaigoodup 2009-12-14
  • 打赏
  • 举报
回复
删除对象时,与该对象关联的资源也被释放了

16,472

社区成员

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

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

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