这段时间一直在开发电视转发和文件播放的服务器软件,基于PC端的。

之前在做多画面切换的时候,发现存在一个BUG,当多画面窗口切换的时候,存在窗口画面留有影子的问题,留有之前窗口的边框,看上去像重叠一样的问题,但当我点击全屏操作以后,画面重叠就消除了,一切恢复正常。

例如当我点击画面切换的时候,从9画面切换到12画面的时候,出现了下面的这种情况:

这种情况,看上去像是画面没刷新一样,就是说从9画面切到12画面的时候,画面没刷新。

下面就来看看我的画面关键代码:

在窗口切换的时候,我们需要先将窗口隐藏,然后再把窗口SHOW出来。

关键代码1:

///
//将各个多画面窗口复位到初始化状态
void CWndFilePlayVideoView::ResetFilePlayMonitorSta(int nWin)
{

for(int i=0;i<MULFILE_MONITOR_PLAYS;i++)
{
m_MulFilePlayDisplay[i].ShowWindow(SW_HIDE);
m_MulFilePlayDisplay[i].m_left = 0;
m_MulFilePlayDisplay[i].m_top = 0;
m_MulFilePlayDisplay[i].m_width = 0;
m_MulFilePlayDisplay[i].m_height = 0;

m_MulFilePlayDisplay[i].m_ischange = false;
}
TRACE("\nCWndFilePlayVideoView::ResetFilePlayMonitorSta 复位子播放窗口.\n");
}

关键代码2:

/
//对多窗口多画面播放的视频进行窗口重新布局
//
void CWndFilePlayVideoView::RestorFilePlayMonitorLayout(int nWin)
{
int i=0;
int iSingleWidth;//单个界面
int iSingleHeight;

int tempCurPlayNum=m_iCurFilePlayMonitorNum;//
//int tempNextPlayNum=m_iNextFilePlayMonitorNum;
int iRowPlayNum=0;//行
int iColumnPlayNum=0;//列
if(tempCurPlayNum==12)//12画面
{
iRowPlayNum=3;//
iColumnPlayNum=4;//
//计算单个窗口的大小
//iSingleWidth=m_rectFilePlayVideoView.Width()/iColumnPlayNum;
//iSingleHeight=m_rectFilePlayVideoView.Height()/iRowPlayNum;
iSingleWidth=(m_rectFilePlayVideoView.Width()-(iColumnPlayNum+1)*MULFILE_PlAYS_WIDTH_INTERVAL)/iColumnPlayNum;
iSingleHeight=(m_rectFilePlayVideoView.Height()-(iRowPlayNum+1)*MULFILE_PlAYS_HEIGHT_INTERVAL)/iRowPlayNum;

for(i=0;i<tempCurPlayNum;i++)//留两个像素点做间距
{
//m_MulFilePlayDisplay[i].m_left = m_rectFilePlayVideoView.left+(i%iColumnPlayNum) * iSingleWidth;
//m_MulFilePlayDisplay[i].m_top = m_rectFilePlayVideoView.top+(i/iColumnPlayNum) * iSingleHeight;
m_MulFilePlayDisplay[i].m_left = m_rectFilePlayVideoView.left+(i%iColumnPlayNum) * iSingleWidth+(i%iColumnPlayNum+1)*MULFILE_PlAYS_WIDTH_INTERVAL;
m_MulFilePlayDisplay[i].m_top = m_rectFilePlayVideoView.top+(i/iColumnPlayNum) * iSingleHeight+(i/iColumnPlayNum+1)*MULFILE_PlAYS_HEIGHT_INTERVAL;

m_MulFilePlayDisplay[i].m_width=iSingleWidth;
m_MulFilePlayDisplay[i].m_height=iSingleHeight;
m_MulFilePlayDisplay[i].m_ischange=true;//
}
}else{//1-4-9-16画面
iRowPlayNum=iColumnPlayNum=(int)sqrt((double)tempCurPlayNum);;//
//计算单个窗口的大小
//iSingleWidth=m_rectFilePlayVideoView.Width()/iColumnPlayNum;
//iSingleHeight=m_rectFilePlayVideoView.Height()/iRowPlayNum;
iSingleWidth=(m_rectFilePlayVideoView.Width()-(iColumnPlayNum+1)*MULFILE_PlAYS_WIDTH_INTERVAL)/iColumnPlayNum;
iSingleHeight=(m_rectFilePlayVideoView.Height()-(iRowPlayNum+1)*MULFILE_PlAYS_HEIGHT_INTERVAL)/iRowPlayNum;

for(i=0;i<tempCurPlayNum;i++)//留两个像素点做间距
{
//m_MulFilePlayDisplay[i].m_left = m_rectFilePlayVideoView.left+(i%iRowPlayNum) * iSingleWidth+2;
//m_MulFilePlayDisplay[i].m_top = m_rectFilePlayVideoView.top+(i/iRowPlayNum) * iSingleHeight+2;
m_MulFilePlayDisplay[i].m_left = m_rectFilePlayVideoView.left+(i%iColumnPlayNum) * iSingleWidth+(i%iColumnPlayNum+1)*MULFILE_PlAYS_WIDTH_INTERVAL;
m_MulFilePlayDisplay[i].m_top = m_rectFilePlayVideoView.top+(i/iColumnPlayNum) * iSingleHeight+(i/iColumnPlayNum+1)*MULFILE_PlAYS_HEIGHT_INTERVAL;

m_MulFilePlayDisplay[i].m_width=iSingleWidth;
m_MulFilePlayDisplay[i].m_height=iSingleHeight;
m_MulFilePlayDisplay[i].m_ischange=true;//
}
}

/开始调整位置/
for(i=0;i<MULFILE_MONITOR_PLAYS;i++)
{
if(m_MulFilePlayDisplay[i].m_ischange)
{
m_MulFilePlayDisplay[i].RestorPosition();//调整
m_MulFilePlayDisplay[i].ShowWindow(SW_SHOW);
TRACE("\nCWndFilePlayVideoView::RestorFilePlayMonitorLayout 开始调整%d窗口.\n",i);
}else{

}
}
m_iCurFilePlayMonitorNum=tempCurPlayNum;
}

关键代码3:

//重定义显示窗口位置
void CWndMulFilePlayDisp::RestorPosition()
{
MoveWindow(m_left, m_top, m_width, m_height, TRUE);
}

所以在窗口切换的时候,我们的代码调用顺序是:

m_iCurFilePlayMonitorNum=1;//这里切换到哪个画面,这里就赋值为x
ResetFilePlayMonitorSta(0);
RestorFilePlayMonitorLayout(0);

====================================

为什么会出现之前的情况?于是按照自己的判断,画面没刷新的思路,我在画面切换的函数完成以后,调用一次RedrawWindow();立即进行一次画面的刷新。

但加了以后,在多次切换以后,问题还是没有解决。

我左右想想,也不知道哪里出了问题,根据程序也发现已经进入了dopaint函数,完成了重绘刷新,但为什么还是出现这种看上去没刷新的问题?

后面想了好久,感觉难道是因为我们刷新的是父窗口??因为我们这里画面切换都是在父窗口的函数中进行的。

按照这个思路,我尝试了下在播放的各个子窗口中进行窗口刷新。

所以最后在子窗口类里面添加onsize和onpaint函数,代码很简单:

//wm_size消息处理

void CWndMulFilePlayDisp::OnSize(UINT nType,int cx,int cy)

{

  TRACE("\n CWndMulFilePlayDisp::Onsize.\n");

  CSkinStatic::Onsize(nType,cx,cy);

  RedrawWindow();//更新界面

}

//重绘消息响应函数

void CWndMulFilePlayDisp::OnPaint()

{

CPaintDC dc(this);

CRect rcClip, rcClient;
dc.GetClipBox( &rcClip );
GetClientRect(&rcClient);

// Create a compatible memory DC
CDC memDC;
memDC.CreateCompatibleDC( &dc );

// Select a compatible bitmap into the memory DC
CBitmap bitmap, bmpImage;
bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height() );
memDC.SelectObject( &bitmap );

// First let the control do its default drawing.
//CWnd::DefWindowProc( WM_PAINT, (WPARAM)memDC.m_hDC, 0 );

/*********************add by lhp******************************/
DrawTreeItem(&memDC,rcClient,rcClip);
dc.BitBlt( rcClip.left, rcClip.top, rcClip.Width(),
rcClip.Height(), &memDC,
rcClip.left, rcClip.top, SRCCOPY );
// 删除资源
memDC.DeleteDC();
bitmap.DeleteObject();

}

添加了上述的代码以后,进行调试,发现问题解决了。

关于多画面窗口切换的刷新重绘问题相关推荐

  1. c语言改变WIncc画面窗口画面,wincc菜单栏画面窗口切换的脚本应用

    答侠们好,wincc新手,因为对编程知识的极度缺乏,故请教,我想用wincc的菜单栏实现一个功能:画面上放置有一个画面窗口,点击下拉菜单栏里的菜单名称,就在这个画面窗口上显示相应的趋势图,不知道脚本怎 ...

  2. Visual C++——定时刷新重绘窗口[WM_PAINT消息]解决方案

    基本概念 定时器:每隔一定时间执行一次的任务. API SetTimer的函数原型: UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uEl ...

  3. 双缓冲法解决重绘和闪屏问题

    重绘导致原因:UpdateData.Invalidate.InvalidateRect和UpdateWindow函数. 1. UpdateData重绘控件函数 UpdateData(TRUE)--刷新 ...

  4. Stable Diffusion系列课程上:安装、提示词入门、常用模型(checkpoint、embedding、LORA)、放大算法、局部重绘、常用插件

    文章目录 一.Stable Diffusion简介与安装 二.文生图(提示词解析) 2.1 提示词入门 2.2 权重 2.3 负面提示词( Negative prompt) 2.4 出图参数设置 2. ...

  5. VC的MFC中重绘函数的使用总结(整理)

    原文网址:http://www.cnblogs.com/x8023z/archive/2008/12/09/mfc33.html 在刷新窗口时经常要调用重绘函数 MFC提供了三个函数用于窗口重绘 In ...

  6. vim 多窗口切换和其他的一些快捷方法

    转载地址: http://blog.csdn.net/devil_2009/article/details/7006113 vim多窗口使用技巧 1.打开多个窗口 打开多个窗口的命令以下几个: 横向切 ...

  7. linux输入数字切换浏览器tab,js监听浏览器tab窗口切换

    js监听浏览器tab窗口切换 --IT唐伯虎 摘要:js监听浏览器tab窗口切换. if (document.hidden !== undefined) { document.addEventList ...

  8. html实现视频会议 (web端+手机端),支持多人在线,窗口切换,分享 - Cover 七牛

    站在巨人的肩膀上,总是简单一些,但是看文档还有写这些demo还是用了1天的时间 电脑端: 本地窗口 远程窗口切换 手机端:         源码:server部分用了php,换成 java 或  py ...

  9. selenium 自动化 携带cookies模拟登陆哔哩哔哩并发送弹幕和评论(解决多窗口切换、规避检测、评论无法输入等问题)

    获取cookies之后就可以自动登陆到哔哩哔哩,点击搜索到的视频,然后输入弹幕,发送弹幕,再点击评论,发送评论,这里有个问题就是运行几次之后发现评论直接sed_keys的话,会出现输入不进去的情况,然 ...

最新文章

  1. [英文面試]如何寫面試後的感謝信
  2. Cesium - 转换obj模型为3D Tiles 并加载
  3. 三个数从小到大排序—南阳acm
  4. NSMutableDictionary中 setValue和setObject的区别
  5. 【debug】 烧写 ttn-otaa.ino提示 undefined reference to ‘table_g‘ / ‘table_get_ostime‘
  6. @PathVariable、@RequestHeader与@CookieValue注解的使用案例
  7. Gradient Boosting算法理论
  8. 《概率统计》知识点(持续更新……)
  9. XMPP即时通讯协议使用(十)——好友关系状态
  10. php 使用gd库,PHP的gd库使用基础教程
  11. 如何进行反欺诈风控模型冷启动
  12. 人口流向逆转带来什么变化(zz)
  13. 部署JAX-WS Web服务作为战争中的Apache Tomcat(Deploying JAX-WS webservice as War in Apache Tomcat)...
  14. Flutter 发布iOS版本app
  15. OpenStack 虚拟机冷/热迁移的实现原理与代码分析
  16. 微信小程序wx.request封装
  17. 如何设置双路由器,图文详解
  18. 三:JavaScript快速入门(脚本开发方向)
  19. 五一去哪里人最多?用 Python 抓取的热力图告诉你!
  20. DAU ARPU 美术

热门文章

  1. WEB产品展示Bootstrap4模板
  2. 数据库访问的性能问题与瓶颈问题【z】
  3. 用Vim编程——配置与技巧
  4. 如何优化网页转化率?(中篇)
  5. shell循环,判断介绍,以及实例
  6. 远程服务器,你不得不知道的命令行操作(一)
  7. Leetcode算法题(C语言)10--两数之和
  8. 【AI视野·今日Robot 机器人论文速览 第十二期】Tue, 22 Jun 2021
  9. python中的编码问题
  10. mysql 修改密码演练