星火微课系统客户端
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

XHMicroLessonSystemWindow.xaml.cs 41KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114
  1. using Aspose.Words;
  2. using Aspose.Words.Saving;
  3. using Common.system;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Drawing.Imaging;
  7. using System.IO;
  8. using System.Threading;
  9. using System.Windows;
  10. using System.Windows.Forms;
  11. using System.Windows.Ink;
  12. using System.Windows.Input;
  13. using System.Windows.Media;
  14. using System.Windows.Media.Imaging;
  15. using XHWK.Model;
  16. using System;
  17. using System.Collections.Generic;
  18. using System.Text;
  19. using System.Windows;
  20. using System.Windows.Controls;
  21. using System.Windows.Data;
  22. using System.Windows.Documents;
  23. using System.Windows.Input;
  24. using System.Windows.Media;
  25. using System.Windows.Media.Imaging;
  26. using System.Windows.Navigation;
  27. using System.Windows.Shapes;
  28. using System.Diagnostics;
  29. using ComeCapture;
  30. namespace XHWK.WKTool
  31. {
  32. /// <summary>
  33. /// 主页面
  34. /// </summary>
  35. public partial class XHMicroLessonSystemWindow : Window
  36. {
  37. #region 初始值
  38. /// <summary>
  39. /// 文件目录窗口
  40. /// </summary>
  41. //private CountdownWindow FileDirectoryWindows = null;
  42. private FolderBrowserDialog Ofd;
  43. private DialogResult Result;
  44. public readonly BlackboardNew myblackboard;
  45. private System.Windows.Forms.DialogResult result;
  46. private System.Windows.Forms.OpenFileDialog ofd;
  47. //声明一个 DrawingAttributes 类型的变量
  48. DrawingAttributes drawingAttributes;
  49. //定义事件
  50. public event ChangeTextHandler ChangeTextEvent;
  51. //定义委托
  52. public delegate void ChangeTextHandler(string text);
  53. #endregion
  54. #region 初始化
  55. /// <summary>
  56. /// 主页面
  57. /// </summary>
  58. public XHMicroLessonSystemWindow()
  59. {
  60. InitializeComponent();
  61. myblackboard = new BlackboardNew(blackboard_canvas);
  62. APP.pageData.pagenum = 1;
  63. APP.pageData.currpage = 1;
  64. DataContext = APP.pageData;
  65. txbStoragePath.Text = FileToolsCommon.GetConfigValue("VideoType");
  66. if (FileToolsCommon.GetConfigValue("IsSound").Equals("true"))
  67. {
  68. rbnY.IsChecked = true;
  69. }
  70. else
  71. {
  72. rbnN.IsChecked = true;
  73. }
  74. txbStoragePath.Text = FileToolsCommon.GetConfigValue("VideoSavePath");
  75. Initialize();
  76. }
  77. /// <summary>
  78. /// 初始化
  79. /// </summary>
  80. public void Initialize()
  81. {
  82. //创建 DrawingAttributes 类的一个实例
  83. drawingAttributes = new DrawingAttributes();
  84. //将 InkCanvas 的 DefaultDrawingAttributes 属性的值赋成创建的 DrawingAttributes 类的对象的引用
  85. //InkCanvas 通过 DefaultDrawingAttributes 属性来获取墨迹的各种设置,该属性的类型为 DrawingAttributes 型
  86. blackboard_canvas.DefaultDrawingAttributes = drawingAttributes;
  87. drawingAttributes.FitToCurve = true;
  88. wfhCamera.Visibility = Visibility.Hidden;
  89. }
  90. #endregion
  91. #region 事件
  92. /// <summary>
  93. /// 窗体移动
  94. /// </summary>
  95. /// <param name="sender"></param>
  96. /// <param name="e"></param>
  97. private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  98. {
  99. DragMove();
  100. }
  101. /// <summary>
  102. /// 摄像头打开事件
  103. /// </summary>
  104. /// <param name="sender"></param>
  105. /// <param name="e"></param>
  106. private void RbnOpen_Click(object sender, RoutedEventArgs e)
  107. {
  108. //UCCamera win = new UCCamera();
  109. ////win.Topmost = true;
  110. //win.ShowDialog();
  111. wfhCamera.Visibility = Visibility.Visible;
  112. CameraHelper.IsDisplay = true;
  113. CameraHelper.SourcePlayer = player;
  114. CameraHelper.UpdateCameraDevices();
  115. if (CameraHelper.CameraDevices.Count > 0)
  116. {
  117. CameraHelper.SetCameraDevice(0);
  118. }
  119. }
  120. /// <summary>
  121. /// 摄像头关闭事件
  122. /// </summary>
  123. /// <param name="sender"></param>
  124. /// <param name="e"></param>
  125. private void RbnTurnOff_Click(object sender, RoutedEventArgs e)
  126. {
  127. wfhCamera.Visibility = Visibility.Hidden;
  128. CameraHelper.CloseDevice();
  129. }
  130. #endregion
  131. /// <summary>
  132. /// 录屏事件
  133. /// </summary>
  134. /// <param name="sender"></param>
  135. /// <param name="e"></param>
  136. private void BtnScreenRecording_Click(object sender, RoutedEventArgs e)
  137. {
  138. if (APP.IsLoginType == false)
  139. {
  140. Login();
  141. return;
  142. }
  143. if (APP.W_ScreenRecordingToolbarWindow == null)
  144. {
  145. APP.W_ScreenRecordingToolbarWindow = new ScreenRecordingToolbarWindow
  146. {
  147. Topmost = true
  148. };
  149. APP.W_ScreenRecordingToolbarWindow.Initialize();
  150. }
  151. else
  152. {
  153. APP.W_ScreenRecordingToolbarWindow.Initialize();
  154. }
  155. //显示在右下角
  156. APP.W_ScreenRecordingToolbarWindow.Left = PrimaryScreen.DESKTOP.Width - APP.W_ScreenRecordingToolbarWindow.Width - 10;
  157. APP.W_ScreenRecordingToolbarWindow.Top = PrimaryScreen.DESKTOP.Height - APP.W_ScreenRecordingToolbarWindow.Height - 60;
  158. APP.W_ScreenRecordingToolbarWindow.Topmost = true;
  159. APP.W_ScreenRecordingToolbarWindow.Show();
  160. Hide();
  161. }
  162. /// <summary>
  163. /// 上传事件
  164. /// </summary>
  165. /// <param name="sender"></param>
  166. /// <param name="e"></param>
  167. private void BtnUpload_Click(object sender, RoutedEventArgs e)
  168. {
  169. if (APP.IsLoginType == false)
  170. {
  171. Login();
  172. return;
  173. }
  174. FileDirectoryWindow fileDirectoryWindow = new FileDirectoryWindow();
  175. fileDirectoryWindow.Show();
  176. }
  177. /// <summary>
  178. /// 关闭事件
  179. /// </summary>
  180. /// <param name="sender"></param>
  181. /// <param name="e"></param>
  182. private void BtnDown_Click(object sender, RoutedEventArgs e)
  183. {
  184. System.Environment.Exit(0);
  185. }
  186. /// <summary>
  187. /// 设置 保存事件
  188. /// </summary>
  189. /// <param name="sender"></param>
  190. /// <param name="e"></param>
  191. private void BtnSave_Click(object sender, RoutedEventArgs e)
  192. {
  193. #region 合法性判断
  194. if (string.IsNullOrWhiteSpace(txbStoragePath.Text.Trim()))
  195. {
  196. System.Windows.MessageBox.Show("路径不可为空!");
  197. return;
  198. }
  199. string temp = FileToolsCommon.GetLegalPath(txbStoragePath.Text) + APP.WKData.WkName.Trim() + "/";
  200. if (!APP.WKData.WkPath.Equals(temp))
  201. {
  202. APP.WKData.WkPath = FileToolsCommon.GetLegalPath(txbStoragePath.Text) + APP.WKData.WkName.Trim() + "/";
  203. if (FileToolsCommon.IsExistDirectory(APP.WKData.WkPath))
  204. {
  205. //微课已存在
  206. MessageBoxResult dr = System.Windows.MessageBox.Show("讲解已存在是否覆盖?", "提示", MessageBoxButton.OKCancel);
  207. if (dr == MessageBoxResult.OK)
  208. {
  209. FileToolsCommon.DeleteDirectory(APP.WKData.WkPath);
  210. }
  211. else
  212. {
  213. return;
  214. }
  215. }
  216. //创建文件夹
  217. FileToolsCommon.CreateDirectory(APP.WKData.WkPath);
  218. }
  219. #endregion
  220. if (rbnMP4.IsChecked == true)
  221. {
  222. //存储文件
  223. FileToolsCommon.SetConfigValue("VideoType", "1");
  224. }
  225. else if (rbnFLV.IsChecked == true)
  226. {
  227. FileToolsCommon.SetConfigValue("VideoType", "2");
  228. }
  229. else
  230. {
  231. FileToolsCommon.SetConfigValue("VideoType", "3");
  232. }
  233. if (rbnY.IsChecked == true)
  234. {
  235. FileToolsCommon.SetConfigValue("IsSound", "true");
  236. }
  237. else
  238. {
  239. FileToolsCommon.SetConfigValue("IsSound", "false");
  240. }
  241. GridMain.Visibility = Visibility.Visible;
  242. gridSetUp.Visibility = Visibility.Collapsed;
  243. }
  244. /// <summary>
  245. /// 设置事件
  246. /// </summary>
  247. /// <param name="sender"></param>
  248. /// <param name="e"></param>
  249. private void BtnSetUp_Click(object sender, RoutedEventArgs e)
  250. {
  251. GridMain.Visibility = Visibility.Collapsed;
  252. gridSetUp.Visibility = Visibility.Visible;
  253. }
  254. /// <summary>
  255. /// 设置 浏览事件
  256. /// </summary>
  257. /// <param name="sender"></param>
  258. /// <param name="e"></param>
  259. private void BtnBrowse_Click(object sender, RoutedEventArgs e)
  260. {
  261. string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
  262. Ofd = new System.Windows.Forms.FolderBrowserDialog();
  263. Result = Ofd.ShowDialog();
  264. if (Result == System.Windows.Forms.DialogResult.OK)
  265. {
  266. if (Ofd.SelectedPath != "")
  267. {
  268. txbStoragePath.Text = Ofd.SelectedPath;
  269. //string ApplicationData = ZConfig.dataPath + "fileStorageAddress.txt";
  270. //string temp = ofd.SelectedPath;
  271. //System.IO.File.WriteAllText(ApplicationData, temp, Encoding.Default);
  272. }
  273. }
  274. }
  275. /// <summary>
  276. /// 画笔颜色事件 白色
  277. /// </summary>
  278. /// <param name="sender"></param>
  279. /// <param name="e"></param>
  280. private void BtnWhite_Click(object sender, RoutedEventArgs e)
  281. {
  282. ////创建 DrawingAttributes 类的一个实例
  283. //drawingAttributes = new DrawingAttributes();
  284. ////将 InkCanvas 的 DefaultDrawingAttributes 属性的值赋成创建的 DrawingAttributes 类的对象的引用
  285. ////InkCanvas 通过 DefaultDrawingAttributes 属性来获取墨迹的各种设置,该属性的类型为 DrawingAttributes 型
  286. //blackboard_canvas.DefaultDrawingAttributes = drawingAttributes;
  287. ////设置 DrawingAttributes 的 Color 属性设置颜色
  288. drawingAttributes.Color = Colors.White;
  289. }
  290. /// <summary>
  291. /// 画笔颜色事件 红色
  292. /// </summary>
  293. /// <param name="sender"></param>
  294. /// <param name="e"></param>
  295. private void BtnRed_Click(object sender, RoutedEventArgs e)
  296. {
  297. //设置 DrawingAttributes 的 Color 属性设置颜色
  298. drawingAttributes.Color = Colors.Red;
  299. }
  300. /// <summary>
  301. /// 画笔颜色事件 灰色
  302. /// </summary>
  303. /// <param name="sender"></param>
  304. /// <param name="e"></param>
  305. private void BtnGray_Click(object sender, RoutedEventArgs e)
  306. {
  307. drawingAttributes.Color = Colors.Gray;
  308. }
  309. /// <summary>
  310. /// 画笔颜色事件 青色
  311. /// </summary>
  312. /// <param name="sender"></param>
  313. /// <param name="e"></param>
  314. private void BtnCyanBlue_Click(object sender, RoutedEventArgs e)
  315. {
  316. drawingAttributes.Color = Colors.LimeGreen;
  317. }
  318. /// <summary>
  319. /// 画笔颜色事件 黄色
  320. /// </summary>
  321. /// <param name="sender"></param>
  322. /// <param name="e"></param>
  323. private void BtnYellow_Click(object sender, RoutedEventArgs e)
  324. {
  325. drawingAttributes.Color = Colors.Gold;
  326. }
  327. /// <summary>
  328. /// 画笔颜色事件 蓝色
  329. /// </summary>
  330. /// <param name="sender"></param>
  331. /// <param name="e"></param>
  332. private void BtnBlue_Click(object sender, RoutedEventArgs e)
  333. {
  334. drawingAttributes.Color = Colors.DeepSkyBlue;
  335. }
  336. /// <summary>
  337. /// 画笔粗细事件 细
  338. /// </summary>
  339. /// <param name="sender"></param>
  340. /// <param name="e"></param>
  341. private void RbnFine_Click(object sender, RoutedEventArgs e)
  342. {
  343. drawingAttributes.Width = 1;
  344. drawingAttributes.Height = 1;
  345. }
  346. /// <summary>
  347. /// 画笔粗细事件 中
  348. /// </summary>
  349. /// <param name="sender"></param>
  350. /// <param name="e"></param>
  351. private void RbnIn_Click(object sender, RoutedEventArgs e)
  352. {
  353. drawingAttributes.Width = 3;
  354. drawingAttributes.Height = 3;
  355. }
  356. /// <summary>
  357. /// 画笔粗细事件 粗
  358. /// </summary>
  359. /// <param name="sender"></param>
  360. /// <param name="e"></param>
  361. private void RbnCrude_Click(object sender, RoutedEventArgs e)
  362. {
  363. drawingAttributes.Width = 5;
  364. drawingAttributes.Height = 5;
  365. }
  366. /// <summary>
  367. /// 登陆事件
  368. /// </summary>
  369. /// <param name="sender"></param>
  370. /// <param name="e"></param>
  371. private void BtnLoginType_Click(object sender, RoutedEventArgs e)
  372. {
  373. Login();
  374. }
  375. /// <summary>
  376. /// 登陆
  377. /// </summary>
  378. private void Login()
  379. {
  380. if (APP.W_LoginWindow == null)
  381. {
  382. APP.W_LoginWindow = new LoginWindow();
  383. }
  384. else
  385. {
  386. APP.W_LoginWindow.Initialize();
  387. }
  388. APP.W_LoginWindow.ShowDialog();
  389. if (APP.IsLoginType)
  390. {
  391. txbLoginType.Text = APP.UserInfo.Username;
  392. }
  393. else
  394. {
  395. txbLoginType.Text = "未登录";
  396. }
  397. }
  398. /// <summary>
  399. /// 截图事件
  400. /// </summary>
  401. /// <param name="sender"></param>
  402. /// <param name="e"></param>
  403. private void BtnScreenshot_Click(object sender, RoutedEventArgs e)
  404. {
  405. if (APP.IsLoginType == false)
  406. {
  407. Login();
  408. return;
  409. }
  410. string time = GetTimeStamp();
  411. string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + time + ".jpg";
  412. ImageHelper.GetScreenshot(new System.Drawing.Rectangle(0, 0, 0, 0), desktopPath);
  413. if (APP.W_JieTuWindow != null)
  414. {
  415. APP.W_JieTuWindow.initialization();
  416. APP.W_JieTuWindow.Screenshot();
  417. APP.W_JieTuWindow.WindowState = WindowState.Maximized;
  418. APP.W_JieTuWindow.Visibility = Visibility.Visible;
  419. }
  420. else
  421. {
  422. APP.W_JieTuWindow = new JieTuWindow();
  423. // 订阅事件
  424. APP.W_JieTuWindow.ChangeTextEvent += new ChangeTextHandler(frm_ChangeTextEvent);
  425. APP.W_JieTuWindow.click_closeJietuWindowClick += JietuWindow_click_closeJietuWindowClick;
  426. APP.W_JieTuWindow.Show();
  427. }
  428. //imgCanvas.Source = new BitmapImage(new Uri(desktopPath));
  429. }
  430. /// <summary>
  431. /// 截图关闭窗口
  432. /// </summary>
  433. /// <param name="text"></param>
  434. private void frm_ChangeTextEvent(string text)
  435. {
  436. if ("关闭窗口".Equals(text))
  437. {
  438. if(!string.IsNullOrWhiteSpace(APP.ImgPath)&&File.Exists(APP.ImgPath))
  439. {
  440. APP.JPaths[APP.pageData.currpage]= APP.ImgPath;
  441. if(!string.IsNullOrWhiteSpace(APP.JPaths[APP.pageData.currpage]))
  442. {
  443. imgCanvas.Source = new BitmapImage(new Uri(APP.JPaths[APP.pageData.currpage]));
  444. }
  445. }
  446. }
  447. }
  448. /// <summary>
  449. /// 截图关闭 非正常关闭截图时,截图清空
  450. /// </summary>
  451. private void JietuWindow_click_closeJietuWindowClick()
  452. {
  453. APP.W_JieTuWindow = null;
  454. }
  455. /// <summary>
  456. /// 获取时间戳
  457. /// </summary>
  458. /// <returns></returns>
  459. public string GetTimeStamp()
  460. {
  461. TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
  462. return Convert.ToInt64(ts.TotalSeconds).ToString();
  463. }
  464. /// <summary>
  465. /// 导入事件
  466. /// </summary>
  467. /// <param name="sender"></param>
  468. /// <param name="e"></param>
  469. private void BtnImport_Click(object sender, RoutedEventArgs e)
  470. {
  471. if (APP.IsLoginType == false)
  472. {
  473. Login();
  474. return;
  475. }
  476. try
  477. {
  478. string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
  479. ofd = new System.Windows.Forms.OpenFileDialog
  480. {
  481. Filter = "文档|*.docx;*.doc",
  482. InitialDirectory = desktopPath,
  483. Multiselect = false,
  484. AddExtension = true,
  485. DereferenceLinks = true
  486. };
  487. new Thread(
  488. o =>
  489. {
  490. Thread.Sleep(400);
  491. Dispatcher.Invoke(new Action(() =>
  492. {
  493. openDialog();
  494. }
  495. ));
  496. })
  497. {
  498. IsBackground = true
  499. }.Start();
  500. }
  501. catch (Exception ex)
  502. {
  503. LogHelper.WriteErrLog("【导入(BtnImport_Click)" + ex.Message, ex);
  504. }
  505. }
  506. private void openDialog()
  507. {
  508. result = ofd.ShowDialog();
  509. if (result == System.Windows.Forms.DialogResult.OK)
  510. {
  511. if (ofd.FileName != "")
  512. {
  513. string filepath = ofd.FileName;
  514. string path = AppDomain.CurrentDomain.BaseDirectory + "Temp\\";
  515. APP.Paths = ConvertWordToImage(filepath, path, "", 0, 0, null, 0).ToArray();
  516. for (int i = 0; i < APP.Paths.Length; i++)
  517. {
  518. APP.pageData.pagenum += 1;
  519. //APP.pageData.currpage = APP.pageData.pagenum;
  520. //myblackboard.changepage(APP.pageData.currpage - 1);
  521. }
  522. if (APP.pageData.pagenum > 1)
  523. {
  524. APP.pageData.pagenum -= 1;
  525. }
  526. if (APP.pageData.currpage > 1)
  527. {
  528. //APP.pageData.currpage -= 1;
  529. //myblackboard.changepage(APP.pageData.currpage - 1);
  530. }
  531. if (!string.IsNullOrWhiteSpace(txbCurrpage.Text) && APP.pageData.currpage < APP.Paths.Length)
  532. {
  533. imgCanvas.Source = new BitmapImage(new Uri(APP.Paths[APP.pageData.currpage - 1]));
  534. }
  535. else
  536. {
  537. imgCanvas.Source = null;
  538. }
  539. }
  540. }
  541. }
  542. #region 录制窗口
  543. #region 变量
  544. /// <summary>
  545. /// 视频保存路径
  546. /// </summary>
  547. string RecordingPath;
  548. /// <summary>
  549. /// 图片保存路径
  550. /// </summary>
  551. string ImgPath;
  552. /// <summary>
  553. /// 音频保存路径名
  554. /// </summary>
  555. string AudioPathName;
  556. /// <summary>
  557. /// 视频保存路径名
  558. /// </summary>
  559. string VideoSavePathName;
  560. /// <summary>
  561. /// 暂停录制
  562. /// </summary>
  563. bool IsSuspendR = true;
  564. /// <summary>
  565. /// 是否首次录制
  566. /// </summary>
  567. bool IsFirstR = true;
  568. /// <summary>
  569. /// 图片
  570. /// </summary>
  571. List<string> RsImgName = null;
  572. /// <summary>
  573. /// 是否开始截图计数
  574. /// </summary>
  575. bool IsStartCount = false;
  576. #endregion
  577. /// <summary>
  578. /// 录制窗口内容
  579. /// </summary>
  580. /// <param name="sender"></param>
  581. /// <param name="e"></param>
  582. private void BtnRecord_Click(object sender, RoutedEventArgs e)
  583. {
  584. if (APP.IsLoginType == false)
  585. {
  586. Login();
  587. return;
  588. }
  589. blackboard_canvas.Visibility = Visibility.Visible;
  590. StartRecord();
  591. }
  592. /// <summary>
  593. /// 停止录制窗口内容
  594. /// </summary>
  595. /// <param name="sender"></param>
  596. /// <param name="e"></param>
  597. private void BtnStop_Click(object sender, RoutedEventArgs e)
  598. {
  599. if (APP.IsLoginType == false)
  600. {
  601. Login();
  602. return;
  603. }
  604. blackboard_canvas.Visibility = Visibility.Collapsed;
  605. EndRecord();
  606. }
  607. System.Timers.Timer timer;
  608. /// <summary>
  609. /// 开始录制和暂停录制
  610. /// </summary>
  611. void StartRecord()
  612. {
  613. if (IsSuspendR)
  614. {
  615. if (IsFirstR)//是否第一次录制 初始化录制
  616. {
  617. RecordingPath = APP.WKData.WkPath;
  618. ImgPath = APP.WKData.WkPath + "temp/Image/";
  619. AudioPathName = APP.WKData.WkPath + "temp/audio/";
  620. FileToolsCommon.DeleteDirectory(APP.WKData.WkPath + "temp/");
  621. FileToolsCommon.CreateDirectory(RecordingPath);
  622. FileToolsCommon.CreateDirectory(ImgPath);
  623. FileToolsCommon.CreateDirectory(AudioPathName);
  624. AudioPathName += APP.WKData.WkName + ".MP3";
  625. VideoSavePathName = RecordingPath + APP.WKData.WkName + "_录制." + ((Enum_VideoType)int.Parse(FileToolsCommon.GetConfigValue("VideoType"))).ToString();
  626. if (FileToolsCommon.IsExistFile(VideoSavePathName))
  627. {
  628. MessageBoxResult dr = System.Windows.MessageBox.Show("课程已录制,是否覆盖?", "提示", MessageBoxButton.OKCancel);
  629. if (dr == MessageBoxResult.OK)
  630. {
  631. FileToolsCommon.DeleteFile(VideoSavePathName);
  632. }
  633. else
  634. {
  635. return;
  636. }
  637. }
  638. IsFirstR = false;
  639. RsImgName = new List<string>();
  640. timer = new System.Timers.Timer(200);//设置执行一次(false)还是一直执行(true)
  641. timer.AutoReset = true;//设置是否执行System.Timers.Timer.Elapsed事件
  642. timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);
  643. timer.Enabled = true; //启动计时器
  644. #region 保存图片
  645. //new Thread(new ThreadStart(new Action(() =>
  646. //{
  647. // while (true)
  648. // {
  649. // Thread.Sleep(200);
  650. // if (IsStartCount)
  651. // {
  652. // ImgNum++;
  653. // Dispatcher.Invoke(() =>
  654. // {
  655. // lblNumber.Content = ImgNum;
  656. // string FilePathName = ImgPath + ImgNum + ".png";
  657. // ImageHelper.SaveUIToImage(GridMain, FilePathName, (int)GridMain.ActualWidth, (int)GridMain.ActualHeight);
  658. // });
  659. // }
  660. // }
  661. //}))).Start();
  662. #endregion
  663. }
  664. #region 录像倒计时
  665. if (APP.W_CountdownWindow == null)
  666. {
  667. APP.W_CountdownWindow = new CountdownWindow();
  668. //APP.W_CountdownWindow.Topmost = true;
  669. }
  670. else
  671. {
  672. APP.W_CountdownWindow.Initialize();
  673. APP.W_CountdownWindow.Topmost = true;
  674. }
  675. APP.W_CountdownWindow.Show();
  676. #endregion
  677. //继续录制
  678. IsSuspendR = false;
  679. //BtnRecording.Content = "暂停录制";
  680. ImgRecord.Source = new BitmapImage(new Uri("pack://application:,,,/Images/microLessonSystem_23.png"));
  681. TxbRecordingWord.Text = "暂停";
  682. try
  683. {
  684. APP.FFmpeg.StartRecordingAudio(AudioPathName);
  685. new Thread(new ThreadStart(new Action(() =>
  686. {
  687. Thread.Sleep(1000);
  688. Dispatcher.Invoke(() =>
  689. {
  690. IsStartCount = true;
  691. //timer.Start();
  692. });
  693. }))).Start();
  694. }
  695. catch (Exception ex)
  696. {
  697. System.Windows.MessageBox.Show(ex.Message);
  698. }
  699. }
  700. else
  701. {
  702. //暂停
  703. IsSuspendR = true;
  704. ImgRecord.Source = new BitmapImage(new Uri("pack://application:,,,/Images/microLessonSystem_14.png"));
  705. TxbRecordingWord.Text = "继续";
  706. try
  707. {
  708. APP.FFmpeg.SuspendFFmpeg();
  709. new Thread(new ThreadStart(new Action(() =>
  710. {
  711. while (APP.FFmpeg.myProcess != null)
  712. {
  713. Thread.Sleep(100);
  714. }
  715. IsStartCount = false;
  716. }))).Start();
  717. }
  718. catch (Exception ex)
  719. {
  720. System.Windows.MessageBox.Show(ex.Message);
  721. }
  722. }
  723. }
  724. /// <summary>
  725. /// 录制保存图片
  726. /// </summary>
  727. /// <param name="sender"></param>
  728. /// <param name="e"></param>
  729. private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
  730. {
  731. if (IsStartCount)
  732. {
  733. try
  734. {
  735. Dispatcher.Invoke(() =>
  736. {
  737. string FilePathName = ImgPath + RsImgName.Count + ".png";
  738. ImageHelper.SaveUIToImage(GridMain, FilePathName, (int)GridMain.ActualWidth, (int)GridMain.ActualHeight);
  739. RsImgName.Add(FilePathName);
  740. });
  741. }
  742. catch (Exception ex)
  743. {
  744. LogHelper.WriteErrLog("【录制】(Timer_Elapsed)生成图片错误:" + ex.Message, ex);
  745. }
  746. }
  747. }
  748. /// <summary>
  749. /// 停止录制并生成录制文件
  750. /// </summary>
  751. void EndRecord()
  752. {
  753. if (!IsFirstR)
  754. {
  755. IsFirstR = true;
  756. IsSuspendR = true;
  757. ImgRecord.Source = new BitmapImage(new Uri("pack://application:,,,/Images/microLessonSystem_14.png"));
  758. TxbRecordingWord.Text = "录制";
  759. try
  760. {
  761. APP.FFmpeg.StopFFmpeg(AudioPathName);
  762. new Thread(new ThreadStart(new Action(() =>
  763. {
  764. while (APP.FFmpeg.myProcess != null)
  765. {
  766. Thread.Sleep(100);
  767. }
  768. Dispatcher.Invoke(() =>
  769. {
  770. IsStartCount = false;
  771. timer.Stop();
  772. });
  773. }))).Start();
  774. new Thread(new ThreadStart(new Action(() =>
  775. {
  776. while (APP.FFmpeg.myProcess != null)
  777. {
  778. Thread.Sleep(100);
  779. }
  780. }))).Start();
  781. APP.FFmpeg.SynthesisVideo(ImgPath, AudioPathName, VideoSavePathName, 5, (int)GridMain.Width, (int)GridMain.Height);
  782. //生成缩略图
  783. string ThumbnailPath = FileToolsCommon.GetDirectoryName(VideoSavePathName) + "ThumbnailPath/";
  784. FileToolsCommon.CreateDirectory(ThumbnailPath);
  785. //缩略图存储位置
  786. string ThumbnailPathName = ThumbnailPath + FileToolsCommon.GetIOFileNameNoExtension(VideoSavePathName) + ".JPG";
  787. new Thread(new ThreadStart(new Action(() =>
  788. {
  789. while (!FileToolsCommon.IsExistFile(VideoSavePathName))
  790. {
  791. Thread.Sleep(100);
  792. }
  793. FileToolsCommon.DeleteFile(ThumbnailPathName);
  794. APP.FFmpeg.GenerateThumbnails(VideoSavePathName, ThumbnailPathName);
  795. }))).Start();
  796. }
  797. catch (Exception ex)
  798. {
  799. System.Windows.MessageBox.Show(ex.Message);
  800. }
  801. }
  802. }
  803. #endregion
  804. /// <summary>
  805. /// 增加事件
  806. /// </summary>
  807. /// <param name="sender"></param>
  808. /// <param name="e"></param>
  809. private void BtnAdd_Click(object sender, RoutedEventArgs e)
  810. {
  811. if (APP.IsLoginType == false)
  812. {
  813. Login();
  814. return;
  815. }
  816. }
  817. /// <summary>
  818. /// 打印事件
  819. /// </summary>
  820. /// <param name="sender"></param>
  821. /// <param name="e"></param>
  822. private void BtnPrint_Click(object sender, RoutedEventArgs e)
  823. {
  824. }
  825. /// <summary>
  826. /// 我的
  827. /// </summary>
  828. /// <param name="sender"></param>
  829. /// <param name="e"></param>
  830. private void BtnMyMine_Click(object sender, RoutedEventArgs e)
  831. {
  832. if (APP.IsLoginType == false)
  833. {
  834. Login();
  835. return;
  836. }
  837. }
  838. /// <summary>
  839. /// 上一页
  840. /// </summary>
  841. /// <param name="sender"></param>
  842. /// <param name="e"></param>
  843. private void last_button_Click(object sender, RoutedEventArgs e)
  844. {
  845. if (APP.pageData.currpage > 1)
  846. {
  847. APP.pageData.currpage -= 1;
  848. myblackboard.changepage(APP.pageData.currpage - 1);
  849. if (APP.Paths.Length > 0)
  850. {
  851. if (!string.IsNullOrWhiteSpace(txbCurrpage.Text) && APP.pageData.currpage < APP.Paths.Length&& APP.pageData.currpage > 0)
  852. {
  853. imgCanvas.Source = new BitmapImage(new Uri(APP.Paths[APP.pageData.currpage - 1]));
  854. }
  855. else
  856. {
  857. imgCanvas.Source = null;
  858. }
  859. }
  860. if (!string.IsNullOrWhiteSpace(APP.JPaths[APP.pageData.currpage]))
  861. {
  862. imgCanvas.Source = new BitmapImage(new Uri(APP.JPaths[APP.pageData.currpage]));
  863. }
  864. }
  865. }
  866. /// <summary>
  867. /// 下一页
  868. /// </summary>
  869. /// <param name="sender"></param>
  870. /// <param name="e"></param>
  871. private void next_btn_Click(object sender, RoutedEventArgs e)
  872. {
  873. if (APP.pageData.currpage < APP.pageData.pagenum)
  874. {
  875. APP.pageData.currpage += 1;
  876. myblackboard.changepage(APP.pageData.currpage - 1);
  877. if (APP.Paths.Length > 0)
  878. {
  879. if (!string.IsNullOrWhiteSpace(txbCurrpage.Text) && APP.pageData.currpage < APP.Paths.Length)
  880. {
  881. imgCanvas.Source = new BitmapImage(new Uri(APP.Paths[APP.pageData.currpage-1]));
  882. }
  883. else
  884. {
  885. imgCanvas.Source = null;
  886. }
  887. }
  888. if (!string.IsNullOrWhiteSpace(APP.JPaths[APP.pageData.currpage]))
  889. {
  890. imgCanvas.Source = new BitmapImage(new Uri(APP.JPaths[APP.pageData.currpage]));
  891. }
  892. }
  893. }
  894. /// <summary>
  895. /// 添加
  896. /// </summary>
  897. /// <param name="sender"></param>
  898. /// <param name="e"></param>
  899. private void add_button_Click(object sender, RoutedEventArgs e)
  900. {
  901. APP.pageData.pagenum += 1;
  902. APP.pageData.currpage = APP.pageData.pagenum;
  903. myblackboard.changepage(APP.pageData.currpage - 1);
  904. imgCanvas.Source = null;
  905. }
  906. /// <summary>
  907. /// 将Word文档转换为图片的方法(该方法基于第三方DLL),你可以像这样调用该方法: ConvertPDF2Image("F:\\PdfFile.doc", "F:\\",
  908. /// "ImageFile", 1, 20, ImageFormat.Png, 256);
  909. /// </summary>
  910. /// <param name="pdfInputPath">Word文件路径</param>
  911. /// <param name="imageOutputPath">图片输出路径,如果为空,默认值为Word所在路径</param>
  912. /// <param name="imageName">图片的名字,不需要带扩展名,如果为空,默认值为Word的名称</param>
  913. /// <param name="startPageNum">从PDF文档的第几页开始转换,如果为0,默认值为1</param>
  914. /// <param name="endPageNum">从PDF文档的第几页开始停止转换,如果为0,默认值为Word总页数</param>
  915. /// <param name="imageFormat">设置所需图片格式,如果为null,默认格式为PNG</param>
  916. /// <param name="resolution">设置图片的像素,数字越大越清晰,如果为0,默认值为128,建议最大值不要超过1024</param>
  917. public List<string> ConvertWordToImage(string wordInputPath, string imageOutputPath,
  918. string imageName, int startPageNum, int endPageNum, ImageFormat imageFormat, float resolution)
  919. {
  920. // 返回的图片绝对路径集合
  921. List<string> images = new List<string>();
  922. try
  923. {
  924. // open word file
  925. Aspose.Words.Document doc = new Aspose.Words.Document(wordInputPath);
  926. // validate parameter
  927. if (doc == null) { throw new Exception("Word文件无效或者Word文件被加密!"); }
  928. if (imageOutputPath.Trim().Length == 0) { imageOutputPath = System.IO.Path.GetDirectoryName(wordInputPath); }
  929. if (!Directory.Exists(imageOutputPath)) { Directory.CreateDirectory(imageOutputPath); }
  930. if (imageName.Trim().Length == 0) { imageName = System.IO.Path.GetFileNameWithoutExtension(wordInputPath); }
  931. if (startPageNum <= 0) { startPageNum = 1; }
  932. if (endPageNum > doc.PageCount || endPageNum <= 0) { endPageNum = doc.PageCount; }
  933. if (startPageNum > endPageNum) { int tempPageNum = startPageNum; startPageNum = endPageNum; endPageNum = startPageNum; }
  934. if (imageFormat == null) { imageFormat = ImageFormat.Png; }
  935. if (resolution <= 0) { resolution = 128; }
  936. ImageSaveOptions imageSaveOptions = new ImageSaveOptions(GetSaveFormat(imageFormat))
  937. {
  938. Resolution = resolution
  939. };
  940. // start to convert each page
  941. for (int i = startPageNum; i <= endPageNum; i++)
  942. {
  943. imageSaveOptions.PageIndex = i - 1;
  944. doc.Save(System.IO.Path.Combine(imageOutputPath, imageName) + "_" + APP.num.ToString() + "." + imageFormat.ToString(), imageSaveOptions);
  945. images.Add(System.IO.Path.Combine(imageOutputPath, imageName) + "_" + APP.num.ToString() + "." + imageFormat.ToString());
  946. APP.num++;
  947. }
  948. imageSaveOptions = null;
  949. doc = null;
  950. }
  951. catch (Exception ex)
  952. {
  953. System.Windows.MessageBox.Show("文档已打开,请关闭后重试!");
  954. LogHelper.WriteErrLog("【课堂考试(ExamWindow)】错误日志:" + ex.Message, ex);
  955. }
  956. return images;
  957. }
  958. private static SaveFormat GetSaveFormat(ImageFormat imageFormat)
  959. {
  960. SaveFormat sf;// = SaveFormat.Unknown;
  961. if (imageFormat.Equals(ImageFormat.Png))
  962. {
  963. sf = SaveFormat.Png;
  964. }
  965. else if (imageFormat.Equals(ImageFormat.Jpeg))
  966. {
  967. sf = SaveFormat.Jpeg;
  968. }
  969. else if (imageFormat.Equals(ImageFormat.Tiff))
  970. {
  971. sf = SaveFormat.Tiff;
  972. }
  973. else if (imageFormat.Equals(ImageFormat.Bmp))
  974. {
  975. sf = SaveFormat.Bmp;
  976. }
  977. else
  978. {
  979. sf = SaveFormat.Unknown;
  980. }
  981. return sf;
  982. }
  983. #region 图像缩放,移动
  984. private bool mouseDown;
  985. private System.Windows.Point mouseXY;
  986. private void IMG1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  987. {
  988. var img = sender as ContentControl;
  989. if (img == null)
  990. {
  991. return;
  992. }
  993. img.CaptureMouse();
  994. mouseDown = true;
  995. mouseXY = e.GetPosition(img);
  996. Console.WriteLine("mouseXY.X = " + mouseXY.X + "; mouseXY.Y = " + mouseXY.Y);
  997. }
  998. private void PicEMap_MouseDown(object sender, MouseButtonEventArgs e)
  999. {
  1000. System.Windows.Point point = e.GetPosition(imgCanvas);
  1001. //Console.WriteLine("PicEmap.X = " + point.X + "; PicEmap.Y = " + point.Y);
  1002. //if ((point.X - 304) * (point.X - 304) + (point.Y - 86) * (point.Y - 86) < 100)
  1003. //{
  1004. // Console.WriteLine("在范围内");
  1005. //}
  1006. }
  1007. private void IMG1_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  1008. {
  1009. var img = sender as ContentControl;
  1010. if (img == null)
  1011. {
  1012. return;
  1013. }
  1014. img.ReleaseMouseCapture();
  1015. mouseDown = false;
  1016. }
  1017. private void IMG1_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
  1018. {
  1019. var img = sender as ContentControl;
  1020. if (img == null)
  1021. {
  1022. return;
  1023. }
  1024. if (mouseDown)
  1025. {
  1026. Domousemove(img, e);
  1027. }
  1028. }
  1029. private void Domousemove(ContentControl img, System.Windows.Input.MouseEventArgs e)
  1030. {
  1031. if (e.LeftButton != MouseButtonState.Pressed)
  1032. {
  1033. return;
  1034. }
  1035. var group = IMG.FindResource("Imageview") as TransformGroup;
  1036. var transform = group.Children[1] as TranslateTransform;
  1037. var position = e.GetPosition(img);
  1038. transform.X -= mouseXY.X - position.X;
  1039. transform.Y -= mouseXY.Y - position.Y;
  1040. mouseXY = position;
  1041. }
  1042. private void IMG1_MouseWheel(object sender, MouseWheelEventArgs e)
  1043. {
  1044. var img = sender as ContentControl;
  1045. if (img == null)
  1046. {
  1047. return;
  1048. }
  1049. var point = e.GetPosition(img);
  1050. Console.WriteLine("point.X = " + point.X + "; point.Y=" + point.Y);
  1051. var PicLocate = e.GetPosition(imgCanvas);
  1052. Console.WriteLine("PicEmap.X = " + PicLocate.X + "; PicEmap.Y=" + PicLocate.Y);
  1053. var group = IMG.FindResource("Imageview") as TransformGroup;
  1054. var delta = e.Delta * 0.001;
  1055. DowheelZoom(group, point, delta);
  1056. }
  1057. private void DowheelZoom(TransformGroup group, System.Windows.Point point, double delta)
  1058. {
  1059. var pointToContent = group.Inverse.Transform(point);
  1060. var transform = group.Children[0] as ScaleTransform;
  1061. if (transform.ScaleX + delta < 0.1) return;
  1062. transform.ScaleX += delta;
  1063. transform.ScaleY += delta;
  1064. var transform1 = group.Children[1] as TranslateTransform;
  1065. transform1.X = -1 * ((pointToContent.X * transform.ScaleX) - point.X);
  1066. transform1.Y = -1 * ((pointToContent.Y * transform.ScaleY) - point.Y);
  1067. //Console.WriteLine("transform.ScaleX = " + transform.ScaleX + "; transform.ScaleY = " + transform.ScaleY);
  1068. }
  1069. #endregion
  1070. }
  1071. }