关闭TMediaPlayer后屏幕残留视频帧,TPNGImage无法正常显示求助
问题解决:关闭TMediaPlayer后立即显示PNG图像
问题分析
关闭TMediaPlayer后视频最后一帧残留、PNG无法正常显示,核心原因有两点:
- TMediaPlayer关闭后,其渲染窗口并未立即从屏幕上移除,覆盖了下层的Image控件
- Image控件执行
StretchDraw后未触发强制重绘,导致绘制的图像没有同步刷新到屏幕
修复方案
1. 调整MediaPlayer关闭与Image显示的逻辑顺序
先隐藏并关闭MediaPlayer,再显示Image并直接触发重绘,无需依赖定时器:
void CSensory_Test::play_stop() { // 先隐藏MediaPlayer,避免窗口残留 Form_Main->pForm_pg->MediaPlayer1->Visible = false; Form_Main->pForm_pg->MediaPlayer1->Close(); // 显示Image并立即调用重绘函数 Form_Main->pForm_pg->Image_qmian->Visible = true; ReDrowMyself(); }
2. 优化ReDrowMyself函数,强制触发控件重绘
绘制完成后调用Update(),确保图像立即刷新到屏幕:
void CSensory_Test::ReDrowMyself() { if(Form_Main->pForm_pg == NULL) { return; } if(Form_Main->pForm_pg->Image_qmian->Visible) { try { Form_Main->pForm_pg->MediaPlayer1->Visible = false; Form_Main->pForm_pg->MediaPlayer1->Close(); } catch(...) { } } TRect myrect(0,0,g_qm_width,g_qm_height); Form_Main->pForm_pg->Image_qmian->Canvas->StretchDraw(myrect,gqmGraphic); // 强制Image控件立即刷新绘制内容 Form_Main->pForm_pg->Image_qmian->Update(); }
3. 额外保障:确保Image控件处于最上层
如果MediaPlayer窗口仍有残留,手动将Image控件置于顶层:
// 在play_stop函数显示Image后添加 Form_Main->pForm_pg->Image_qmian->BringToFront();
4. 适配高分辨率PNG绘制
针对2160*3840的PNG,提前设置Image控件属性适配尺寸,避免拉伸异常:
// 可在Form初始化时设置 Form_Main->pForm_pg->Image_qmian->Stretch = true; Form_Main->pForm_pg->Image_qmian->Width = g_qm_width; Form_Main->pForm_pg->Image_qmian->Height = g_qm_height;
内容的提问来源于stack exchange,提问作者andy yi
相关产品推荐
相关产品推荐

