16,471
社区成员
发帖
与我相关
我的任务
分享
CRect rt;
this->GetClientRect(&rt);
// 为屏幕DC创建兼容的内存DC
if(!m_dcMemory.CreateCompatibleDC(NULL))
{
::PostQuitMessage(0);
}
// 创建位图
m_Bmp.CreateCompatibleBitmap(&m_dcMemory, rt.Width(), rt.Height());
// 相当于选择画布
::SelectObject(m_dcMemory.GetSafeHdc(), m_Bmp);
HBITMAP hBitmap=(HBITMAP)LoadImage(0,"c:\\1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
//第三个dc
CDC* pDc=GetDC();
m_dcMemory2.CreateCompatibleDC(pDc);
m_dcMemory2.SelectObject((HGDIOBJ)hBitmap);
ReleaseDC(pDc);
//另外一段代码
//////////////////////////////////////////
CRect rt;
this->GetClientRect(&rt);
m_dcMemory.FillSolidRect(&rt, RGB(255,255,255)); // 白色填充, 注意,这次是画在内存设备环境上
// 画圆
for(int i = 0; i < rt.Width() - 1; i+= 16)
{
for(int j = 0; j < rt.Height() - 1; j+= 16)
{
m_dcMemory.Ellipse(i, j, i + m_nRadius, j + m_nRadius);
}
}
m_dcMemory.BitBlt(rt.Width()/4,rt.Height()/4,rt.Width()/2,rt.Height()/2,&m_dcMemory2, 0,0,SRCCOPY);
Invalidate();
//第3段代码
///////////////////////////////////////
void CDBBTestView::OnDraw(CDC* pDC)
{
CDBBTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect rc;
GetClientRect(&rc);
if(m_bStart)
{
pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &m_dcMemory, 0, 0, SRCCOPY);
}
else
{
pDC->FillSolidRect(&rc,RGB(255,255,255));
}
}
HDC hMemoDc, hMemDoc2; //内存dc, dc2
HBTIMAP hMemoBitmap, hOldMemobitmap, hOldMemobitmap2;
case WM_CREATE:
//创建兼容dc、位图
HDC hDC=getdc(hwnd);
hMemoDc=CreateCompatibleDC(hDC);
hMemoBitmap=createcompatbileBitmap(hDc,rt.width,,);
hOldMemobitmap=selectobject(hMemoDc, hMemoBitmap); //记录旧位图
// 同理,保存第3个dc中的旧位图
hOldMemobitmap2=selectobject(hMemoDc2, hMemoBitmap); //记录旧位图
ReleaseDc(hwnd,hdc);
case WM_DESTROY:
//返回旧位图
SelectObject(hMemoDC,hOldMemobitmap); //教还旧位图
SelectObject(hMemoDC2,hOldMemobitmap2); //教还旧位图
//删除兼容位图,这个位图是create出来的
DelteObject(hwnd,hMemoBitmap);
//删除2个dc,这2个dc都是create出来的
DeleteDc(hwnd,hMemoDc);
DeleteDc(hwnd,hMemoDc2);
没泄露了吧
void CDBBTestView::InitialDBB()
{
CRect rt;
this->GetClientRect(&rt);
CDC *pDC=GetDC();
// 为屏幕DC创建兼容的内存DC
if(!m_dcMemory.CreateCompatibleDC(pDC))
{
::PostQuitMessage(0);
}
// 创建位图
m_Bmp.CreateCompatibleBitmap(pDC, rt.Width(), rt.Height());
// 相当于选择画布
m_dcMemory.SelectObject(m_Bmp);
//::SelectObject(m_dcMemory.GetSafeHdc(), m_Bmp);
HBITMAP hBitmap=(HBITMAP)LoadImage(0,"D:\\my\\Picture_2012_12_28_15_21_16.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
//第三个dc
m_dcMemory2.CreateCompatibleDC(pDC);
m_dcMemory2.SelectObject((HGDIOBJ)hBitmap);
ReleaseDC(pDC);
}
我电脑测试OK,中间可以显示BMP图片内容
// 初始化和双缓冲相关的要素
void CDBBTestView::InitialDBB()
{
CRect rt;
this->GetClientRect(&rt);
CDC* pDc=GetDC();
// 为屏幕DC创建兼容的内存DC
if(!m_dcMemory.CreateCompatibleDC(pDc))
{
ReleaseDC(pDc);
::PostQuitMessage(0);
}
// 创建兼容位图
m_Bmp.CreateCompatibleBitmap(pDc, rt.Width(), rt.Height());
m_dcMemory.SelectObject((HGDIOBJ)m_Bmp); //没有返回旧的
//第三个dc
HBITMAP hBitmap=(HBITMAP)LoadImage(0,"c:\\1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
m_dcMemory2.CreateCompatibleDC(pDc);
m_dcMemory2.SelectObject((HGDIOBJ)hBitmap); //没有返回旧的
ReleaseDC(pDc);
}
看了一下CBitmap的基类CGidObject的析构函数似乎是有自动删除该gdi对象的功能。
widnows程序设计一书提到:
先还旧gdi对象,再释放dc. 如果gdi是create的,那么还旧的gdi对象后,还要删除create出来的gdi对象和释放dc.
现在好了,所有都是析构函数负责。
问题:析构函数能够正确的保存删除?
要正确删除,必须:安装一定的顺序。
目标:1个位图需要deleteobject,一个dc需要deletedc.