我正在编写一个对话框,逐帧播放视频,并在其周围显示一些状态信息。对话框资源只包含一些在其上绘制位图的CStatic控件。
循环看起来像这样
DWORD milliPerFrame = std::lround(1000.0 / videoFile.get(CV_CAP_PROP_FPS));
unsigned int videoFrameCount = (unsigned int)videoFile.get(CV_CAP_PROP_FRAME_COUNT),
videoFrameWidth = (unsigned int)videoFile.get(CV_CAP_PROP_FRAME_WIDTH),
videoFrameHeight = (unsigned int)videoFile.get(CV_CAP_PROP_FRAME_HEIGHT);
uint64_t startTime, endTime;
CVideoDlg* canvas = new CVideoDlg();
canvas->Create(IDD_VIDEO_DIALOG, this);
canvas->ShowWindow(SW_SHOW);
CRect dialogSize = canvas->getDrawingRect();
int winFrameWidth = dialogSize.right - dialogSize.left,
winFrameHeight = dialogSize.bottom - dialogSize.top;
cv::Mat vFrame, dFrame;
for (unsigned frameNo = 1; frameNo <= videoFrameCount; frameNo++)
{
startTime = getCurrTime();
videoFile.read(vFrame);
cv::resize(vFrame, dFrame, cv::Size(winFrameWidth, winFrameHeight));
canvas->setFrame(dFrame);
bool status = (frameNo % 2 == 0);
canvas->setStitchingStatus(status);
endTime = getCurrTime();
Sleep(std::max(0, (int)(milliPerFrame - (endTime - startTime))));
}
真实代码调用一个返回状态的例程,我已将其注释用于调试目的。
CVideoDlg有一个OnInitDialog例程,它为每个CStatic控件,两个set方法和getDrawingRect调用ModifyStyle(0xF,SS_BITMAP,0)。
拼接状态很简单
void CVideoDlg::setStitchingStatus(bool status)
{
m_Stitching.ShowWindow(status ? SW_SHOW : SW_HIDE);
}
setFrame是一个相当长的例程,它使用StretchDIBits在另一个CStatic上绘制帧。
问题是,通过调试我可以看到每个CStatic正确绘制,但导致另一个被删除。
为什么会发生这种情况,我该如何解决?
编辑:右上方的矩形是拼接状态CStaticm,大的是框架。
编辑:我已经覆盖了对话框的PreTranslateMessage方法并对其进行了中断,以查看它获取的可能会删除其背景的消息。什么都没有。
我已经添加了对对话框的RedrawWindow的调用,并且所有位图都正确显示,但我仍然想知道为什么它首先被删除。