小弟是一VC新手,最近做一类似画笔的绘图程序
现在希望在绘图时候能同时在内存DC中绘图,再在窗口
刷新时进行重绘,参照一些资料和自己的理解,在
ondraw中写了如下代码:
if(NULL == this->m_pMemDC){
this->m_pBitmap=new CBitmap;
this->m_pMemDC=new CDC;
this->m_pMemDC->CreateCompatibleDC(pDC);
this->m_pBitmap->CreateCompatibleBitmap(this->m_pMemDC,1024,768);
this->m_pMemDC->SelectObject(this->m_pBitmap);
}
pDC->BitBlt(0,0,1024,768,this->m_pMemDC,0,0,SRCCOPY);
绘图的时候也对m_pMemDC做了和pDC同样的操作,但编译出错.
请指教
现在希望在绘图时候能同时在内存DC中绘图,再在窗口
刷新时进行重绘,参照一些资料和自己的理解,在
ondraw中写了如下代码:
if(NULL == this->m_pMemDC){
this->m_pBitmap=new CBitmap;
this->m_pMemDC=new CDC;
this->m_pMemDC->CreateCompatibleDC(pDC);
this->m_pBitmap->CreateCompatibleBitmap(this->m_pMemDC,1024,768);
this->m_pMemDC->SelectObject(this->m_pBitmap);
}
pDC->BitBlt(0,0,1024,768,this->m_pMemDC,0,0,SRCCOPY);
绘图的时候也对m_pMemDC做了和pDC同样的操作,但编译出错.
请指教
编译出错是写法的问题
在CMyDrawView类里定义了 CDC* m_pMemDC和CBitmap *m_pBitmap
mousemove里时间里做了一些绘图工作 如:
pDC->MoveTo(m_ptStart);
pDC->LineTo(point);
m_pMemDC->MoveTo(m_ptStart);
m_pMemDC->LineTo(point);
然后就在ondraw函数中写有上述语句,希望能将当前客户区内保存在内存DC中,并在重绘的时候显示
是不是这样的话无法绘制到内存DC中?
是不是因为在ondraw时候才对m_pMemDC进行初始化
而造成了在mousemove时候出错?
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1); // Load bitmap from resource
MemDC.CreateCompatibleDC(pDC);
CBitmap* pOldbit = MemDC.SelectObject(&bitmap);
pDC->BitBlt(0,0,300,300,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldbit); // Restore driver context
void CA1View::OnDraw(CDC* pDC)
{
CA1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC cdc;
cdc.CreateCompatibleDC(pDC); CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC, 400, 500); cdc.SelectObject(&bitmap);
cdc.TextOut(0, 0, "afasfadfasdfgadsfad"); pDC->BitBlt(0, 0, 400, 500, &cdc, 0, 0, SRCCOPY);
// TODO: add draw code for native data here
}
我在ONMOUSEMOVE里绘图就不行了
以下是我的程序部分了
void CMyDrawView::OnDraw(CDC* pDC)
{
CMyDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here if(NULL == this->m_pMemDC){
this->m_pBitmap=new CBitmap;
this->m_pMemDC=new CDC;
this->m_pMemDC->CreateCompatibleDC(pDC);
this->m_pBitmap->CreateCompatibleBitmap(this->m_pMemDC,1024,768);
this->m_pMemDC->SelectObject(this->m_pBitmap);
}
pDC->BitBlt(0,0,1024,768,this->m_pMemDC,0,0,SRCCOPY);
this->m_pBitmap->DeleteObject();
this->m_pMemDC->DeleteDC();
}
void CMyDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
CDC *pDC=GetDC();
CPen pen;
pen.CreatePen(PS_SOLID,this->m_nLineWidth,this->m_cLineColor);
pDC->SelectObject(&pen);
this->m_pMemDC->SelectObject(&pen);
if (m_bLMouseDown)
{
if(m_nDrawType==1)
{
pDC->MoveTo(m_ptStart);
pDC->LineTo(point); m_pMemDC->MoveTo(m_ptStart);
m_pMemDC->LineTo(point);
m_ptStart=point;
}
.........
}
m_ptOld=point;
ReleaseDC(pDC);
}
创建新的画笔时,要保存旧的画笔
oldpen=dc.selectobject(&newpen)
然后在画笔用完结束后重新选择
dc.selectobject(oldpen);恢复旧画笔最后
newpen.deleteobject()
新的画笔对象就被释放了
不知道是不是这样
this->m_pMemDC->DeleteDC();
可能这两句导致错误,你释放掉后没有赋为NULL,下一次内存没有分配就直接使用,导致失败!
其实没必要在OnDraw(...)中分配内存DC内存,
可以在构造函数里进行New, 在析构函数中释放,
不管在什么地方释放内存,如下格式供参考:
/*xxx --- 指针 */if (xxx != NULL)
{
delete xxx;
xxx = NULL;
}