MainForm.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. using CCDCount.DLL;
  2. using CCDCount.MODEL.ConfigModel;
  3. using CCDCount.MODEL.ShuLiClass;
  4. using LogClass;
  5. using MvCameraControl;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Data;
  9. using System.Drawing;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Windows.Forms;
  13. namespace CCDCount.Forms
  14. {
  15. public partial class MainForm : Form
  16. {
  17. #region 变量
  18. //菜单栏状态,true为展开,false为收起
  19. bool meunStatic = false;
  20. //当前显示窗体
  21. Form showFrom = null;
  22. List<(CameraConfig CameraConfigValue, ShuLiConfigClass ShuLiConfigValue)> Configs =
  23. new List<(CameraConfig CameraConfigValue, ShuLiConfigClass ShuLiConfigValue)>();
  24. #endregion
  25. #region 实例
  26. //主线程实例队列
  27. public List<MainThreadClass> LsMainThread = new List<MainThreadClass>();
  28. #endregion
  29. #region 窗体事件
  30. /// <summary>
  31. /// 窗体加载事件
  32. /// </summary>
  33. public MainForm()
  34. {
  35. InitializeComponent();
  36. if(File.Exists(".\\Config\\CCDCountConfig.xml"))
  37. {
  38. Configs = XmlStorage.DeserializeFromXml<List<(CameraConfig CameraConfigValue, ShuLiConfigClass ShuLiConfigValue)>>(".\\Config\\CCDCountConfig.xml");
  39. }
  40. SDKSystem.Initialize();
  41. FormKongjianInit();
  42. RunAllCameraIdentify();
  43. }
  44. /// <summary>
  45. /// 菜单切换按钮点击事件
  46. /// </summary>
  47. /// <param name="sender"></param>
  48. /// <param name="e"></param>
  49. private void MenuSwitchBtn_Click(object sender, EventArgs e)
  50. {
  51. if (meunStatic)
  52. {
  53. MenuSwitchBtn.Image = ScaleImage(Properties.Resources.进入__白_, 32, 32);
  54. HistoryFormBtn.Image = ScaleImage(Properties.Resources.数据_白, 32, 32);
  55. HistoryFormBtn.Text = "";
  56. IdentifyFormBtn.Image = ScaleImage(Properties.Resources.相机小_白, 32, 32);
  57. IdentifyFormBtn.Text = "";
  58. SettingFromBtn.Image = ScaleImage(Properties.Resources.设置_白, 32, 32);
  59. SettingFromBtn.Text = "";
  60. menupanel.Width = 70;
  61. meunStatic = false;
  62. }
  63. else
  64. {
  65. MenuSwitchBtn.Image = ScaleImage(Properties.Resources.返回__白_, 32, 32);
  66. IdentifyFormBtn.Image = null;
  67. IdentifyFormBtn.Text = "识 别 界 面";
  68. HistoryFormBtn.Image = null;
  69. HistoryFormBtn.Text = "数 据 界 面";
  70. SettingFromBtn.Image = null;
  71. SettingFromBtn.Text = "参 数 设 置";
  72. menupanel.Width = 200;
  73. meunStatic = true;
  74. }
  75. }
  76. /// <summary>
  77. /// 识别界面按钮点击事件
  78. /// </summary>
  79. /// <param name="sender"></param>
  80. /// <param name="e"></param>
  81. private void IdentifyFormBtn_Click(object sender, EventArgs e)
  82. {
  83. LoadFormContent(new IdentifyCameraForm(Configs.Select(o=>o.CameraConfigValue).ToList(),LsMainThread));
  84. }
  85. private void HistoryFormBtn_Click(object sender, EventArgs e)
  86. {
  87. LoadFormContent(new DataShowForm(LsMainThread));
  88. }
  89. private void MainForm_Resize(object sender, EventArgs e)
  90. {
  91. LoadFormContent(showFrom);
  92. }
  93. // <summary>
  94. /// 窗体关闭事件
  95. /// </summary>
  96. private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
  97. {
  98. SDKSystem.Finalize();
  99. StopAllCameraIdentify();
  100. this.Dispose();
  101. if(showFrom != null) showFrom.Dispose();
  102. Environment.Exit(0);
  103. }
  104. private void SettingFromBtn_Click(object sender, EventArgs e)
  105. {
  106. LoadFormContent(new SettingForm(LsMainThread));
  107. }
  108. private void MainForm_Load(object sender, EventArgs e)
  109. {
  110. HistoryFormBtn_Click(this, EventArgs.Empty);
  111. }
  112. #endregion
  113. #region 私有方法
  114. /// <summary>
  115. /// 图像缩放方法(保持宽高比)
  116. /// </summary>
  117. /// <param name="image">图像</param>
  118. /// <param name="maxWidth">目标宽度</param>
  119. /// <param name="maxHeight">目标高度</param>
  120. /// <returns></returns>
  121. private Image ScaleImage(Image image, int maxWidth, int maxHeight)
  122. {
  123. var ratioX = (double)maxWidth / image.Width;
  124. var ratioY = (double)maxHeight / image.Height;
  125. var ratio = Math.Min(ratioX, ratioY);
  126. var newWidth = (int)(image.Width * ratio);
  127. var newHeight = (int)(image.Height * ratio);
  128. var newImage = new Bitmap(newWidth, newHeight);
  129. using (var graphics = Graphics.FromImage(newImage))
  130. {
  131. graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  132. graphics.DrawImage(image, 0, 0, newWidth, newHeight);
  133. }
  134. return newImage;
  135. }
  136. /// <summary>
  137. /// 窗体控件初始化
  138. /// </summary>
  139. private void FormKongjianInit()
  140. {
  141. IdentifyFormBtn.Image = ScaleImage(Properties.Resources.相机小_白, 32, 32);
  142. IdentifyFormBtn.Text = "";
  143. HistoryFormBtn.Image = ScaleImage(Properties.Resources.数据_白, 32, 32);
  144. HistoryFormBtn.Text = "";
  145. MenuSwitchBtn.Image = ScaleImage(Properties.Resources.进入__白_, 32, 32);
  146. menupanel.Width = 70;
  147. SettingFromBtn.Image = ScaleImage(Properties.Resources.设置_白, 32, 32);
  148. SettingFromBtn.Text = "";
  149. //this.FormBorderStyle = FormBorderStyle.None;
  150. // 全屏显示
  151. this.WindowState = FormWindowState.Maximized;
  152. // 窗口置顶
  153. //this.TopMost = true;
  154. }
  155. /// <summary>
  156. /// 加载目标窗体内容到当前窗体
  157. /// </summary>
  158. /// <param name="targetForm">要加载的窗体实例</param>
  159. private void LoadFormContent(Form targetForm)
  160. {
  161. if (targetForm == null)
  162. return;
  163. if (showFrom == targetForm) { }
  164. else if (showFrom != null)
  165. {
  166. showFrom.Close();
  167. }
  168. showFrom = targetForm;
  169. targetForm.TopLevel = false; // 关键设置
  170. targetForm.FormBorderStyle = FormBorderStyle.None;
  171. targetForm.Dock = DockStyle.Fill; // 新增关键设置
  172. Mainpanel.Controls.Clear();
  173. Mainpanel.Controls.Add(targetForm);
  174. targetForm.Show();
  175. }
  176. /// <summary>
  177. /// 启动所有相机识别
  178. /// </summary>
  179. private void RunAllCameraIdentify()
  180. {
  181. if(Configs.Count == 0)
  182. {
  183. MessageBox.Show("尚未添加相机,请前往配置页面配置相机");
  184. return;
  185. }
  186. foreach (var item in Configs.Select(o => o.ShuLiConfigValue).ToList())
  187. {
  188. LsMainThread.Add(new MainThreadClass(item, Configs.Select(o => o.CameraConfigValue).ToList().Where(o=>o.CameraSNNum == item.CameraSN).First()));
  189. }
  190. for(int i = 0; i < LsMainThread.Count; i++)
  191. {
  192. //判断是否添加线程
  193. if (!LsMainThread[i].IsOpenLoadThread)
  194. return;
  195. //启动单相机实例的全部线程
  196. if(!LsMainThread[i].StartMianThread(Configs.Select(o => o.CameraConfigValue).ToList().Where(o=>o.CameraSNNum == LsMainThread[i].ThisCameraSN).First()))
  197. {
  198. LOG.error(LsMainThread[i].ThisCameraDevice+ "_"+ LsMainThread[i].ThisCameraSN + "启动失败");
  199. MessageBox.Show(LsMainThread[i].ThisCameraDevice + "_" + LsMainThread[i].ThisCameraSN + "启动失败");
  200. return;
  201. }
  202. LsMainThread[i].WorkerToFrom += Worker_MianThreadToFrom;
  203. }
  204. }
  205. /// <summary>
  206. /// 停止所有相机识别
  207. /// </summary>
  208. private void StopAllCameraIdentify()
  209. {
  210. foreach (var item in LsMainThread)
  211. {
  212. item.StopMianThread();
  213. }
  214. }
  215. #endregion
  216. #region 主界面回调事件
  217. /// <summary>
  218. /// 通知主界面回调的事件
  219. /// </summary>
  220. /// <param name="sender"></param>
  221. /// <param name="e"></param>
  222. private void Worker_MianThreadToFrom(object sender, ActiveObjectEventArgsClass e)
  223. {
  224. // 事件处理逻辑
  225. Console.WriteLine("结果已通知到主界面!");
  226. //此处进行与下位机的交互(将通道数给下位机控制程序)
  227. //float getvalue = 0;
  228. }
  229. #endregion
  230. }
  231. }