我想在一个窗口中显示一个位图,想通过内存设备保存显示的内容,以备刷新使用,但是我用下面的程序显示并保存时,有时候把文件对话框也保存下来了(选择要显示的文件),怎么只保存可户区里的内容,而不保存其子窗口。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);//保存原来显示的内容?????

解决方案 »

  1.   

    不是,你用BitBlt将客户区内容全部COPY了,所以文件对话框也保存到memDC中了。
      

  2.   

    你应该只将画的内容COPY到memDC中去。直接向memDC中画,然后再向显示设备画。你现在的方法是,先画向显示设备,再把显示设备的客户区拷入内存设备。不行了,我得回家,周一我在,可以给我发消息。
      

  3.   

    我感觉你现在是先向显示设备画,然后再把客户区内容存入memDC。应该是先向memDC画,再把memDC中内容拷贝到显示设备中。我要回家了,周一我在,可以给我发消息...祝你成功
      

  4.   

    没太告明白你的意思,但
    GetWindowRect(rcClient);应该替换成GetClientRect(rcClient);
      

  5.   

    又看了一下
    可能看懂了
    你应该在头文件处声明
    CBitmap bitmap;
    当然这时给你改为m_bitmap;
    按照你的代码做,第一次进去的时候得到m_bitmap的底图
    以后在OnPaint事件中只要在DC中调入m_bitmap对象就成了至于如何确定第一次
    1 ,设布尔变量。
    2 ,判断m_bitmap有没有值
    都可以
      

  6.   

    wangweintk(枫杨)、lyt_hf(lyt):
    谢谢二位,我是按大家说的方法做的,只是我的显示函数为外部库函数,
    我的做法:
    一、在文件打开对话框之前保存CClientDC
    二、在内存设备中载入新图
    三、两个设备做AND运算
    对否?
    好像问题还没解决。
      

  7.   

    没太明白你的思路,但是应该不会有什么问题的,我做过很多次,感觉你的思路有点乱。你的这句:
    memDC.BitBlt(0,0,rcClient.Width(), rcClient.Height(),&dc,0,0,SRCCOPY);//保存原来显示的内容?????就是把屏幕上客户区的内容写进memDC。所以对话框也写进去了。
      

  8.   

    wangweintk(枫杨)::那怎么才能不把对话框写进去?我是在对话框出现之前保存的呀?
    因为只有此方法在外部调用时保存窗口显示的内容呀?