星火微课系统客户端
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

XHMicroLessonSystemWindow.xaml.cs 34KB

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