using System; using System.Collections.Generic; using System.Linq; using System.Text; using GeneralLib; using PowerPoint = Microsoft.Office.Interop.PowerPoint; using Microsoft.Office.Interop.PowerPoint; using System.Windows.Forms; using System.Threading; using System.Diagnostics; using NetLib; namespace SunVoteARSPPT { public class PPTShow { /// /// PowerPoint.Application对象 /// public PowerPoint.Application PPT { get; private set; } /// /// 当前显示的幻灯片 /// public Slide SlideShow { get; set; } /// /// 当前显示的幻灯片的TagSet对象 /// public TagSet TagSetSlide = new TagSet(); public ManageChart SlideChart = null; /// /// 是否为幻灯片放映状态 /// public bool IsShowSlide { get { bool res = false; try { res = (Globals.SunVoteARSAddIn.Application.ActivePresentation.SlideShowWindow != null); } catch { } return res; } } /// /// private System.Windows.Forms.DataVisualization.Charting.Chart chart = new System.Windows.Forms.DataVisualization.Charting.Chart(); public PPTShow(PowerPoint.Application oApp) { this.PPT = oApp; SlideChart = new ManageChart(); SlideChart.MsChart = chart; SlideChart.SeriesColors = GlobalInfo.ChartColors; PPT.SlideShowBegin += new Microsoft.Office.Interop.PowerPoint.EApplication_SlideShowBeginEventHandler(PPT_SlideShowBegin); PPT.SlideShowNextSlide += new Microsoft.Office.Interop.PowerPoint.EApplication_SlideShowNextSlideEventHandler(PPT_SlideShowNextSlide); PPT.SlideShowEnd += new Microsoft.Office.Interop.PowerPoint.EApplication_SlideShowEndEventHandler(PPT_SlideShowEnd); } public ResponseType ResponseType { get { if (SlideShow == null) { return ResponseType.None; } else { TagSetSlide.Tags = SlideShow.Tags; return ResponseTypeName.GetEnum((TagSetSlide.GetValue(TagKey.ResponseType).Value)); } } } /// /// 工具栏窗体 /// public FrmVoteBar FrmVoteBar; public bool IsAutoShowNext = false; /// /// 独立图表窗体。杨斌 2016-06-17 /// public FrmSlideChart FrmChart = null; /// /// 开始播放幻灯片 /// 加载对象(工具栏),并初始化 /// /// void PPT_SlideShowBegin(Microsoft.Office.Interop.PowerPoint.SlideShowWindow Wn) { ShowCorrectAnswerAll(false); //GlobalInfo.baseConnect.IsResponse = true; HidePicture(); //杨斌 2013-01-29 SlideShow = Wn.View.Slide; TagSetSlide.Tags = SlideShow.Tags; GlobalInfo.response.DicSlideShowChart.Clear();//杨斌 2014-12-04 //修改标志 赵丽 2012-05-02 播放普通幻灯片隐藏工具栏 if (FrmVoteBar == null) { FrmVoteBar = new FrmVoteBar(); } if (FrmChart == null)//杨斌 2016-06-17 { FrmChart = new FrmSlideChart(); } //修改 杨斌 2012-05-03 隐藏窗体,但要调用加载过程(FrmVoteBar的_Load事件) FrmVoteBar.LoadFrom(); FrmVoteBar.ActivateSlideShowWindow(); FrmVoteBar.PanelEnabled = false; } /// /// 隐藏图表 /// 创建 赵丽 /// private void HidePicture() { TagSet tagSet = new TagSet(); foreach (Slide slide in Globals.SunVoteARSAddIn.PPTEdit.PPT.ActivePresentation.Slides) { tagSet.Tags = slide.Tags; //显示类型 ResponseType responseType = EnumName.GetEnum(tagSet.GetValue(TagKey.ResponseType).Value); if ((responseType == ResponseType.None) || (responseType == ResponseType.Slide)) continue; ChartViewType chartViewType = EnumName.GetEnum(tagSet.GetValue(TagKey.ChartPara_ShowTime).Value); bool showByHand = tagSet.GetValue(TagKey.Pictrue_ShowByHand).ToBoolean; if ((responseType == ResponseType.ScoreRankChart) || (responseType == ResponseType.ScoreRankGroupChart)//杨斌 2014-08-07 || (responseType == ResponseType.SlideCompChart) || (responseType == ResponseType.SlideCompGroup)//杨斌 2017-01-19 || (responseType == ResponseType.CompVote)//杨斌 2017-06-11 ) continue;//杨斌 2020-12-09 //) break;//杨斌 2014-12-10 //if ((chartViewType != ChartViewType.csStart) && (!showByHand)) //{ //2012-11-08 赵丽 删除图表应该屏蔽图表显示 tagSet.SetValue(TagKey.IsExistChart, false); foreach (Shape shape in slide.Shapes) { if (shape.Name == "pic") { tagSet.SetValue(TagKey.IsExistChart, true); shape.Visible = Microsoft.Office.Core.MsoTriState.msoFalse; } } } } /// /// 显示图片 /// 创建 赵丽 /// private void ShowPicture() { TagSet tagSet = new TagSet(); foreach (Slide slide in Globals.SunVoteARSAddIn.PPTEdit.PPT.ActivePresentation.Slides) { tagSet.Tags = slide.Tags; //显示类型 ResponseType responseType = EnumName.GetEnum(tagSet.GetValue(TagKey.ResponseType).Value); if ((responseType == ResponseType.None) || (responseType == ResponseType.Slide)) continue; ChartViewType chartViewType = EnumName.GetEnum(tagSet.GetValue(TagKey.ChartPara_ShowTime).Value); bool showByHand = tagSet.GetValue(TagKey.Pictrue_ShowByHand).ToBoolean; foreach (Shape shape in slide.Shapes) { //杨斌 2014-12-24 if (shape.Name == "pic") { //shape.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; string chaShow = tagSet.GetValue(TagKey.ChartPara_ShowTime).Value; if (chaShow != "csHide") shape.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; } } } } Thread ThNext = null; private void ThNextRun(object pa) { Stopwatch t = Stopwatch.StartNew(); string ss = ""; Microsoft.Office.Interop.PowerPoint.SlideShowWindow Wn = pa as Microsoft.Office.Interop.PowerPoint.SlideShowWindow; bool isNext = true;//杨斌 2014-09-05 try { if (FrmVoteBar.IsVoteStart) { FrmVoteBar.VoteStart(false); } //刷新上一个图表 if (SlideShow != null) //调试时=null,但判断错误 { GlobalInfo.response.RefreshChart(); }//若不加{}调试时会进入判断的下一行(但实际未执行) //杨斌 2014-09-05 if (SlideShow != null) { if (SlideShow.SlideIndex > Wn.View.Slide.SlideIndex) isNext = false; } SlideShow = Wn.View.Slide; TagSetSlide.Tags = SlideShow.Tags; ss += t.ElapsedMilliseconds + " "; t.Restart(); InitResponseInfo(); ss += t.ElapsedMilliseconds + " "; t.Restart(); //杨斌 2014-12-12 switch (ResponseType) { case ResponseType.ScoreRankChart: case ResponseType.ScoreRankGroupChart: case ResponseType.SlideCompChart: case ResponseType.SlideCompGroup://杨斌 2017-01-19 case ResponseType.CompVote://杨斌 2017-06-11 GlobalInfo.response.RefreshChart(); break; case ResponseType.None: case ResponseType.Slide: if ((GlobalInfo.OEMLogo == OEMLogos.oemPowerVote) || (GlobalInfo.OEMLogo == OEMLogos.oemAngage))//杨斌 2018-03-22 { //GlobalInfo.response.RefreshChart(); Slide sld = Globals.SunVoteARSAddIn.PPTShow.SlideShow; TagSet tagSet = new TagSet(sld.Tags); PPTOper.SaveChartPosition(sld, tagSet); Globals.SunVoteARSAddIn.PPTEdit.InitChart(true, sld); } break; } } catch (Exception ex) { SlideShow = null; TagSetSlide.Tags = null; } if (GlobalInfo.sysConfig.DemoEnable) { if (FrmVoteBar != null) FrmVoteBar.RefreshDemoModeShow(); } ss += t.ElapsedMilliseconds + " "; t.Restart(); //杨斌 2016-07-12 bool isChartShowWin = false; if (Globals.SunVoteARSAddIn.PPTShow.SlideShow != null) { if (Globals.SunVoteARSAddIn.PPTShow.IsChartShowWindow(Globals.SunVoteARSAddIn.PPTShow.SlideShow)) { isChartShowWin = true; } } if ((FrmChart != null) && (!FrmChart.IsDisposed)) { if ((!isChartShowWin) || (!HasChart(SlideShow))) FrmChart.Hide(); } //GlobalInfo.response.RefreshLable(); //修改标志 2012-05-03 赵丽 普通幻灯片隐藏工具栏 if ((ResponseType == ResponseType.None) || (ResponseType == ResponseType.Slide) || (ResponseType == ResponseType.ScoreRankChart) || (ResponseType == ResponseType.ScoreRankGroupChart)//杨斌 2014-08-06 || (ResponseType == ResponseType.SlideCompChart)//杨斌 2014-12-10 || (ResponseType == ResponseType.SlideCompGroup)//杨斌 2017-01-19 || (ResponseType == SunVoteARSPPT.ResponseType.ScoreRankGroupMVP)//杨斌 2015-07-07 || (ResponseType == SunVoteARSPPT.ResponseType.OperatorSlide)//杨斌 2015-07-23 || (ResponseType == SunVoteARSPPT.ResponseType.CompVote)//杨斌 2017-06-07 )//杨斌 2015-07-23 { FrmVoteBar.Hide(); //杨斌 2018-08-10 //FrmVoteBar.ActivateSlideShowWindow(); //if (Globals.SunVoteARSAddIn.GetPPTVersion() >= 15)//杨斌 2020-07-27 { SendMsg.SendMsgKey("StartHotKey"); SendMsg.SendMsgKey("CheckPPT"); } //普通幻灯片也可以抢答,因此注释掉。杨斌 2016-04-20 //SendMsg.SendMsgKey("StopHotKey"); //Angage的版本普通幻灯片屏蔽快捷键。杨斌 2019-03-15。 if ((GlobalInfo.OEMLogo == OEMLogos.oemAngage) || (GlobalInfo.OEMLogo == OEMLogos.oemPowerVote)) { SendMsg.SendMsgKey("StopHotKey"); } if (ResponseType == SunVoteARSPPT.ResponseType.ScoreRankGroupMVP) { //FrmVoteBar.InitState(); PPTOper.ShowTableMVP(Globals.SunVoteARSAddIn.PPTShow.SlideShow, false); } if (ResponseType == SunVoteARSPPT.ResponseType.CompVote)//杨斌 2017-06-07 { //FrmVoteBar.InitState(); PPTOper.ShowTableCompVote(Globals.SunVoteARSAddIn.PPTShow.SlideShow, false); } FrmVoteBar.DelayVoteStart = 0;//杨斌 2019-09-30 SendSlideScreen();//杨斌 2017-12-10 try { Globals.SunVoteARSAddIn.PPTShow.SlideShow.Select();//杨斌 2019-10-22。播放普通幻灯片获得焦点也不能翻页问题 } catch { } return; } else { //杨斌 2013-11-29 //if (Globals.SunVoteARSAddIn.GetPPTVersion() >= 15)//杨斌 2020-07-27 { SendMsg.SendMsgKey("StartHotKey"); SendMsg.SendMsgKey("CheckPPT"); } //else//调试。注释掉。杨斌 2015-07-08 // Globals.SunVoteARSAddIn.HotKey.EnabledKeyHook = true; } ss += t.ElapsedMilliseconds + " "; t.Restart(); FrmVoteBar.InitState(); if (FrmVoteBar.frmVoteDetail != null) FrmVoteBar.frmVoteDetail.ShowMapStateCount(); ss += t.ElapsedMilliseconds + " "; t.Restart(); //HidePicture(); //if ((GlobalInfo.response.ShowByHand) || (GlobalInfo.response.ChartViewType == ChartViewType.csStart)) // GlobalInfo.response.RefreshChart(); //2012-08-06 赵丽 修改播放时自动启动投票的BUG //杨斌 2014-11-05 int isResponsed = GlobalInfo.response.ResponseDataList.Count; //TagSetSlide.GetValue(TagKey.Slide_IsResponsed).ToInt;//杨斌 2014-09-05 if (GlobalInfo.sysConfig.AutoVoteOnShowSlide)//杨斌 2014-07-25 { if ((FrmVoteBar != null) && (isNext) && (isResponsed == 0))//杨斌 2014-09-05 { if (!FrmVoteBar.IsVoteStart)//杨斌 2014-08-19 { //杨斌 2015-01-22 if (GlobalInfo.JudgeDogFailed()) { } else { //杨斌 2017-01-06 string BaseIDsOn = GlobalInfo.GetBaseConnectOkIDs();//GlobalInfo.baseConnect.GetBaseIDs(true); bool isConnect = (BaseIDsOn.Length > 0); if (GlobalInfo.sysConfig.DemoEnable || isConnect) //if (FrmVoteBar.tsbVoteStart.Enabled) { if (!FrmVoteBar.JudgeOpratorCanVote(false))//杨斌 2015-07-24 return; FrmVoteBar.DelayVoteStart = GlobalInfo.sysConfig.AutoPageWaitTime; FrmVoteBar.VoteStart(true); } } } } } else if (IsAutoShowNext) { if (GlobalInfo.response.NextSlideAutoStart) { GlobalInfo.response.NextSlideAutoStart = false; if ((FrmVoteBar != null) && (isNext) && (isResponsed == 0) && (GlobalInfo.IsSupportVoteType()))//杨斌 2017-08-31 { if (!FrmVoteBar.IsVoteStart)//杨斌 2014-08-19 { //杨斌 2015-01-22 if (GlobalInfo.JudgeDogFailed()) { } else { if (!FrmVoteBar.JudgeOpratorCanVote(false))//杨斌 2015-07-24 return; } } } } } //杨斌 2016-06-28 GlobalInfo.response.tmrRefresh.Interval = 1000; if (isChartShowWin) { GlobalInfo.response.tmrRefresh.Interval = 500; } ss += t.ElapsedMilliseconds + " "; t.Restart(); FrmVoteBar.ShowDebug(ss); } public void SendSlideScreen(Slide sld = null, NetSession session = null)//杨斌 2017-12-10 { byte[] sldData = null; if (sld == null) sld = SlideShow; sldData = PPTOper.GetSlidePic(sld); if (sldData == null) sldData = new byte[1]; VoteServer.SendData(sldData, session); } public void SendSlideScreenTimer(Slide sld = null) { if (TmrSendSlideScreen == null) { TmrSendSlideScreen = new System.Timers.Timer(); TmrSendSlideScreen.Elapsed += TmrSendSlideScreen_Elapsed; } //if (TmrSendSlideScreen.Enabled) // return; SlideSendScreen = sld; if (TmrSendSlideScreen.Enabled)//不重入。杨斌 2018-06-25 return; TmrSendSlideScreen.Interval = 1000; TmrSendSlideScreen.AutoReset = false; TmrSendSlideScreen.Enabled = true; } public void StopTmrSendSlideScreen() { if (TmrSendSlideScreen != null) TmrSendSlideScreen.Enabled = false; } System.Timers.Timer TmrSendSlideScreen = null; Slide SlideSendScreen = null; private void TmrSendSlideScreen_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { SendSlideScreen(SlideSendScreen); TmrSendSlideScreen.Enabled = false; } /// /// 播放幻灯片切换,如翻页时 /// 初始化工具栏、加载反馈相关数据 /// /// void PPT_SlideShowNextSlide(Microsoft.Office.Interop.PowerPoint.SlideShowWindow Wn) { ThNextRun(Wn); } /// /// 结束播放幻灯片 /// 卸载对象(工具栏,播放时打开的窗体) /// /// void PPT_SlideShowEnd(Microsoft.Office.Interop.PowerPoint.Presentation Pres) { //2012-08-06 赵丽 修改播放幻灯片时自动启用的BUG IsAutoShowNext = false; //if (Busines) //GlobalInfo.response.Busines.Stop(); //放映结束事件前产生PPTEdit中的SlideChange事件,恢复面板的可设置状态 TagSet tagSet = new TagSet(); tagSet.Tags = Globals.SunVoteARSAddIn.PPTEdit.SlideEdit.Tags; FrmVoteBar.PanelEnabled = ((tagSet.GetValue(TagKey.Responsed).ToInt == 0) ? true : false); if (GlobalInfo.response.BusinessStatus == ResponseStatus.bsStart)//杨斌 2015-03-17 GlobalInfo.response.BusinessStatus = ResponseStatus.bsStop; //更新日志 赵丽 2012-08-02 停止后进入准备状态 GlobalInfo.response.BusinessStatus = ResponseStatus.bsReady; CloseFormChart();//杨斌 2019-07-15 bool isDoVoted = false; if (FrmVoteBar != null) { if (FrmVoteBar.IsVoteStart) { //结束放映,保存当前数据 FrmVoteBar.VoteStart(false); } isDoVoted = FrmVoteBar.IsDoVoted; FrmVoteBar.Close(); FrmVoteBar = null; } //CloseFormChart();//杨斌 2016-06-17 //鼠标翻页退出播放时,下面代码刷新图表数据有问题。杨斌 2018-02-08 //Globals.SunVoteARSAddIn.PPTEdit.InitChart(true, Globals.SunVoteARSAddIn.PPTEdit.SlideEdit, true); ShowPicture(); SlideShow = null; //GlobalInfo.baseConnect.IsResponse= false; ShowCorrectAnswerAll(true); SendSlideScreen(); if (GlobalInfo.sysConfig.FtpAutoUp && isDoVoted)//杨斌 2018-01-02 { List lstExam = FrmFTPServer.GetExamInfo(); if (lstExam.Count >= 2) new FrmFTPServer().ShowAutoUp(); } } private void CloseFormChart() { if ((FrmChart != null) && (!FrmChart.IsDisposed))//杨斌 2016-06-17 { FrmChart.Close(); FrmChart = null; } } /// /// 初始化反馈信息 /// private void InitResponseInfo() { bool r = Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.ReadOnlyPPT; Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.ReadOnlyPPT = false; //初始化 GlobalInfo.response.TagSet = TagSetSlide; GlobalInfo.response.CurrentSlide = SlideShow; GlobalInfo.response.InitResponse(); FrmVoteBar.frmVoteDetail.LoadDataValues();//杨斌 2018-10-31 FrmVoteBar.frmVoteDetail.InitSignInMode();//杨斌 2013-01-30 FrmVoteBar.frmVoteDetail.InitMap();//加载坐席图数据 FrmVoteBar.frmVoteDetail.InitSignInMap();//杨斌 2017-02-23 GlobalInfo.response.RefreshLable();//杨斌 2013-02-26 //刷新分数。杨斌 2018-02-07 if (Globals.SunVoteARSAddIn.PPTShow.ResponseType == ResponseType.Score) { GlobalInfo.response.CaculateScore(Globals.SunVoteARSAddIn.PPTShow.SlideShow); } //初始化会中控制的状态栏 //会中控制手动显示图表的参数 if (Globals.SunVoteARSAddIn.PPTShow.ResponseType != ResponseType.None) { ChartTypes chartType = EnumName.GetEnum(TagSetSlide.GetValue(TagKey.ChartPara_Type).Value); foreach (Shape shape in Globals.SunVoteARSAddIn.PPTShow.SlideShow.Shapes) { if (shape.Name == "pic") { switch (chartType) { case ChartTypes.ctBar: case ChartTypes.ctBarBox: Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.SetValue(TagKey.Picture_Height_Bar, shape.Height); Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.SetValue(TagKey.Picture_Left_Bar, shape.Left); Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.SetValue(TagKey.Picture_Top_Bar, shape.Top); Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.SetValue(TagKey.Picture_Width_Bar, shape.Width); break; case ChartTypes.ctColumn: case ChartTypes.ctColumnBox: Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.SetValue(TagKey.Picture_Height_Column, shape.Height); Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.SetValue(TagKey.Picture_Left_Column, shape.Left); Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.SetValue(TagKey.Picture_Top_Column, shape.Top); Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.SetValue(TagKey.Picture_Width_Column, shape.Width); break; case ChartTypes.ctPie: Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.SetValue(TagKey.Picture_Height_Pie, shape.Height); Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.SetValue(TagKey.Picture_Left_Pie, shape.Left); Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.SetValue(TagKey.Picture_Top_Pie, shape.Top); Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.SetValue(TagKey.Picture_Width_Pie, shape.Width); break; } } } } if (Globals.SunVoteARSAddIn.PPTShow.ResponseType != ResponseType.None) { //显示幻灯片的Tag值 TagSet tagSet = new TagSet(); tagSet.Tags = Globals.SunVoteARSAddIn.PPTShow.SlideShow.Tags; } //准备 GlobalInfo.response.BusinessStatus = ResponseStatus.bsReady; Globals.SunVoteARSAddIn.PPTShow.TagSetSlide.ReadOnlyPPT = r; } public bool HasChart(Slide sld) { bool res = false; try { ResponseType type = SunVoteARSPPT.ResponseType.None; if (sld != null) type = PPTOper.GetSlideType(sld); TagSet tagSet = null; switch (type) { case ResponseType.None: case ResponseType.Slide: res = false; break; case SunVoteARSPPT.ResponseType.SignIn://杨斌 2016-07-21 tagSet = new TagSet(sld.Tags); string chartType = tagSet.GetValue(TagKey.ChartPara_Type).Value; res = (chartType != "ctText"); break; case ResponseType.Score: case ResponseType.Order: case ResponseType.Number: case ResponseType.Text://杨斌 2015-01-12 case ResponseType.Poll: case ResponseType.ScoreRankGroupMVP://杨斌 2015-06-09 case ResponseType.OperatorSlide://杨斌 2015-07-22 case ResponseType.CompVote://杨斌 2017-06-07 if (type == ResponseType.Order) { tagSet = new TagSet(sld.Tags); int scoreMode = tagSet.GetValue(TagKey.Order_ScoreMode).ToInt; res = (scoreMode == 1); } else res = false; break; default: res = true; break; } } catch (Exception ex) { SystemLog.WriterLog(ex, false); } return res; } /// /// 判断图表是否需要弹窗显示。杨斌 2016-06-21 /// /// /// public bool IsChartShowWindow(Slide sld) { bool res = false; ResponseType type = SunVoteARSPPT.ResponseType.None; if (sld != null) type = PPTOper.GetSlideType(sld); bool hasChart = HasChart(sld); if (hasChart) { if (GlobalInfo.sysConfig.ChartAlwaysShowWindow) { res = true; } else { TagSet tagSet = new TagSet(); //if (sld == null) // tagSet.Tags = Globals.SunVoteARSAddIn.PPTShow.SlideShow.Tags; //else tagSet.Tags = sld.Tags; res = tagSet.GetValue(TagKey.ChartPara_ShowWindow).ToInt == 1; } } return res; } /// /// 显示(播放前)或隐藏(播放结束)所有反馈幻灯片正确答案标签 /// 创建:杨斌 2012-03-15 /// /// public void ShowCorrectAnswerAll(bool isShow) { try { if (Globals.SunVoteARSAddIn.Application.ActivePresentation == null) return; foreach (Slide slide in Globals.SunVoteARSAddIn.Application.ActivePresentation.Slides) { PPTOper.ShowCorrectAnswer(slide, isShow, false); } if ((FrmVoteBar != null) && (!FrmVoteBar.IsDisposed))//杨斌 2017-12-22 FrmVoteBar.Activate(); FrmVoteBar.ActivateSlideShowWindow(); } catch (Exception ex) { SystemLog.WriterLog(ex, false); } } } }