Preview2SettingDialog.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using PaintDotNet.ImageCollect;
  11. using PaintDotNet.Base.SettingModel;
  12. using PaintDotNet.Camera;
  13. using PaintDotNet.Base.CommTool;
  14. using System.IO;
  15. using Metis.Setting;
  16. using PaintDotNet.Setting;
  17. using System.Runtime.InteropServices;
  18. using System.Threading;
  19. namespace PaintDotNet.Preview2
  20. {
  21. internal partial class Preview2SettingDialog : FloatingToolForm
  22. {
  23. private ExposureSbControl _exposureControl;
  24. private WhiteBalanceControl _wbControl;
  25. private GrayModeControl _grayModeControl;
  26. private SaturationControl _saturationControl;
  27. private FrameControl _frameControl;
  28. private OtherControl _otherControl;
  29. private RotateControl _rotateControl;
  30. private DisplayControl _displayControl;
  31. private AppWorkspace _app;
  32. private ICamera m_carmera => CameraManager.CurrentCamera;
  33. internal Preview2SettingDialog(DocumentWorkspaceWindow doc)
  34. {
  35. InitializeComponent();
  36. InitializeLanguageText();
  37. _app = (AppWorkspace)doc.AppWorkspaceTop;
  38. toolkitEditControlL.Initialize((AppWorkspace)doc.AppWorkspaceTop, Preview2Context.ToolbarModelLeft);
  39. toolkitEditControlR.Initialize((AppWorkspace)doc.AppWorkspaceTop, Preview2Context.ToolbarModelRight);
  40. foreach (TabPage item in metroTabControl1.TabPages)
  41. {
  42. // item.Padding = new Padding(2);
  43. // item.BackColor = Color.Transparent;
  44. }
  45. InitializePageCamera();
  46. InitializeImages();
  47. InitializePageImage();
  48. InitializePreview2Config();
  49. this.Load += Preview2SettingDialog_Load;
  50. }
  51. private void InitializeLanguageText()
  52. {
  53. this.btnCamRefresh.Text = PdnResources.GetString("Preview2Setting.SaveCurrentConfig");
  54. this.btnSave.Text = PdnResources.GetString("Preview2Setting.SaveCurrentConfig");
  55. this.btnAdd.Text = PdnResources.GetString("Preview2Setting.AddAndSaveConfig");
  56. this.btnDel.Text = PdnResources.GetString("Preview2Setting.DeleteCurrentConfig");
  57. this.label2.Text = PdnResources.GetString("Preview2Setting.SelectConfig") + ":";
  58. this.label1.Text = PdnResources.GetString("Preview2Setting.SelectCamera") + ":";
  59. this.tabPageCamera.Text = PdnResources.GetString("Menu.ImageCollection.CameraSetting.Text");
  60. this.tabPageImage.Text = PdnResources.GetString("Preview2Setting.ImgSettings");
  61. this.tbgBase.Text = PdnResources.GetString("Menu.BasicSettings.text");
  62. this.groupBox2.Text = PdnResources.GetString("Menu.Tools.GridLine.Text");
  63. this.btnCross.Text = PdnResources.GetString("Menu.imagecapture.Previewwindow.reticle.text");
  64. this.btnCircle.Text = PdnResources.GetString("Menu.circular.Text");
  65. this.btnRect.Text = PdnResources.GetString("Menu.LabelAction.DrawRectangle.Text");
  66. this.btnGrid.Text = PdnResources.GetString("Menu.Tools.GridLine.Text");
  67. this.groupBox1.Text = PdnResources.GetString("Menu.BasicSettings.text");
  68. this.btnGridSet.Text = PdnResources.GetString("Menu.Setting.GridSetting.Text");
  69. this.btnRulerSet.Text = PdnResources.GetString("Menu.Setting.RuleSetting.Text");
  70. this.label3.Text = PdnResources.GetString("Preview2Setting.CameraAlias") + ":";
  71. this.ckbCapFocus.Text = PdnResources.GetString("Preview2Setting.AuxiliaryFocusing");
  72. this.ckbCapRuler.Text = PdnResources.GetString("Menu.imagecapture.Previewwindow.Shootingruler.text");
  73. this.ckbCapClose.Text = PdnResources.GetString("Preview2Setting.ClosePictures");
  74. this.tabPage4.Text = PdnResources.GetString("Preview2Setting.Sidebar");
  75. this.groupBox4.Text = PdnResources.GetString("Preview2Setting.SidebarPosition");
  76. this.rdbR.Text = PdnResources.GetString("Preview2Setting.Right");
  77. this.rdbL.Text = PdnResources.GetString("Preview2Setting.Left");
  78. this.label5.Text = PdnResources.GetString("Preview2Setting.Left");
  79. this.label4.Text = PdnResources.GetString("Preview2Setting.SidebarDisplay") + ":";
  80. this.ckbR.Text = PdnResources.GetString("Preview2Setting.Right");
  81. this.ckbL.Text = PdnResources.GetString("Preview2Setting.Left");
  82. this.Text = PdnResources.GetString("Preview2Setting.PreviewConfig");
  83. }
  84. void InitializePageCamera()
  85. {
  86. var pg = tabPageCamera;
  87. _exposureControl = new ExposureSbControl();
  88. _exposureControl.Dock = DockStyle.Top;
  89. _wbControl = new WhiteBalanceControl();
  90. _wbControl.Dock = DockStyle.Top;
  91. _grayModeControl = new GrayModeControl();
  92. _grayModeControl.Dock = DockStyle.Top;
  93. _saturationControl = new SaturationControl();
  94. _saturationControl.Dock = DockStyle.Top;
  95. _frameControl = new FrameControl();
  96. _frameControl.Dock = DockStyle.Top;
  97. pg.Controls.Add(_frameControl);
  98. pg.Controls.Add(_saturationControl);
  99. pg.Controls.Add(_wbControl);
  100. pg.Controls.Add(_grayModeControl);
  101. pg.Controls.Add(_exposureControl);
  102. }
  103. void InitializePageImage()
  104. {
  105. _rotateControl = new RotateControl();
  106. _rotateControl.Dock = DockStyle.Top;
  107. _rotateControl.OnRotated += () => { _frameControl?.Transfor(); };
  108. _otherControl = new OtherControl();
  109. _otherControl.Dock = DockStyle.Top;
  110. _displayControl = new DisplayControl();
  111. _displayControl.Dock = DockStyle.Top;
  112. tabPageImage.Controls.Add(_displayControl);
  113. tabPageImage.Controls.Add(_otherControl);
  114. tabPageImage.Controls.Add(_rotateControl);
  115. }
  116. void InitializeImages()
  117. {
  118. btnAdd.Image = PdnResources.GetImageResource("Icons.p2add.png").Reference;
  119. btnDel.Image = PdnResources.GetImageResource("Icons.p2delet.png").Reference;
  120. btnSave.Image = PdnResources.GetImageResource("Icons.p2save.png").Reference;
  121. btnCamRefresh.Image = PdnResources.GetImageResource("Icons.p2camrefresh.png").Reference;
  122. }
  123. string _cameraNameEx;
  124. void InitializePreview2Config()
  125. {
  126. ckbCapClose.Checked = Preview2Context.P2Config.CaptureClose;
  127. ckbCapFocus.Checked = Preview2Context.P2Config.CaptureFocus;
  128. ckbCapRuler.Checked = Preview2Context.P2Config.CaptureRuler;
  129. ckbL.Checked = (Preview2Context.P2Config.ToolkitSide & 1) > 0;
  130. ckbR.Checked = (Preview2Context.P2Config.ToolkitSide & 2) > 0;
  131. BtnCheckChange(btnGrid, Preview2Context.P2Config.DrawGrid);
  132. BtnCheckChange(btnRect, Preview2Context.P2Config.DrawRect);
  133. BtnCheckChange(btnCircle, Preview2Context.P2Config.DrawCircle);
  134. BtnCheckChange(btnCross, Preview2Context.P2Config.DrawCross);
  135. }
  136. private void Preview2SettingDialog_Load(object sender, EventArgs e)
  137. {
  138. TopMost = false;
  139. List<string> fileNames = CameraConfigs.GetInstance().GetAllConfigFiles();
  140. cmbConfig.Items.AddRange(fileNames.ToArray());
  141. UpdateCamList();
  142. InitCameraSettings();
  143. timer1.Enabled = true;
  144. this.cmbConfig.SelectedIndexChanged += new System.EventHandler(this.cmbConfig_SelectedIndexChanged);
  145. OnCameraNameChanged();
  146. UpdateConfigOnCameraChanged();
  147. ConfigModel.OnCameraNameExChanged += OnCameraNameChanged;
  148. CameraManager.OnCameraDrop += OnCameraDrop;
  149. }
  150. private void OnCameraDrop()
  151. {
  152. UpdateCamList();
  153. }
  154. private void OnCameraNameChanged()
  155. {
  156. txbNameEx.Text = m_carmera.GetExofName();
  157. }
  158. private void InitCameraSettings()
  159. {
  160. _exposureControl.Initialize();
  161. _wbControl.Initialize();
  162. _saturationControl.Initialize();
  163. _frameControl.Initialize();
  164. _rotateControl.Initialize();
  165. _otherControl.Initialize();
  166. _grayModeControl.Initialize();
  167. }
  168. private void UpdateCameraSettings()
  169. {
  170. _exposureControl.UpdateSettings();
  171. _wbControl.Initialize();
  172. _saturationControl.UpdateSettings();
  173. _frameControl.UpdateSettings();
  174. _rotateControl.Initialize();
  175. _otherControl.UpdateSettings();
  176. _grayModeControl.Initialize();
  177. }
  178. private void timer1_Tick(object sender, EventArgs e)
  179. {
  180. metroTabControl1.Enabled = CameraManager.IsLive;
  181. if (!CameraManager.IsLive) return;
  182. _exposureControl.UpdateDisplay();
  183. _wbControl.UpdateDisplay();
  184. var isgay = CameraConfigs.Settings.Monochromatic == 0;
  185. _wbControl.Enabled = isgay;
  186. _saturationControl.Enabled = isgay;
  187. btnAdd.Enabled = !cmbConfig.Items.Contains(cmbConfig.Text);
  188. btnDel.Enabled = cmbConfig.Items.Contains(cmbConfig.Text) && cmbConfig.Text != "CameraParam";
  189. }
  190. #region Draw Grid
  191. public static event Action OnDrawGridChanged;
  192. private void BtnCheckChange(Button btn, bool b)
  193. {
  194. btn.FlatStyle = FlatStyle.Flat;
  195. btn.BackColor = b ? Color.FromArgb(0, 174, 219) : SystemColors.Control;
  196. }
  197. private void btnGrid_Click(object sender, EventArgs e)
  198. {
  199. Preview2Context.P2Config.DrawGrid = !Preview2Context.P2Config.DrawGrid;
  200. BtnCheckChange(btnGrid, Preview2Context.P2Config.DrawGrid);
  201. OnDrawGridChanged?.Invoke();
  202. }
  203. private void btnRect_Click(object sender, EventArgs e)
  204. {
  205. Preview2Context.P2Config.DrawRect = !Preview2Context.P2Config.DrawRect;
  206. BtnCheckChange(btnRect, Preview2Context.P2Config.DrawRect);
  207. OnDrawGridChanged?.Invoke();
  208. }
  209. private void btnCircle_Click(object sender, EventArgs e)
  210. {
  211. Preview2Context.P2Config.DrawCircle = !Preview2Context.P2Config.DrawCircle;
  212. BtnCheckChange(btnCircle, Preview2Context.P2Config.DrawCircle);
  213. OnDrawGridChanged?.Invoke();
  214. }
  215. private void btnCross_Click(object sender, EventArgs e)
  216. {
  217. Preview2Context.P2Config.DrawCross = !Preview2Context.P2Config.DrawCross;
  218. BtnCheckChange(btnCross, Preview2Context.P2Config.DrawCross);
  219. OnDrawGridChanged?.Invoke();
  220. }
  221. #endregion
  222. #region Config operate
  223. private void cmbConfig_SelectedIndexChanged(object sender, EventArgs e)
  224. {
  225. var name = cmbConfig.Text;
  226. var cpm = CameraConfigs.GetInstance().GetCameraParamModel(name);
  227. OnConfigModify?.Invoke(0, name);
  228. Startup.instance.cameraParamModel = cpm;
  229. Startup.instance.configModel.CameraConfig = name;
  230. SaveConfigModel();
  231. CameraConfigs.GetInstance().CameraParamInit();
  232. UpdateCameraSettings();
  233. Preview2Context.P2Config.SetCamCfg(m_carmera, (string)cmbConfig.SelectedItem);
  234. }
  235. private void btnSave_Click(object sender, EventArgs e)
  236. {
  237. CameraConfigs.GetInstance().Save();
  238. }
  239. /// <summary>
  240. /// 参数1[ int]:0选择,1添加,2删除 参数2[string]:变更参数名
  241. /// </summary>
  242. public Action<int, string> OnConfigModify;
  243. private void btnAdd_Click(object sender, EventArgs e)
  244. {
  245. btnAdd.Enabled = false;
  246. CameraConfigs.GetInstance().SaveAs(cmbConfig.Text);
  247. cmbConfig.Items.Add(cmbConfig.Text);
  248. cmbConfig.Refresh();
  249. OnConfigModify?.Invoke(1, cmbConfig.Text);
  250. }
  251. private void btnDel_Click(object sender, EventArgs e)
  252. {
  253. var name = cmbConfig.Text;
  254. if (name == "CameraParam")
  255. return;
  256. OnConfigModify?.Invoke(2, name);
  257. CameraConfigs.GetInstance().Delete(name);
  258. cmbConfig.Items.Remove(name);
  259. cmbConfig.SelectedItem = "CameraParam";
  260. }
  261. #endregion
  262. private void cmbConfig_KeyDown(object sender, KeyEventArgs e)
  263. {
  264. if (e.KeyCode == Keys.Enter)
  265. {
  266. if (cmbConfig.Items.Contains(cmbConfig.Text)) return;
  267. btnAdd.Enabled = true;
  268. }
  269. }
  270. private void SaveConfigModel()
  271. {
  272. string configXml = XmlSerializeHelper.XmlSerialize<ConfigModel>(Startup.instance.configModel);
  273. string filePath = Application.StartupPath + "\\Config\\" + Startup.instance.SettingPrefix + "\\Config.xml";
  274. FileOperationHelper.WriteStringToFile(configXml, filePath, FileMode.Create);
  275. }
  276. private void Preview2SettingDialog_FormClosing(object sender, FormClosingEventArgs e)
  277. {
  278. Preview2Context.SaveP2Config();
  279. SaveConfigModel();
  280. ConfigModel.OnCameraNameExChanged -= OnCameraNameChanged;
  281. CameraManager.OnCameraDrop -= OnCameraDrop;
  282. }
  283. private void ckbCapClose_Click(object sender, EventArgs e)
  284. {
  285. Preview2Context.P2Config.CaptureClose = ckbCapClose.Checked;
  286. }
  287. private void ckbCapRuler_Click(object sender, EventArgs e)
  288. {
  289. Preview2Context.P2Config.CaptureRuler = ckbCapRuler.Checked;
  290. }
  291. private void ckbCapFocus_Click(object sender, EventArgs e)
  292. {
  293. Preview2Context.P2Config.CaptureFocus = ckbCapFocus.Checked;
  294. }
  295. public static event Action OnToolkitSideChanged;
  296. private void ToolkitsideChanged_Click(object sender, EventArgs e)
  297. {
  298. var value = 0;
  299. if (ckbL.Checked)
  300. {
  301. value += 1;
  302. }
  303. if (ckbR.Checked)
  304. {
  305. value += 2;
  306. }
  307. Preview2Context.P2Config.ToolkitSide = value;
  308. OnToolkitSideChanged?.Invoke();
  309. }
  310. private void txbNameEx_KeyDown(object sender, KeyEventArgs e)
  311. {
  312. if (e.KeyCode == Keys.Enter)
  313. {
  314. m_carmera.SetExofName(txbNameEx.Text);
  315. ConfigModel.OnCameraNameExChanged.Invoke();
  316. }
  317. }
  318. private void cmbCamera_SelectedIndexChanged(object sender, EventArgs e)
  319. {
  320. try
  321. {
  322. CameraManager.GetInstance().SetCurrentCamera(cmbCamera.SelectedIndex);
  323. ConfigModel.OnCameraNameExChanged.Invoke();
  324. UpdateConfigOnCameraChanged();
  325. if (!CameraManager.CurrentCamera.IsOpen())
  326. throw new Exception();
  327. }
  328. catch
  329. {
  330. MessageBox.Show("相机已失效,请检查相机连接。");
  331. }
  332. }
  333. private void UpdateConfigOnCameraChanged()
  334. {
  335. var name = Preview2Context.P2Config.GetCamCfg(m_carmera);
  336. if (cmbConfig.Items.Contains(name))
  337. cmbConfig.SelectedItem = name;
  338. else
  339. cmbConfig.SelectedItem = CommonDefine.DefaultCamCfg;
  340. }
  341. private void ToolkitEditSelect_Click(object sender, EventArgs e)
  342. {
  343. toolkitEditControlL.Visible = rdbL.Checked;
  344. toolkitEditControlR.Visible = rdbR.Checked;
  345. }
  346. /// <summary>
  347. /// 跟随父窗体移动
  348. /// </summary>
  349. internal void FormMove(int x, int y)
  350. {
  351. x = this.Location.X + x;
  352. y = this.Location.Y + y;
  353. x = Math.Max(0, x);
  354. y = Math.Max(0, y);
  355. var screen = Screen.GetWorkingArea(this);
  356. if (x + Width > screen.Width)
  357. x = screen.Width - Width;
  358. if (y + Height > screen.Height)
  359. y = screen.Height - Height;
  360. Location = new Point(x, y);
  361. }
  362. private void btnGridSet_Click(object sender, EventArgs e)
  363. {
  364. using (GridSettingForm af = new GridSettingForm(_app))
  365. {
  366. af.StartPosition = FormStartPosition.CenterScreen;
  367. af.ShowDialog(_app);
  368. }
  369. }
  370. private void btnRulerSet_Click(object sender, EventArgs e)
  371. {
  372. using (RulerSettingDialog af = new RulerSettingDialog(_app))
  373. {
  374. af.StartPosition = FormStartPosition.CenterScreen;
  375. af.ShowDialog(_app);
  376. }
  377. }
  378. #region 防止
  379. private Point _mouseDownPos;
  380. private bool _move;
  381. protected override void WndProc(ref Message m)
  382. {
  383. RECT nativeRect;
  384. switch (m.Msg)
  385. {
  386. case 0x20:
  387. int lp = m.LParam.ToInt32();
  388. if ((lp & 0xFFFF) == 2 &&
  389. ((lp >> 0x10) & 0xFFFF) == 0x201)
  390. {
  391. _mouseDownPos = Control.MousePosition;
  392. _move = true;
  393. }
  394. break;
  395. case 0x231:
  396. if (_move)
  397. {
  398. Rectangle rect = Screen.GetWorkingArea(this);
  399. nativeRect = new RECT(
  400. _mouseDownPos.X - Location.X,
  401. _mouseDownPos.Y - Location.Y,
  402. rect.Right - (Bounds.Right - _mouseDownPos.X),
  403. rect.Bottom - (Bounds.Bottom - _mouseDownPos.Y));
  404. ClipCursor(ref nativeRect);
  405. }
  406. break;
  407. case 0x0232:
  408. if (_move)
  409. {
  410. nativeRect = new RECT(Screen.GetWorkingArea(this));
  411. //ClipCursor(ref nativeRect);
  412. _move = false;
  413. }
  414. break;
  415. }
  416. base.WndProc(ref m);
  417. }
  418. [DllImport("user32.dll")]
  419. public static extern bool ClipCursor(ref RECT lpRect);
  420. [StructLayout(LayoutKind.Sequential)]
  421. public struct RECT
  422. {
  423. public int Left;
  424. public int Top;
  425. public int Right;
  426. public int Bottom;
  427. public RECT(int left, int top, int right, int bottom)
  428. {
  429. Left = left;
  430. Top = top;
  431. Right = right;
  432. Bottom = bottom;
  433. }
  434. public RECT(Rectangle rect)
  435. {
  436. Left = rect.Left;
  437. Top = rect.Top;
  438. Right = rect.Right;
  439. Bottom = rect.Bottom;
  440. }
  441. public Rectangle Rect
  442. {
  443. get
  444. {
  445. return new Rectangle(
  446. Left,
  447. Top,
  448. Right - Left,
  449. Bottom - Top);
  450. }
  451. }
  452. public Size Size
  453. {
  454. get
  455. {
  456. return new Size(Right - Left, Bottom - Top);
  457. }
  458. }
  459. public static RECT FromXYWH(int x, int y, int width, int height)
  460. {
  461. return new RECT(x,
  462. y,
  463. x + width,
  464. y + height);
  465. }
  466. public static RECT FromRectangle(Rectangle rect)
  467. {
  468. return new RECT(rect.Left,
  469. rect.Top,
  470. rect.Right,
  471. rect.Bottom);
  472. }
  473. }
  474. #endregion
  475. private void btnCamRefresh_Click(object sender, EventArgs e)
  476. {
  477. new MessageDailog()
  478. {
  479. Title = "重载相机列表",
  480. Message = "重新连接相机程序将进入挂起状态,持续10s左右,是否继续?",
  481. Message1 = "正在重连相机请稍后...",
  482. Handler = () =>
  483. {
  484. CameraManager.GetInstance().UnInitManager();
  485. CameraManager.GetInstance().InitManager();
  486. btnCamRefresh.Enabled = true;
  487. UpdateCamList();
  488. }
  489. }.ShowDialog();
  490. }
  491. private void UpdateCamList()
  492. {
  493. cmbCamera.Items.Clear();
  494. cmbCamera.Items.AddRange(CameraManager.GetInstance().GetCameraNameList().ToArray());
  495. var str = m_carmera.GetName();
  496. if (!string.IsNullOrWhiteSpace(str)) cmbCamera.SelectedItem = str;
  497. }
  498. }
  499. }