双缓冲绘图,当窗口被拖到银屏之外,再拖回来的时候,控件消失

双缓冲绘图,当窗口被拖到屏幕之外,再拖回来的时候,控件消失
各位好,我想写一个象棋程序,由于背景+棋盘+32个棋子,图片比较多,于是用到了双缓冲技术。直接在内存DC上做的图,最后把内存DC直接画出来,代码如下:

void CChessDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDC* pDC=GetDC();
CRect rc;
GetClientRect(&rc);
DrawAllItems(IDB_BITMAP_BACKGROUND,0,0);//画背景
DrawAllItems(IDB_BITMAP_BOARD,INITBOARDPOSX,INITBOARDPOSY);//画棋盘
for (int i = 0;i<32;i++)//画出所有棋子
{
DrawAllItems(m_Chess[i].m_BitmapID,m_Chess[i].m_Position.x,m_Chess[i].m_Position.y);//画棋盘
}
pDC->BitBlt(0,0,rc.Width(),rc.Height(),m_pMemDC,0,0,SRCCOPY);

CDialog::OnPaint();
}
}

其中,DrawAllItems就是把图片画在内存DC上的,代码如下,m_pMemDC就是内存DC:
void CChessDlg::DrawAllItems(UINT ID,int nCoordX,int nCoordY)
{
CDC* pDC = GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);//创建与目标DC相兼容的内存DC,
CBitmap bitmap;
if (!bitmap.LoadBitmap(ID))
{
AfxMessageBox(_T("加载位图失败!"));
}
BITMAP bmpinfo;
bitmap.GetBitmap(&bmpinfo);
CBitmap* pOldBitmap = MemDC.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
int iRet = m_pMemDC->BitBlt(
nCoordX,
nCoordY,
bmpinfo.bmWidth,
bmpinfo.bmHeight,
&MemDC,
0,
0,
SRCCOPY);
MemDC.SelectObject(pOldBitmap);
}

现在的问题是:

1、当我拖动窗口,把窗口拖到屏幕之外,也就是窗口的一部分能看到,另一部分在屏幕之外看不到,完了再拖回到屏幕中央的时候,窗口上的控件就都消失了。

    窗口如图:

     双缓冲绘图,当窗口被拖到银屏之外,再拖回来的时候,控件消失

    拖动窗口到屏幕之外,再拖回来,效果如图:

    双缓冲绘图,当窗口被拖到银屏之外,再拖回来的时候,控件消失
2、我尝试过重写OnMove(),然后在其中直接Invalidate(),但是那样的话拖动过程中窗口会一支闪烁。[/color]


研究了好几天实在是不知道该怎么解决了,一直对这方面理解不太深,请会的朋友帮帮忙,十分感谢![/b][/size]
------解决思路----------------------
先给你的主窗口添加窗口风格看看问题是否解决 WS_CLIPCHILDREN
------解决思路----------------------
应该是被你画的背景盖住了,用鼠标点一下就出来了。把背景图放到背景刷子里面就好了。
------解决思路----------------------
不要在OnEraseBkgnd里画图
要在OnPaint里画

OnEraseBkgnd里永远保持单纯的 return true;