OnPaint()
{
CPaintDC dc(this); // device context for painting
SetFont();
CDC *wDC;
wDC=GetDC();
//////////////////////////////////
(*pDC).CreateCompatibleDC(wDC);//但是执行到这里就会出现错误
CRect rect;
this->GetClientRect(rect);
CBitmap bmpFace;
bmpFace.CreateCompatibleBitmap(wDC,rect.Width(),rect.Height());
CBitmap *pOldBmp=NULL;
pOldBmp=pDC->SelectObject(&bmpFace);
pDC->SetBkMode(TRANSPARENT);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
pDC->SelectObject(pBrush);
DrawFunc();
wDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),pDC,rect.left,rect.top,SRCCOPY);
//////////////////////////////////
pBrush->DeleteObject();
bmpFace.DeleteObject();
ReleaseDC(wDC);
DeleteDC(*pDC);
DeleteFont();
// Do not call CDialog::OnPaint() for painting messages
}出现的错误是unhandleexception *.exe MFC42D.DLL 0xc000005 access violation
是想在内存DC中绘制,之后再显示 防止屏刷很闪。
其中CDC *pDC;但是不知道为什么在ClassView中出现的是MemDC
{
CPaintDC dc(this); // device context for painting
SetFont();
CDC *wDC;
wDC=GetDC();
//////////////////////////////////
(*pDC).CreateCompatibleDC(wDC);//但是执行到这里就会出现错误
CRect rect;
this->GetClientRect(rect);
CBitmap bmpFace;
bmpFace.CreateCompatibleBitmap(wDC,rect.Width(),rect.Height());
CBitmap *pOldBmp=NULL;
pOldBmp=pDC->SelectObject(&bmpFace);
pDC->SetBkMode(TRANSPARENT);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
pDC->SelectObject(pBrush);
DrawFunc();
wDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),pDC,rect.left,rect.top,SRCCOPY);
//////////////////////////////////
pBrush->DeleteObject();
bmpFace.DeleteObject();
ReleaseDC(wDC);
DeleteDC(*pDC);
DeleteFont();
// Do not call CDialog::OnPaint() for painting messages
}出现的错误是unhandleexception *.exe MFC42D.DLL 0xc000005 access violation
是想在内存DC中绘制,之后再显示 防止屏刷很闪。
其中CDC *pDC;但是不知道为什么在ClassView中出现的是MemDC
解决方案 »
- 如何得到richedit行间距?
- 这样一种模型,看你如何设计
- 请教高人关于图像处理的问题!!
- 我怎样把EDIT控件中当前光标左边的苦干个字符取出来?
- 怪问题,控件HTTP上传方法执行1,3,5,7....次成功,第2,4,6,8...次失败
- 如何在程序中调出chm文件
- 重金悬赏!!!如何在客户区的单文档单视图里添加控件或者把自建的对话框显示在客户区的视图里
- 一个ftp程序源程序,编译时在link的时候过不去()高手帮帮我
- 菜鸟问题:关于ActiveX控件 属性的保存问题
- 自学MFC的难处求指导?
- ●●●在同一个程序中两个菜单要执行的内容一样,如何发送SendMessage?
- [求助] 这个简单的程序为什么没有预期效果呢?
DeleteDC(*pDC);
这句话就是释放呀~
CPaintDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
....
...
dc.BitBlt(...,&memDC,...SRCCOPY);
memDC.DeleteDC();
...
SetFont();
//////////////////////////////////
pDC->CreateCompatibleDC(&dc);//这步出错
CRect rect;
this->GetClientRect(rect);
CBitmap bmpFace;
bmpFace.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
CBitmap *pOldBmp=NULL;
pOldBmp=pDC->SelectObject(&bmpFace);
pDC->SetBkMode(TRANSPARENT);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
pDC->SelectObject(pBrush);
DrawFunc();
dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),pDC,rect.left,rect.top,SRCCOPY);
//////////////////////////////////
pBrush->DeleteObject();
bmpFace.DeleteObject();
pDC->DeleteDC();
DeleteFont();我修改了 可是还是这种情况~ 这个内存DC第一次用 完全不知道怎么使用,本来程序是用GetDC();得到的pDC进行绘画的,但是闪得实在厉害
闪的原因知道,就是整个图是自己绘画出来的,但是我只是想移动其中的一个圆,让它跟随鼠标移动,是想局部重画可能会比较好,我去查查。只是不明白自己pDC->CreateCompatibleDC(&dc);这步怎么会出错呢?
用InvalidateRect(rect,TRUE);
UpdateWindow();
感觉没什么反应,但是只是用前面一个画的话,会有很多阴影,然后速度还跟不上
有阴影大概是我的绘图区域选的有点问题吧~
CPaintDC dc(this);
这句话肯定是对dc赋值了,那应该怎么做呢?直接pDC->CreateCompatibleDC(NULL);?
开始迷茫了~内存DC与DC到底是什么关系?我进行了局部刷新,可是
InvalidateRect(rect,TRUE);
UpdateWindow();
执行之后之前画的内容还在,用什么可以擦除一下呢?
具体的不清楚, 内存DC就是相当于把窗口放在内存中,在内存中直接画,画完后复制到屏幕的DC上,应该也叫做设备DC吧我的理解
是我用指针调用CreateCompatibleDC函数是不可以的不过能告诉我局部重绘的时候应该怎样就能将原来绘画的东西刷掉,是需要先用背景画刷刷一次吗???
这个知道 只是我重绘的时候,以前绘制的还会在,弄得屏幕黑乎乎的
关于CDC难道我有理解错了吗?我之前没有对pDC进行创建的,只是CDC *pDC定义了一下而已,但是指针调用函数就是不行的,因为指针没有初始化~
如果你要用双缓冲贴图。
那就这样, CPaintDC dcPaint(this); CDC dcMem;
dcMem.CreateCompatibleDC(&dcPaint); CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1); BITMAP bmpObj;
bitmap.GetBitmap(&bmpObj); dcMem.SelectObject(bitmap); CRect rcClient;
GetClientRect(rcClient);
dcPaint.StretchBlt(0, 0, rcClient.Width(), rcClient.Height(), &dcMem, 0, 0, bmpObj.bmWidth, bmpObj.bmHeight, SRCCOPY);
如果可以的话,不必清空,直接覆盖即可
恩,new放在窗口初始化函数应该就可以不用delete了
因为如果运用到嵌入式系统,就会占用内存~