我想实现在多个窗口同时播放幻灯片的功能:
为此,我在显示图片窗口类的OnPaint中有部分相关代码:
CRect rect;
GetClientRect(&rect);
BITMAP bm;

CSingleLock slock(&kBitmapValidMutex);
slock.Lock();
CBitmap* pOldBitmap = kpMemDC->SelectObject(kpBitmap);
kpBitmap->GetObject(sizeof(BITMAP), &bm); dc.StretchBlt(0, 0, rect.Width(), rect.Height(), kpMemDC, 0, 0, 
bm.bmWidth, bm.bmHeight, SRCCOPY);
CBitmap* pBitmap = kpMemDC->SelectObject(pOldBitmap);


其中,kpMemDC是窗口类的CDC* 成员,在OnCreate()中通过以下方式取得:
CDC* pDC = GetDC();
kpMemDC = new CDC;
kpMemDC->CreateCompatibleDC(pDC);

kpBitmap是CBitmap* 成员,在OnCreate()中初试化
HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, "hello.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
CBitmap* kpBitmap = new CBitmap;
kpBitmap->Attach(hBitmap);

在这几个窗口的父窗口有一个线程在跑,分别用相应的图片更新相应子窗口的kpBitmap, 由于其他的原因,此线程只能放在父窗口中。
CSingleLock slock(&kpWnd[wndNum]->kBitmapValidMutex);
slock.Lock();
kpBitmapArray[wndNum]->DeleteObject();
//kpBitmapArray[wndNum]->Detach();
delete kpBitmapArray[wndNum];
kpBitmapArray[wndNum] = pNewBitmap;
slock.Unlock(); 其中,kpWnd[wndNum]是指向各子窗口的指针。kpBitmapArray[wndNum]指向各窗口的kpBitmap.pNewBitmap是更新后的CBitmap* 。

现在出现的问题是,程序在跑了一段时间后,在上面列出的显示子窗口的OnPaint()中的一行代码:
CBitmap* pBitmap = kpMemDC->SelectObject(pOldBitmap);
出现异常。
跟踪发现是返回的pBitmap->m_hObject和前面选进的kpBitmap->m_hObject不一样。
进一步发现这种情况只有在子窗口的OnPaint()没有执行完,而父窗口线程开始更新另一个子窗口的图片时才会出现。但我在父窗口线程中删除的是其他子窗口的Bitmap,同一子窗口已经用互斥体保护了,可以证实是不会出现同步问题的。
另外我还发现所有子窗口的pOldBitmap->m_hObject都一样。是不是其他窗口在刷新的时候把某一窗口的DC位图映像搞混了。可是各窗口都是独立的呀。
大家帮帮忙看看怎么解决。谢谢!