UpgradeWnd.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. // 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
  2. // (“Fluent UI”)。该示例仅供参考,
  3. // 用以补充《Microsoft 基础类参考》和
  4. // MFC C++ 库软件随附的相关电子文档。
  5. // 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
  6. // 若要了解有关 Fluent UI 许可计划的详细信息,请访问
  7. // https://go.microsoft.com/fwlink/?LinkId=238214.
  8. //
  9. // 版权所有(C) Microsoft Corporation
  10. // 保留所有权利。
  11. #include "stdafx.h"
  12. #include "framework.h"
  13. #include "UpgradeWnd.h"
  14. #include "Resource.h"
  15. #include "MainFrm.h"
  16. #include "SATHelper.h"
  17. #include <filehelper.h>
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #define new DEBUG_NEW
  22. #endif
  23. extern CMainFrame* g_pMainFrame;
  24. #define ID_BTN_UPGRADE 7
  25. #define ID_EDIT_IMAGE_PATH 8
  26. #define ID_EIDT_FTP_USER 9
  27. #define ID_EDIT_FTP_PASSWORD 10
  28. #define ID_CHECK_REMEMBER_FTP 11
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CResourceViewBar
  31. CUpgradeWnd::CUpgradeWnd() noexcept
  32. {
  33. m_nCtrlHeight = 0;
  34. }
  35. CUpgradeWnd::~CUpgradeWnd()
  36. {
  37. RedRat::UnloadLibrary();
  38. }
  39. BEGIN_MESSAGE_MAP(CUpgradeWnd, CDockablePane)
  40. ON_WM_CREATE()
  41. ON_WM_SIZE()
  42. ON_WM_SETFOCUS()
  43. ON_WM_SETTINGCHANGE()
  44. ON_WM_PAINT()
  45. ON_COMMAND(ID_BTN_UPGRADE, OnUpgradeBtnClick)
  46. ON_UPDATE_COMMAND_UI(ID_BTN_UPGRADE, OnUpdateBtnUpgrade)
  47. ON_COMMAND(ID_CHECK_REMEMBER_FTP, OnCheckRememberFtpClick)
  48. ON_UPDATE_COMMAND_UI(ID_CHECK_REMEMBER_FTP, OnUpdateCheckRememberFtp)
  49. ON_EN_CHANGE(ID_EDIT_IMAGE_PATH, OnEnChangeEdit)
  50. ON_UPDATE_COMMAND_UI(ID_EIDT_FTP_USER, OnUpdateFtpUser)
  51. ON_UPDATE_COMMAND_UI(ID_EDIT_FTP_PASSWORD, OnUpdateFtpPassword)
  52. ON_WM_CONTEXTMENU()
  53. ON_WM_CTLCOLOR()
  54. END_MESSAGE_MAP()
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CResourceViewBar 消息处理程序
  57. void CUpgradeWnd::AdjustLayout()
  58. {
  59. if (GetSafeHwnd() == nullptr || (AfxGetMainWnd() != nullptr && AfxGetMainWnd()->IsIconic()))
  60. {
  61. return;
  62. }
  63. const int margin = 6;
  64. const int top = 10; // 离顶部距离;
  65. const int dr = 3; // 行间距
  66. const int dc = 5; // 列间距;
  67. int nHeight = top;
  68. CRect rcCtrl;
  69. CRect rectClient;
  70. GetClientRect(rectClient);
  71. // 1、编辑框;
  72. m_text_path.GetWindowRect(rcCtrl);
  73. ScreenToClient(rcCtrl);
  74. m_text_path.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + top, rcCtrl.Width(), rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
  75. m_edit_path.SetWindowPos(nullptr, rcCtrl.right + dr, rectClient.top + top, rectClient.Width() - rcCtrl.Width() - margin*2 - dr, m_nCtrlHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  76. nHeight += m_nCtrlHeight + dr;
  77. // 2、ftp用户;
  78. m_text_user.GetWindowRect(rcCtrl);
  79. ScreenToClient(rcCtrl);
  80. m_text_user.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight, rcCtrl.Width(), rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
  81. m_ftp_user.SetWindowPos(nullptr, rcCtrl.right + dr, rectClient.top + nHeight, rectClient.Width() - rcCtrl.Width() - margin * 2 - dr, m_nCtrlHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  82. nHeight += m_nCtrlHeight + dr;
  83. // 3、ftp密码;
  84. m_text_password.GetWindowRect(rcCtrl);
  85. ScreenToClient(rcCtrl);
  86. m_text_password.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight, rcCtrl.Width(), rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
  87. m_ftp_password.SetWindowPos(nullptr, rcCtrl.right + dr, rectClient.top + nHeight, rectClient.Width() - rcCtrl.Width() - margin * 2 - dr, m_nCtrlHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  88. nHeight += m_nCtrlHeight + dr;
  89. // 4、是否记住ftp信息;
  90. m_check_remember.GetWindowRect(rcCtrl);
  91. ScreenToClient(rcCtrl);
  92. m_check_remember.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight, rectClient.Width() - margin * 2, rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
  93. nHeight += rcCtrl.Height() + dr;
  94. // 5、升级;
  95. m_btnUpgrade.GetWindowRect(rcCtrl);
  96. ScreenToClient(rcCtrl);
  97. m_btnUpgrade.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight, rcCtrl.Width(), rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
  98. nHeight += rcCtrl.Height() + dr;
  99. // 提示语
  100. m_text_notify.GetWindowRect(rcCtrl);
  101. ScreenToClient(rcCtrl);
  102. m_text_notify.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight + dr, rectClient.Width() - margin * 2 , m_nCtrlHeight * 2, SWP_NOACTIVATE | SWP_NOZORDER);
  103. m_text_notify.Invalidate();
  104. }
  105. int CUpgradeWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
  106. {
  107. if (CDockablePane::OnCreate(lpCreateStruct) == -1)
  108. return -1;
  109. CRect rectDummy(0,0,60,23);
  110. // 创建组合:
  111. const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_BORDER | CBS_SORT | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_TABSTOP;
  112. // 编辑框;
  113. m_text_path.Create(GlobalString::g_strUpgradePath, SS_CENTER | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE , rectDummy, this, IDC_STATIC);
  114. //if (!m_edit_path.Create( WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPSIBLINGS| WS_TABSTOP, rectDummy, this, ID_EDIT_IMAGE_PATH))
  115. if (!m_edit_path.Create(WS_CHILD | WS_VISIBLE | WS_BORDER |ES_AUTOHSCROLL | WS_TABSTOP, rectDummy, this, ID_EDIT_IMAGE_PATH))
  116. {
  117. return -1;
  118. }
  119. m_text_user.Create(GlobalString::g_strUpgradeFTPUser, SS_CENTER | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE, rectDummy, this, IDC_STATIC);
  120. if (!m_ftp_user.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL | WS_TABSTOP, rectDummy, this, ID_EIDT_FTP_USER))
  121. {
  122. return -1;
  123. }
  124. m_text_password.Create(GlobalString::g_strUpgradeFTPPassword, SS_CENTER | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE, rectDummy, this, IDC_STATIC);
  125. if (!m_ftp_password.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | ES_PASSWORD | ES_AUTOHSCROLL | WS_TABSTOP, rectDummy, this, ID_EDIT_FTP_PASSWORD))
  126. {
  127. //m_ftp_password.SetPasswordChar(‘*');
  128. return -1;
  129. }
  130. if (!m_check_remember.Create(GlobalString::g_strUpgradeRememberFTP, WS_CHILD | BS_CHECKBOX| WS_VISIBLE | WS_TABSTOP, rectDummy, this, ID_CHECK_REMEMBER_FTP))
  131. {
  132. return -1;
  133. }
  134. if (!m_btnUpgrade.Create(GlobalString::g_strUpgradeBtn, WS_CHILD | WS_VISIBLE | WS_TABSTOP, rectDummy, this, ID_BTN_UPGRADE))
  135. {
  136. return -1;
  137. }
  138. // ES_WANTRETURN;
  139. m_text_notify.Create(GlobalString::g_strUpgradeNotify, SS_LEFT | WS_CHILD | WS_VISIBLE , rectDummy, this, IDC_STATIC);
  140. // 以编辑框高度为所有控件高度标准;
  141. CRect rcCtrl;
  142. m_edit_path.GetClientRect(&rcCtrl);
  143. m_nCtrlHeight = rcCtrl.Height();
  144. // 设置控件样式;
  145. SetCtrlStyle();
  146. SetStaticFont();
  147. // 设置最小窗体;
  148. SetMinSize((530, 260));
  149. // 校正布局;
  150. AdjustLayout();
  151. m_ftp_user.SetWindowText(Global::g_Config.strFtpUser.c_str());
  152. m_ftp_password.SetWindowText(Global::g_Config.strFtpPassword.c_str());
  153. return 0;
  154. }
  155. void CUpgradeWnd::OnSize(UINT nType, int cx, int cy)
  156. {
  157. CDockablePane::OnSize(nType, cx, cy);
  158. TRACE2("坐标:%d,%d\n", cx, cy);
  159. AdjustLayout();
  160. }
  161. void CUpgradeWnd::OnUpgradeBtnClick()
  162. {
  163. std::thread t([](CUpgradeWnd* p) {
  164. CString strPath = _T(""), strFtpUser = _T(""), strFtpPassword = _T("");
  165. p->m_edit_path.GetWindowText(strPath);
  166. p->m_ftp_user.GetWindowText(strFtpUser);
  167. p->m_ftp_password.GetWindowText(strFtpPassword);
  168. if (p->_bIsFtpPath) {
  169. Global::g_Config.strFtpUser = strFtpUser.GetString();
  170. Global::g_Config.strFtpPassword = strFtpPassword.GetString();
  171. WritePrivateProfileString("SATHelper", "ftp_user", strFtpUser.GetString(), Global::g_szConfig);
  172. WritePrivateProfileString("SATHelper", "ftp_password", strFtpPassword.GetString(), Global::g_szConfig);
  173. }
  174. p->m_btnUpgrade.EnableWindow(FALSE);
  175. if ( Global::g_Config.nLanguage)
  176. p->m_text_notify.SetWindowText("升级中,请稍等……!");
  177. else
  178. p->m_text_notify.SetWindowText("Upgrading, please wait!");
  179. Sleep(1000);
  180. CCallPython pycall;
  181. TCHAR szPath[MAX_PATH] = { 0 };
  182. _stprintf_s(szPath, _T("%sscripts\\TVUpgrade.py"), Global::g_szCurModuleDir);
  183. PyObject* pRet = pycall.CallPython(szPath, _T("API_TVUpgrade"), 3, _variant_t(strPath.GetString()), _variant_t(strFtpUser.GetString()), _variant_t(strFtpPassword.GetString()));
  184. if (pRet == NULL)
  185. {
  186. if (Global::g_Config.nLanguage)
  187. p->m_text_notify.SetWindowText("Running error, please check the script!");
  188. else
  189. p->m_text_notify.SetWindowText("运行出错,请检查脚本!");
  190. }
  191. else
  192. {
  193. p->m_text_notify.SetWindowText(pycall.GetUTF8String(pRet).c_str());
  194. if (pRet)
  195. Py_DECREF(pRet);
  196. }
  197. p->m_btnUpgrade.EnableWindow();
  198. }, this);
  199. t.detach();
  200. }
  201. void CUpgradeWnd::OnUpdateBtnUpgrade(CCmdUI* pCmdUI)
  202. {
  203. }
  204. void CUpgradeWnd::OnCheckRememberFtpClick()
  205. {
  206. BOOL bCheck = m_check_remember.GetCheck();
  207. m_check_remember.SetCheck(!bCheck);
  208. Global::g_Config.bRememberFTPInfo = !bCheck;
  209. WritePrivateProfileString("SATHelper", "rememberFTPInfo", Global::g_Config.bRememberFTPInfo ? "1" : "0", Global::g_szConfig);
  210. }
  211. void CUpgradeWnd::OnUpdateCheckRememberFtp(CCmdUI* pCmdUI)
  212. {
  213. pCmdUI->SetCheck(Global::g_Config.bRememberFTPInfo);
  214. }
  215. void CUpgradeWnd::OnEnChangeEdit()
  216. {
  217. UpdateData(TRUE);
  218. CString strText = _T("");
  219. m_edit_path.GetWindowText(strText);
  220. strText.TrimLeft(_T(" "));
  221. strText.MakeLower();
  222. if (strText.Find(_T("ftp://")) == 0 )
  223. _bIsFtpPath = TRUE;
  224. else
  225. _bIsFtpPath = FALSE;
  226. }
  227. void CUpgradeWnd::OnUpdateFtpUser(CCmdUI* pCmdUI)
  228. {
  229. pCmdUI->Enable(_bIsFtpPath);
  230. }
  231. void CUpgradeWnd::OnUpdateFtpPassword(CCmdUI* pCmdUI)
  232. {
  233. pCmdUI->Enable(_bIsFtpPath);
  234. }
  235. void CUpgradeWnd::SetStaticFont()
  236. {
  237. ::DeleteObject(m_fntPropList.Detach());
  238. LOGFONT lf;
  239. afxGlobalData.fontRegular.GetLogFont(&lf);
  240. NONCLIENTMETRICS info;
  241. info.cbSize = sizeof(info);
  242. afxGlobalData.GetNonClientMetrics(info);
  243. lf.lfHeight = info.lfMenuFont.lfHeight;
  244. lf.lfWeight = info.lfMenuFont.lfWeight;
  245. lf.lfItalic = info.lfMenuFont.lfItalic;
  246. m_fntPropList.CreateFontIndirect(&lf);
  247. m_text_path.SetFont(&m_fntPropList);
  248. m_text_user.SetFont(&m_fntPropList);
  249. m_text_password.SetFont(&m_fntPropList);
  250. m_check_remember.SetFont(&m_fntPropList);
  251. m_text_notify.SetFont(&m_fntPropList);
  252. m_edit_path.SetFont(&m_fntPropList);
  253. m_ftp_user.SetFont(&m_fntPropList);
  254. m_ftp_password.SetFont(&m_fntPropList);
  255. }
  256. void CUpgradeWnd::SetCtrlStyle()
  257. {
  258. // 将button设置成checkbox;
  259. m_check_remember.SetCheck(Global::g_Config.bRememberFTPInfo ? BST_CHECKED : BST_UNCHECKED);
  260. /*m_check_remember.m_bHighlightChecked = TRUE;
  261. // CMFCButton只能用图标来显示check;
  262. m_check_remember.SetImage(IDB_UNCHECKED);
  263. m_check_remember.SetCheckedImage(IDB_CHECKED);
  264. m_check_remember.m_bTransparent = FALSE;
  265. m_check_remember.m_bDrawFocus = FALSE;
  266. m_check_remember.m_nFlatStyle = CMFCButton::BUTTONSTYLE_FLAT;
  267. m_check_remember.SizeToContent();*/
  268. //m_edit_path.EnableFolderBrowseButton();
  269. m_edit_path.EnableFileBrowseButton(_T(""), _T("Image Files(*.img)|*.img"
  270. "|Zip Files(*.zip)|*.zip"
  271. "|Rar Files(*.rar)|*.rar"
  272. "|Binary Files(*.bin)|*.bin"
  273. "|All Files (*.*)|*.*||"), 0);
  274. }
  275. // 如果CDockablePane无控件,改变大小时背景会刷新失败;
  276. // 所以要重载onpaint;
  277. void CUpgradeWnd::OnPaint()
  278. {
  279. CPaintDC dc(this); // device context for painting
  280. // TODO: 在此处添加消息处理程序代码
  281. // 不为绘图消息调用 CDockablePane::OnPaint();
  282. CRect rc;
  283. GetClientRect(rc);
  284. CBrush brush;
  285. brush.CreateSolidBrush(0xFFEFD5);
  286. dc.FillRect(&rc, &brush);
  287. }
  288. void CUpgradeWnd::OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/)
  289. {
  290. // TODO: 在此处添加消息处理程序代码
  291. }
  292. HBRUSH CUpgradeWnd::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  293. {
  294. HBRUSH hbr = CDockablePane::OnCtlColor(pDC, pWnd, nCtlColor);
  295. // TODO: 在此更改 DC 的任何特性
  296. if (nCtlColor == CTLCOLOR_STATIC ) //静态文本颜色,并且指定控件ID号    && pWnd->GetDlgCtrlID() == IDC_STATIC   
  297. {
  298. //pDC->SetTextColor(RGB(255, 0, 0));
  299. //pDC->SetBkColor(RGB(191,219,255));     //静态控件的背景颜色设置,红字蓝底。          
  300. pDC->SetBkMode(TRANSPARENT); //静态文本框背景设置为透明
  301. HBRUSH brush;
  302. brush = CreateSolidBrush(0xFFEFD5);//控件背景色
  303. hbr = (HBRUSH)brush;
  304. }
  305. // TODO: 如果默认的不是所需画笔,则返回另一个画笔
  306. return hbr;
  307. }