我想在一个窗口中显示一个位图,想通过内存设备保存显示的内容,以备刷新使用,但是我用下面的程序显示并保存时,有时候把文件对话框也保存下来了(选择要显示的文件),怎么只保存可户区里的内容,而不保存其子窗口。CDC memDC;
/////////////////保存显示信息,供OnPaint调用
CClientDC dc(this);
HDC hdc = dc.GetSafeHdc();
if(!hdc)
return; CRect rcClient;
if(pOldMemBitmap)
{
memDC.SelectObject(pOldMemBitmap);
memDC.DeleteDC();
}
GetWindowRect(rcClient);
memDC.CreateCompatibleDC(&dc);
CBitmap bitmap, bmpImage;
bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height() );
pOldMemBitmap=memDC.SelectObject( &bitmap ); memDC.SetROP2(R2_WHITE);
memDC.SetBkMode(OPAQUE);
memDC.SetBkColor(RGB(255,255,255));
memDC.BitBlt(0,0,rcClient.Width(), rcClient.Height(),&dc,0,0,SRCCOPY);//保存原来显示的内容?????
/////////////////保存显示信息,供OnPaint调用
CClientDC dc(this);
HDC hdc = dc.GetSafeHdc();
if(!hdc)
return; CRect rcClient;
if(pOldMemBitmap)
{
memDC.SelectObject(pOldMemBitmap);
memDC.DeleteDC();
}
GetWindowRect(rcClient);
memDC.CreateCompatibleDC(&dc);
CBitmap bitmap, bmpImage;
bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height() );
pOldMemBitmap=memDC.SelectObject( &bitmap ); memDC.SetROP2(R2_WHITE);
memDC.SetBkMode(OPAQUE);
memDC.SetBkColor(RGB(255,255,255));
memDC.BitBlt(0,0,rcClient.Width(), rcClient.Height(),&dc,0,0,SRCCOPY);//保存原来显示的内容?????
GetWindowRect(rcClient);应该替换成GetClientRect(rcClient);
可能看懂了
你应该在头文件处声明
CBitmap bitmap;
当然这时给你改为m_bitmap;
按照你的代码做,第一次进去的时候得到m_bitmap的底图
以后在OnPaint事件中只要在DC中调入m_bitmap对象就成了至于如何确定第一次
1 ,设布尔变量。
2 ,判断m_bitmap有没有值
都可以
谢谢二位,我是按大家说的方法做的,只是我的显示函数为外部库函数,
我的做法:
一、在文件打开对话框之前保存CClientDC
二、在内存设备中载入新图
三、两个设备做AND运算
对否?
好像问题还没解决。
memDC.BitBlt(0,0,rcClient.Width(), rcClient.Height(),&dc,0,0,SRCCOPY);//保存原来显示的内容?????就是把屏幕上客户区的内容写进memDC。所以对话框也写进去了。
因为只有此方法在外部调用时保存窗口显示的内容呀?