MainDlg.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. // MainDlg.cpp : implementation of the CMainDlg class
  2. //
  3. /////////////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "MainDlg.h"
  6. #include "StabtypeControl.h"
  7. #include "CLashConfig.h"
  8. #include "SysProxy.h"
  9. CMainDlg::CMainDlg() : SHostWnd(_T("LAYOUT:XML_MAINWND")), m_base_clash(nullptr), pNodeAdapter(nullptr)
  10. {
  11. m_bLayoutInited = FALSE;
  12. m_refresh = false;
  13. m_connect_mage = nullptr;
  14. }
  15. CMainDlg::~CMainDlg()
  16. {
  17. if (m_base_clash)
  18. {
  19. delete m_base_clash;
  20. m_base_clash = nullptr;
  21. }
  22. if (m_connect_mage)
  23. {
  24. delete m_connect_mage;
  25. m_connect_mage = nullptr;
  26. }
  27. }
  28. int CMainDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
  29. {
  30. SetMsgHandled(FALSE);
  31. return 0;
  32. }
  33. BOOL CMainDlg::OnInitDialog(HWND hWnd, LPARAM lParam)
  34. {
  35. m_bLayoutInited = TRUE;
  36. Init();
  37. OnConnecting_UdateUi(false, CONNECT_NODE_MSG,L"");
  38. /*CManageNetWork m_manageNetwork;
  39. m_manageNetwork.GetNodeList();*/
  40. CManageNetWork::getSingletonPtr()->GetNodeList();
  41. return 0;
  42. }
  43. void CMainDlg::Init()
  44. {
  45. CApp::getSingletonPtr()->SetupDataDirectory();
  46. //FindChildByName2<STabCtrl>(L"tabmain");
  47. if (!m_base_clash)
  48. {
  49. m_base_clash = new CLashConfig();
  50. m_base_clash->InitClash();
  51. m_base_clash->StartClash();
  52. }
  53. if (!m_connect_mage)
  54. {
  55. m_connect_mage = new CConnectMage();
  56. m_connect_mage->SetClashConfig((CLashConfig*)m_base_clash);
  57. m_connect_mage->Init();
  58. }
  59. SysMode list;
  60. list.id = 0;
  61. list.name = L"系统代理";
  62. list.proxy_mode = PROXY_MODE::sys_mode;
  63. SysMode list1;
  64. list1.id = 1;
  65. list1.name = L"网卡代理";
  66. list1.proxy_mode = PROXY_MODE::tun_mode;
  67. m_sysmode_vctor.push_back(list);
  68. m_sysmode_vctor.push_back(list1);
  69. RouteMode route;
  70. route.id = 0;
  71. route.name = L"智能";
  72. route.route_mode = ROUT_MODE::cn_mode;
  73. RouteMode route2;
  74. route2.id = 1;
  75. route2.name = L"全局";
  76. route2.route_mode = ROUT_MODE::qg_mode;
  77. m_route_vctor.push_back(route);
  78. m_route_vctor.push_back(route2);
  79. StabtypeControl* tabtype = FindChildByName2<StabtypeControl>(L"sysmode");
  80. if (tabtype)
  81. {
  82. for (auto i = 0; i < m_sysmode_vctor.size(); i++)
  83. {
  84. tabtype->ItemCreateChildren(m_sysmode_vctor[i].id, m_sysmode_vctor[i].name,i == 0 ? true : false );
  85. }
  86. if (m_sysmode_vctor.size() > 0)
  87. {
  88. CApp::getSingletonPtr()->SetSysMode(PROXY_MODE::sys_mode);
  89. }
  90. tabtype->GetEventSet()->subscribeEvent(EVT_TABTYPE_CONTROL,
  91. Subscriber(&CMainDlg::OnSysModeType, this));
  92. }
  93. StabtypeControl* routetype = FindChildByName2<StabtypeControl>(L"routemode");
  94. if (routetype)
  95. {
  96. for (auto i = 0; i < m_route_vctor.size(); i++)
  97. {
  98. routetype->ItemCreateChildren(m_route_vctor[i].id, m_route_vctor[i].name, i == 0 ? true : false);
  99. }
  100. if (m_route_vctor.size() > 0)
  101. {
  102. CApp::getSingletonPtr()->SetRouteMode(ROUT_MODE::cn_mode);
  103. }
  104. routetype->GetEventSet()->subscribeEvent(EVT_TABTYPE_CONTROL,
  105. Subscriber(&CMainDlg::OnRouteModeType, this));
  106. }
  107. auto funRecent2 = std::bind(&CMainDlg::ShowView, this, std::placeholders::_1, std::placeholders::_2);
  108. auto funRecent3 = std::bind(&CMainDlg::ItemRClick, this, std::placeholders::_1);
  109. STileView* pTileView = FindChildByName2<STileView>("nodeList");
  110. if (pTileView)
  111. {
  112. /*std::vector<SStringT> vctInfo{ L"Test1",L"Fun1", L"Ming", L"Get" };*/
  113. pNodeAdapter = new CNodeAdapter(pTileView);
  114. pTileView->SetAdapter(pNodeAdapter);
  115. pNodeAdapter->SetShowView(funRecent2);
  116. pNodeAdapter->SetItemClickCallBack(funRecent3);
  117. //pNodeAdapter->Release();
  118. }
  119. UpDateUserInfo();
  120. }
  121. void CMainDlg::OnNode()
  122. {
  123. STabCtrl* m_tab_main = FindChildByName2<STabCtrl>(L"tabmain");
  124. if (m_tab_main)
  125. {
  126. m_tab_main->SetCurSel(1);
  127. m_tab_main->Invalidate();
  128. }
  129. }
  130. void CMainDlg::OnBackNode()
  131. {
  132. STabCtrl* m_tab_main = FindChildByName2<STabCtrl>(L"tabmain");
  133. if (m_tab_main)
  134. {
  135. m_tab_main->SetCurSel(0);
  136. m_tab_main->Invalidate();
  137. }
  138. }
  139. bool CMainDlg::OnSysModeType(SOUI::EventArgs* pEvt)
  140. {
  141. SOUI::EventTabtypeControl* pTestControlEvent =
  142. SOUI::sobj_cast<SOUI::EventTabtypeControl>(pEvt);
  143. if (!pTestControlEvent)
  144. {
  145. return false;
  146. }
  147. CApp::getSingletonPtr()->SetSysMode(m_sysmode_vctor[pTestControlEvent->nIndex].proxy_mode);
  148. return true;
  149. }
  150. bool CMainDlg::OnRouteModeType(SOUI::EventArgs* pEvt)
  151. {
  152. SOUI::EventTabtypeControl* pTestControlEvent =
  153. SOUI::sobj_cast<SOUI::EventTabtypeControl>(pEvt);
  154. if (!pTestControlEvent)
  155. {
  156. return false;
  157. }
  158. CApp::getSingletonPtr()->SetRouteMode(m_route_vctor[pTestControlEvent->nIndex].route_mode);
  159. return true;
  160. }
  161. void CMainDlg::OnServerListFinish(SOUI::EventArgs* pEvt)
  162. {
  163. EventNodeList* e2 = sobj_cast<EventNodeList>(pEvt);
  164. if (!e2)
  165. {
  166. return;
  167. }
  168. if (e2->status != 200 )
  169. {
  170. if (m_refresh)
  171. {
  172. SStatic* refresh_status = FindChildByName2<SStatic>(L"refresh_status");
  173. if (refresh_status)
  174. {
  175. refresh_status->SetWindowTextW(e2->msg);
  176. refresh_status->Invalidate();
  177. }
  178. SStatic* text_touch = FindChildByName2<SStatic>(L"text_touch");
  179. if (text_touch)
  180. {
  181. text_touch->SetWindowTextW(e2->msg);
  182. text_touch->Invalidate();
  183. }
  184. OnConnecting_UdateUi(TRUE, e2->msg);
  185. m_refresh = false;
  186. }
  187. else {
  188. UPdateMsgStatus(e2->msg);
  189. OnConnecting_UdateUi(TRUE, e2->msg);
  190. }
  191. }
  192. else if (e2->status == 200)
  193. {
  194. if (m_refresh)
  195. {
  196. SStatic* refresh_status = FindChildByName2<SStatic>(L"refresh_status");
  197. if (refresh_status)
  198. {
  199. refresh_status->SetWindowTextW(L"更新完成..");
  200. refresh_status->Invalidate();
  201. }
  202. SStatic* text_touch = FindChildByName2<SStatic>(L"text_touch");
  203. if (text_touch)
  204. {
  205. text_touch->SetWindowTextW(L"更新完成...");
  206. text_touch->Invalidate();
  207. }
  208. m_refresh = false;
  209. }
  210. else {
  211. OnConnecting_UdateUi(TRUE, SUEECS_NODE_MSG);
  212. CManageNetWork::getSingletonPtr()->GetVersion();
  213. }
  214. //更新 节点数据
  215. if (pNodeAdapter)
  216. {
  217. pNodeAdapter->SetCount(CApp::getSingletonPtr()->GetServerList()->vectlistmode.size());
  218. }
  219. }
  220. }
  221. void CMainDlg::OnVersionFinish(SOUI::EventArgs* pEvt)
  222. {
  223. EventVerions* e2 = sobj_cast<EventVerions>(pEvt);
  224. if (!e2)
  225. {
  226. return;
  227. }
  228. if (e2->status == 200)
  229. {
  230. UPdateVersionMsgStatus(e2->msg, S_CA2W(CApp::getSingletonPtr()->GetVerinfo()->appdownload.c_str()));
  231. }
  232. else {
  233. UPdateVersionMsgStatus(e2->msg);
  234. }
  235. }
  236. void CMainDlg::OnConnectFinish(SOUI::EventArgs* pEvt)
  237. {
  238. EventConnect* e2 = sobj_cast<EventConnect>(pEvt);
  239. if (!e2)
  240. {
  241. return;
  242. }
  243. if (e2->status == ConnectState::Stop)
  244. {
  245. OnConnecting_UdateUi(true, e2->msg, L"", false);
  246. OnUpdataNodeName();
  247. } else if (e2->status == ConnectState::SwitchConfigSuccEss)
  248. {
  249. OnConnecting_UdateUi(true, e2->msg, L"", true);
  250. OnUpdataNodeName();
  251. } else if (e2->status == ConnectState::SwitchNodeSuccEss)
  252. {
  253. OnConnecting_UdateUi(true, e2->msg, L"", true);
  254. OnUpdataNodeName();
  255. }
  256. }
  257. void CMainDlg::OnClashPreoceeQutFinish(SOUI::EventArgs* pEvt)
  258. {
  259. if (m_base_clash)
  260. {
  261. m_base_clash->StartClash();
  262. }
  263. if (m_connect_mage)
  264. {
  265. m_connect_mage->ReqConfig();
  266. }
  267. }
  268. void CMainDlg::UPdateMsgStatus(SStringW msg)
  269. {
  270. //text_touch
  271. SStatic* text_touch = FindChildByName2<SStatic>(L"text_touch");
  272. if (text_touch)
  273. {
  274. text_touch->SetWindowTextW(msg);
  275. text_touch->EnableWindow(FALSE);
  276. text_touch->Invalidate();
  277. }
  278. }
  279. void CMainDlg::UPdateVersionMsgStatus(SStringW msg, SStringW url)
  280. {
  281. SLink* app_version = FindChildByName2<SLink>(L"app_version");
  282. if (app_version)
  283. {
  284. if (!url.IsEmpty())
  285. {
  286. app_version->SetAttribute(L"href", url);
  287. }
  288. app_version->SetWindowTextW(msg);
  289. app_version->EnableWindow(true);
  290. app_version->Invalidate();
  291. }
  292. }
  293. void CMainDlg::UpDateUserInfo()
  294. {
  295. CUserInfo* userinfo = CApp::getSingletonPtr()->GetUserinfo();
  296. if (!userinfo)
  297. {
  298. return;
  299. }
  300. SStatic* username = FindChildByName2<SStatic>(L"username");
  301. if (username)
  302. {
  303. username->SetWindowTextW(SStringW().Format(L"用户名:%s", S_CA2W(userinfo->username.c_str())));
  304. username->EnableWindow(FALSE);
  305. username->Invalidate();
  306. }
  307. SStatic* username_time = FindChildByName2<SStatic>(L"username_time");
  308. if (username_time)
  309. {
  310. username_time->SetWindowTextW(SStringW().Format(L"到期时间:%s", S_CA2W(userinfo->expiretime.c_str())));
  311. username_time->EnableWindow(FALSE);
  312. username_time->Invalidate();
  313. }
  314. SStatic* username_liulaing = FindChildByName2<SStatic>(L"username_liulaing");
  315. if (username_liulaing)
  316. {
  317. username_liulaing->SetWindowTextW(SStringW().Format(L"用户流量:%s", S_CA2W(userinfo->unusedTraffic.c_str())));
  318. username_liulaing->EnableWindow(FALSE);
  319. username_liulaing->Invalidate();
  320. }
  321. SLink* username_jiaocheng = FindChildByName2<SLink>(L"username_jiaocheng");
  322. if (username_jiaocheng)
  323. {
  324. username_jiaocheng->SetAttribute(L"href", S_CA2W(userinfo->swoftdownload.c_str()));
  325. username_jiaocheng->EnableWindow(true);
  326. username_jiaocheng->Invalidate();
  327. }
  328. SLink* username_chongzhi = FindChildByName2<SLink>(L"username_chongzhi");
  329. if (username_chongzhi)
  330. {
  331. username_chongzhi->SetAttribute(L"href", S_CA2W(userinfo->user_login_url.c_str()));
  332. username_chongzhi->EnableWindow(true);
  333. username_chongzhi->Invalidate();
  334. }
  335. SLink* username_tuiguang = FindChildByName2<SLink>(L"username_tuiguang");
  336. if (username_tuiguang)
  337. {
  338. username_tuiguang->SetAttribute(L"href", S_CA2W(userinfo->affurl.c_str()));
  339. username_tuiguang->EnableWindow(true);
  340. username_tuiguang->Invalidate();
  341. }
  342. if (m_base_clash)
  343. {
  344. auto http_prot = m_base_clash->GetHttpPort();
  345. auto sock_prot = m_base_clash->GetSocketPort();
  346. SStatic* httpproxy = FindChildByName2<SStatic>(L"httpproxy");
  347. if (httpproxy)
  348. {
  349. httpproxy->SetWindowTextW(SStringW().Format(L"http proxy 127.0.0.1:%d", http_prot));
  350. httpproxy->EnableWindow(FALSE);
  351. httpproxy->Invalidate();
  352. }
  353. SStatic* socksproxy = FindChildByName2<SStatic>(L"socksproxy");
  354. if (socksproxy)
  355. {
  356. socksproxy->SetWindowTextW(SStringW().Format(L"socks proxy 127.0.0.1:%d", sock_prot));
  357. socksproxy->EnableWindow(FALSE);
  358. socksproxy->Invalidate();
  359. }
  360. }
  361. }
  362. void CMainDlg::ShowView(int nItem, SWindow* pItem)
  363. {
  364. if (!pNodeAdapter)
  365. {
  366. return;
  367. }
  368. CServerList* p = CApp::getSingletonPtr()->GetServerList();
  369. if (!p)
  370. {
  371. return;
  372. }
  373. auto vectorserverlist = p->vectlistmode;
  374. SStatic* servername = pItem->FindChildByName2<SStatic>(L"servername");
  375. if (servername)
  376. {
  377. servername->SetWindowTextW(S_CA2W(vectorserverlist[nItem].name.c_str(),CP_UTF8));
  378. }
  379. SStatic* serverms = pItem->FindChildByName2<SStatic>(L"serverms");
  380. if (serverms)
  381. {
  382. SStringW msg = L"";
  383. SStringW color = L"";
  384. SLOG_DEBUG(vectorserverlist[nItem].online_users);
  385. if(vectorserverlist[nItem].online_users <= 49 && vectorserverlist[nItem].online_users >= 1) { //空闲
  386. msg = L"流畅";
  387. color = L"#6aa84f";
  388. }
  389. else if (vectorserverlist[nItem].online_users >= 50 && vectorserverlist[nItem].online_users >= 100) { //繁忙
  390. msg = L"繁忙";
  391. color = L"#7c7c7c";
  392. }
  393. else if (vectorserverlist[nItem].online_users >= 100 && vectorserverlist[nItem].online_users >= 400) { //繁忙
  394. msg = L"拥挤";
  395. color = L"#7c7c7c";
  396. }
  397. else if (vectorserverlist[nItem].online_users <= 0){
  398. msg = L"维护";
  399. color = L"#696969";
  400. }
  401. else {
  402. msg = L"流畅";
  403. color = L"#6aa84f";
  404. }
  405. serverms->SetWindowTextW(msg);
  406. serverms->SetAttribute(L"colorText", color);
  407. }
  408. }
  409. void CMainDlg::ItemRClick(int nItem)
  410. {
  411. CServerList* p = CApp::getSingletonPtr()->GetServerList();
  412. if (!p)
  413. {
  414. return;
  415. }
  416. auto vectorserverlist = p->vectlistmode;
  417. auto name = vectorserverlist[nItem].name;
  418. OnBackNode();
  419. SLOG_DEBUG(name.c_str());
  420. //切换CLash api
  421. if (m_connect_mage)
  422. {
  423. m_connect_mage->SetNodeName(name);
  424. m_connect_mage->ReqConfig();
  425. }
  426. CApp::getSingletonPtr()->SetSelect_node(name);
  427. OnUpdataNodeName();
  428. }
  429. void CMainDlg::OnRefresh()
  430. {
  431. if (m_refresh)
  432. {
  433. return;
  434. }
  435. //更新 节点数据
  436. if (pNodeAdapter)
  437. {
  438. pNodeAdapter->SetCount(0);
  439. }
  440. CManageNetWork::getSingletonPtr()->GetNodeList();
  441. m_refresh = true;
  442. //refresh_status
  443. SStatic* refresh_status = FindChildByName2<SStatic>(L"refresh_status");
  444. if (refresh_status)
  445. {
  446. refresh_status->SetWindowTextW(L"正在刷新节点...");
  447. refresh_status->Invalidate();
  448. }
  449. SStatic* text_touch = FindChildByName2<SStatic>(L"text_touch");
  450. if (text_touch)
  451. {
  452. text_touch->SetWindowTextW(L"正在刷新节点...");
  453. text_touch->Invalidate();
  454. }
  455. }
  456. void CMainDlg::OnConnect()
  457. {
  458. if (!m_connect_mage)
  459. {
  460. return;
  461. }
  462. if (m_connect_mage->GetConnectStatus() == ConnectState::Stop)
  463. {
  464. m_connect_mage->ReqConfig();
  465. OnConnecting_UdateUi(false, L"正在启动中..", L"", false);
  466. }
  467. else {
  468. m_connect_mage->Stop();
  469. DisableSystemProxy();
  470. OnConnecting_UdateUi(true, L"停止成功", L"", false);
  471. }
  472. }
  473. void CMainDlg::OnUpdataNodeName(SStringW nodename)
  474. {
  475. SStatic* node_name = FindChildByName2<SStatic>(L"node_name");
  476. if (node_name)
  477. {
  478. if (nodename.IsEmpty())
  479. {
  480. if (!CApp::getSingletonPtr()->GetSelect_node().empty())
  481. {
  482. node_name->SetWindowTextW(S_CA2W(CApp::getSingletonPtr()->GetSelect_node().c_str(), CP_UTF8));
  483. }
  484. else {
  485. if (!CApp::getSingletonPtr()->GetServerList()->node_name.empty());
  486. {
  487. node_name->SetWindowTextW(S_CA2W(CApp::getSingletonPtr()->GetServerList()->node_name.c_str(), CP_UTF8));
  488. }
  489. }
  490. }
  491. else {
  492. //node_name->SetWindowTextW(nodename);
  493. }
  494. node_name->Invalidate();
  495. }
  496. }
  497. //连接状态 更新UI
  498. void CMainDlg::OnConnecting_UdateUi(bool b,SStringW msg,SStringW acc_msg,bool connect)
  499. {
  500. SWindow* selectnode = FindChildByName2<SWindow>(L"selectnode");
  501. if (selectnode)
  502. {
  503. selectnode->EnableWindow(b);
  504. selectnode->Invalidate();
  505. }
  506. SImageButton* Refresh = FindChildByName2<SImageButton>(L"OnRefresh");
  507. if (Refresh)
  508. {
  509. Refresh->EnableWindow(b);
  510. Refresh->Invalidate();
  511. }
  512. SStatic* text_touch = FindChildByName2<SStatic>(L"text_touch");
  513. if (text_touch)
  514. {
  515. text_touch->SetWindowTextW(msg);
  516. text_touch->EnableWindow(b);
  517. text_touch->Invalidate();
  518. }
  519. SImageButton* connect_touch = FindChildByName2<SImageButton>(L"connect_touch");
  520. if (connect_touch)
  521. {
  522. if (connect)
  523. {
  524. connect_touch->SetAttribute(L"skin", L"skin_btnswitchon");
  525. }
  526. else {
  527. connect_touch->SetAttribute(L"skin", L"skin_btnswitchoff");
  528. }
  529. connect_touch->EnableWindow(b);
  530. connect_touch->Invalidate();
  531. }
  532. }
  533. //TODO:消息映射
  534. void CMainDlg::OnClose()
  535. {
  536. ShowWindow(SW_HIDE);
  537. }
  538. void CMainDlg::OnMaximize()
  539. {
  540. SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE);
  541. }
  542. void CMainDlg::OnRestore()
  543. {
  544. SendMessage(WM_SYSCOMMAND, SC_RESTORE);
  545. }
  546. void CMainDlg::OnMinimize()
  547. {
  548. SendMessage(WM_SYSCOMMAND, SC_MINIMIZE);
  549. }
  550. void ShowConsoleWindow(bool show) {
  551. const HWND hWnd = CProcessManager::getSingletonPtr()->GetConsoleWindow();
  552. if (hWnd)
  553. {
  554. ShowWindow(hWnd, show ? SW_SHOW : SW_HIDE);
  555. if (show)
  556. SetForegroundWindow(hWnd);
  557. }
  558. }
  559. void CMainDlg::OnCommand(UINT uNotifyCode, int nID, HWND wndCtl) {
  560. if (uNotifyCode == 0)
  561. {
  562. if (nID == 2)
  563. {
  564. const HWND hWndConsole = CProcessManager::getSingletonPtr()->GetConsoleWindow();
  565. if (hWndConsole)
  566. {
  567. ShowConsoleWindow(!::IsWindowVisible(hWndConsole));
  568. }
  569. else
  570. ShowConsoleWindow(false);
  571. }
  572. else if (nID == 6) {
  573. if (m_refresh)
  574. {
  575. SMessageBox(m_hWnd, L"正在刷新,无法退出", L"提示", 0);
  576. }
  577. else {
  578. if (m_base_clash)
  579. {
  580. DisableSystemProxy();
  581. CProcessManager::getSingletonPtr()->SendStopSignal();
  582. WaitForSingleObject(CProcessManager::getSingletonPtr()->GetClashProcessInfo().hProcess, 3000);
  583. CProcessManager::getSingletonPtr()->Stop();
  584. m_base_clash->StopClash();
  585. delete m_base_clash;
  586. m_base_clash = nullptr;
  587. }
  588. CSimpleWnd::DestroyWindow();
  589. }
  590. }
  591. }
  592. }