为什么更新一个MFC CStatic控件会导致擦除对话框?

时间:2016-07-27 11:25:55

标签: c++ mfc

我正在编写一个对话框,逐帧播放视频,并在其周围显示一些状态信息。对话框资源只包含一些在其上绘制位图的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,大的是框架。

enter image description here

编辑:我已经覆盖了对话框的PreTranslateMessage方法并对其进行了中断,以查看它获取的可能会删除其背景的消息。什么都没有。

我已经添加了对对话框的RedrawWindow的调用,并且所有位图都正确显示,但我仍然想知道为什么它首先被删除。

0 个答案:

没有答案