MainForm.cs 9.5 KB

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