TXSPDlg.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. // TXSPDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "LYFZIPManage.h"
  5. #include "TXSPDlg.h"
  6. #include "MyMdi.H"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // TXSPDlg
  14. IMPLEMENT_DYNCREATE(TXSPDlg, CFormView)
  15. TXSPDlg::TXSPDlg()
  16. : CFormView(TXSPDlg::IDD)
  17. {
  18. //{{AFX_DATA_INIT(TXSPDlg)
  19. m_taoxiid = _T("");
  20. m_taoxijiage = _T("");
  21. m_zs = _T("");
  22. //}}AFX_DATA_INIT
  23. }
  24. TXSPDlg::~TXSPDlg()
  25. {
  26. }
  27. void TXSPDlg::DoDataExchange(CDataExchange* pDX)
  28. {
  29. CFormView::DoDataExchange(pDX);
  30. //{{AFX_DATA_MAP(TXSPDlg)
  31. DDX_Control(pDX, IDC_LIST2, m_List2);
  32. DDX_Control(pDX, IDC_LIST1, m_List1);
  33. DDX_Control(pDX, IDC_STATIC1, m_static1);
  34. DDX_Control(pDX, IDC_COMBOtaoxiname, m_combotaoxiname);
  35. DDX_Text(pDX, IDC_EDITtaoxiid, m_taoxiid);
  36. DDX_Text(pDX, IDC_EDITtaoxijiage, m_taoxijiage);
  37. DDX_Text(pDX, IDC_EDITzs, m_zs);
  38. //}}AFX_DATA_MAP
  39. }
  40. BEGIN_MESSAGE_MAP(TXSPDlg, CFormView)
  41. //{{AFX_MSG_MAP(TXSPDlg)
  42. ON_BN_CLICKED(IDC_BUTsave, OnBUTsave)
  43. ON_BN_CLICKED(IDC_BUTdel, OnBUTdel)
  44. ON_BN_CLICKED(IDC_BUTclose, OnBUTclose)
  45. ON_CBN_SELCHANGE(IDC_COMBOtaoxiname, OnSelchangeCOMBOtaoxiname)
  46. ON_BN_CLICKED(IDC_BUTspbox, OnBUTspbox)
  47. ON_WM_TIMER()
  48. ON_BN_CLICKED(IDC_BUTsave2, OnBUTsave2)
  49. ON_BN_CLICKED(IDC_BUTdel2, OnBUTdel2)
  50. ON_BN_CLICKED(IDC_BUTspbox2, OnBUTspbox2)
  51. ON_BN_CLICKED(IDC_BUTclose2, OnBUTclose2)
  52. //}}AFX_MSG_MAP
  53. END_MESSAGE_MAP()
  54. /////////////////////////////////////////////////////////////////////////////
  55. // TXSPDlg diagnostics
  56. #ifdef _DEBUG
  57. void TXSPDlg::AssertValid() const
  58. {
  59. CFormView::AssertValid();
  60. }
  61. void TXSPDlg::Dump(CDumpContext& dc) const
  62. {
  63. CFormView::Dump(dc);
  64. }
  65. #endif //_DEBUG
  66. /////////////////////////////////////////////////////////////////////////////
  67. // TXSPDlg message handlers
  68. void TXSPDlg::OnInitialUpdate()
  69. {
  70. CFormView::OnInitialUpdate();
  71. // TODO: Add your specialized code here and/or call the base class
  72. CMyMdi Mdi;
  73. Mdi.SetSubView((CWnd*)GetParent(), (CWnd*)this);
  74. // Here we create the outbar control using the splitter as its parent
  75. // and setting its id to the first pane.
  76. CRect rc2;
  77. GetWindowRect(rc2);
  78. ::MoveWindow(m_hWnd,g_rc.left,g_rc.top,g_rc.Width(),g_rc.Height(),TRUE);
  79. EnumChildWindows(m_hWnd,(WNDENUMPROC)EnumChildProc,0);
  80. m_combotaoxiname.GetWindowRect (rc2);
  81. ScreenToClient(rc2);
  82. rc2.bottom +=200;
  83. m_combotaoxiname.MoveWindow (rc2);
  84. m_static1.SetFont (&g_titlefont);
  85. g_sendhead.bsql=0;
  86. g_sendhead.code[0]=6;
  87. g_sendhead.code[1]=7;
  88. g_sendhead.code[2]=10;
  89. g_sendhead.code[3]=4;
  90. g_sendhead.tabcount=4;
  91. g_pMainWnd->ProcessChatMessageRequest2(6);if(g_bSendOK==0)return;
  92. DataToArray(&m_List1array, &m_List2array, &m_List3array, &m_sparray);
  93. for(int i=0; i<m_List1array.GetSize (); i++)
  94. m_combotaoxiname.AddString (m_List1array.ElementAt (i).ElementAt (1));
  95. m_List1.InitStyle();
  96. m_List1.InsertColumn(0,_T("编号"),LVCFMT_LEFT,80);
  97. m_List1.InsertColumn(1,_T("商品名称"),LVCFMT_LEFT,200);
  98. m_List1.InsertColumn(2,_T("数量"),LVCFMT_LEFT,60);
  99. m_List2.InitStyle();
  100. m_List2.InsertColumn(0,_T("编号"),LVCFMT_LEFT,80);
  101. m_List2.InsertColumn(1,_T("商品名称"),LVCFMT_LEFT,200);
  102. m_List2.InsertColumn(2,_T("数量"),LVCFMT_LEFT,60);
  103. }
  104. void TXSPDlg::OnSelchangeCOMBOtaoxiname()
  105. {
  106. // TODO: Add your control notification handler code here
  107. int pos=m_combotaoxiname.GetCurSel ();
  108. if(pos==-1)return;
  109. m_taoxiid = m_List1array.ElementAt (pos).ElementAt (0);
  110. m_taoxijiage = m_List1array.ElementAt (pos).ElementAt (2);
  111. m_zs = m_List1array.ElementAt (pos).ElementAt (3);
  112. UpdateData(false);
  113. FillGrid();
  114. }
  115. void TXSPDlg::FillGrid()
  116. {
  117. m_List1.DeleteAllItems ();
  118. int pos=0;
  119. for(int i=0; i<m_List2array.GetSize (); i++)
  120. {
  121. if(m_List2array.ElementAt (i).ElementAt (0)!=m_taoxiid)continue;
  122. m_List1.InsertItem(pos, m_List2array.ElementAt (i).ElementAt (1));
  123. m_List1.SetItemText(pos,1, GetSPNameFromId(m_List2array.ElementAt (i).ElementAt (1)));
  124. m_List1.SetItemText(pos,2, m_List2array.ElementAt (i).ElementAt (2));
  125. pos++;
  126. }
  127. //#ifndef MODERN_VERSION
  128. #if 0
  129. for( i=0; i<m_List3array.GetSize (); i++)
  130. {
  131. if(m_List3array.ElementAt (i).ElementAt (0)!=m_taoxiid)continue;
  132. m_List1.InsertItem(pos, m_List3array.ElementAt (i).ElementAt (1));
  133. m_List1.SetItemText(pos,1, GetSPNameFromId(m_List3array.ElementAt (i).ElementAt (1)));
  134. m_List1.SetItemText(pos,2, m_List3array.ElementAt (i).ElementAt (2));
  135. pos++;
  136. }
  137. #else
  138. m_List2.DeleteAllItems ();
  139. pos=0;
  140. for( i=0; i<m_List3array.GetSize (); i++)
  141. {
  142. if(m_List3array.ElementAt (i).ElementAt (0)!=m_taoxiid)continue;
  143. m_List2.InsertItem(pos, m_List3array.ElementAt (i).ElementAt (1));
  144. m_List2.SetItemText(pos,1, GetSPNameFromId(m_List3array.ElementAt (i).ElementAt (1)));
  145. m_List2.SetItemText(pos,2, m_List3array.ElementAt (i).ElementAt (2));
  146. pos++;
  147. }
  148. #endif
  149. }
  150. CString TXSPDlg::GetSPNameFromId(CString id)
  151. {
  152. for(int i=0; i<m_sparray.GetSize (); i++)
  153. {
  154. if(id==m_sparray.ElementAt (i).ElementAt (0))
  155. return m_sparray.ElementAt (i).ElementAt (1);
  156. }
  157. id.TrimLeft ("0");
  158. for( i=0; i<m_sparray.GetSize (); i++)
  159. {
  160. if(id==m_sparray.ElementAt (i).ElementAt (0))
  161. return m_sparray.ElementAt (i).ElementAt (1);
  162. }
  163. return "";
  164. }
  165. BOOL TXSPDlg::PreTranslateMessage(MSG* pMsg)
  166. {
  167. // TODO: Add your specialized code here and/or call the base class
  168. if(pMsg->message==WM_KEYDOWN)
  169. {
  170. switch( pMsg->wParam )
  171. {
  172. case 0x43: // copy
  173. if ( ( GetKeyState( VK_CONTROL ) & 0x80 ) )
  174. {
  175. GetFocus()->SendMessage(WM_COPY);
  176. return TRUE;
  177. }
  178. break;
  179. case 0x56: //Ctrl + V:
  180. if ( ( GetKeyState( VK_CONTROL ) & 0x80 ) )
  181. {
  182. GetFocus()->SendMessage(WM_PASTE);
  183. return TRUE;
  184. }
  185. break;
  186. case 0x58: // cut
  187. if ( ( GetKeyState( VK_CONTROL ) & 0x80 ) )
  188. {
  189. GetFocus()->SendMessage(WM_CUT);
  190. return TRUE;
  191. }
  192. break;
  193. case 0x5A: //undo
  194. case 0x59: //redo
  195. if ( ( GetKeyState( VK_CONTROL ) & 0x80 ) )
  196. {
  197. GetFocus()->SendMessage(WM_UNDO);
  198. return TRUE;
  199. }
  200. break;
  201. }
  202. }
  203. else if(pMsg->message==WM_LBUTTONDBLCLK)
  204. {
  205. {//list1
  206. CPoint pt;
  207. CRect rc,rc2;
  208. ::GetCursorPos (&pt);
  209. m_List1.GetWindowRect (rc2);
  210. if(rc2.PtInRect (pt)==0) goto ll;
  211. pt.x-=rc2.left ;
  212. pt.y-=rc2.top ;
  213. int iItem=m_List1.GetItemCount ()-1;
  214. if(iItem<0)
  215. {
  216. m_List1.GetHeaderCtrl()->GetItemRect (0, rc);
  217. int hei=rc.Height ();
  218. rc.top +=hei;
  219. rc.bottom +=hei;
  220. if(rc.PtInRect (pt))
  221. {
  222. m_List1.InsertItem(m_List1.GetItemCount (), "");
  223. }
  224. }
  225. else
  226. {
  227. m_List1.GetSubItemRect( iItem, 0, LVIR_BOUNDS, rc);
  228. int hei=rc.Height ();
  229. rc.top +=hei;
  230. rc.bottom +=hei;
  231. if(rc.PtInRect (pt))
  232. {
  233. if(m_List1.GetItemText (iItem, 0).IsEmpty ()&&m_List1.GetItemText (iItem, 1).IsEmpty ()&&m_List1.GetItemText (iItem, 2).IsEmpty ())
  234. goto ll;
  235. m_List1.InsertItem(m_List1.GetItemCount (), "");
  236. }
  237. }
  238. }
  239. ll: {//list2
  240. CPoint pt;
  241. CRect rc,rc2;
  242. ::GetCursorPos (&pt);
  243. m_List2.GetWindowRect (rc2);
  244. if(rc2.PtInRect (pt)==0) return CFormView::PreTranslateMessage(pMsg);
  245. pt.x-=rc2.left ;
  246. pt.y-=rc2.top ;
  247. int iItem=m_List2.GetItemCount ()-1;
  248. if(iItem<0)
  249. {
  250. m_List2.GetHeaderCtrl()->GetItemRect (0, rc);
  251. int hei=rc.Height ();
  252. rc.top +=hei;
  253. rc.bottom +=hei;
  254. if(rc.PtInRect (pt))
  255. {
  256. m_List2.InsertItem(m_List2.GetItemCount (), "");
  257. }
  258. }
  259. else
  260. {
  261. m_List2.GetSubItemRect( iItem, 0, LVIR_BOUNDS, rc);
  262. int hei=rc.Height ();
  263. rc.top +=hei;
  264. rc.bottom +=hei;
  265. if(rc.PtInRect (pt))
  266. {
  267. if(m_List2.GetItemText (iItem, 0).IsEmpty ()&&m_List2.GetItemText (iItem, 1).IsEmpty ()&&m_List2.GetItemText (iItem, 2).IsEmpty ())
  268. return CFormView::PreTranslateMessage(pMsg);
  269. m_List2.InsertItem(m_List2.GetItemCount (), "");
  270. }
  271. }
  272. }
  273. }
  274. if(pMsg->message==WM_LBUTTONDOWN)
  275. {
  276. {//list1
  277. CPoint pt;
  278. CRect rc,rc2;
  279. ::GetCursorPos (&pt);
  280. m_List1.GetWindowRect (rc2);
  281. if(rc2.PtInRect (pt)==0) goto mm;
  282. SetTimer(1, 300, NULL);
  283. }
  284. mm: {//list2
  285. CPoint pt;
  286. CRect rc,rc2;
  287. ::GetCursorPos (&pt);
  288. m_List2.GetWindowRect (rc2);
  289. if(rc2.PtInRect (pt)==0) return CFormView::PreTranslateMessage(pMsg);
  290. SetTimer(2, 300, NULL);
  291. }
  292. }
  293. return CFormView::PreTranslateMessage(pMsg);
  294. }
  295. void TXSPDlg::SetSPName1()
  296. {
  297. for(int i=0; i<m_List1.GetItemCount (); i++)
  298. {
  299. m_List1.SetItemText(i,1, GetSPNameFromId(m_List1.GetItemText (i, 0)));
  300. }
  301. }
  302. void TXSPDlg::SetSPName2()
  303. {
  304. for(int i=0; i<m_List2.GetItemCount (); i++)
  305. {
  306. m_List2.SetItemText(i,1, GetSPNameFromId(m_List2.GetItemText (i, 0)));
  307. }
  308. }
  309. void TXSPDlg::OnTimer(UINT nIDEvent)
  310. {
  311. // TODO: Add your message handler code here and/or call default
  312. if(nIDEvent==1)
  313. {
  314. KillTimer(nIDEvent);
  315. SetSPName1();
  316. }
  317. else if(nIDEvent==2)
  318. {
  319. KillTimer(nIDEvent);
  320. SetSPName2();
  321. }
  322. }
  323. void TXSPDlg::OnBUTsave()
  324. {
  325. // TODO: Add your control notification handler code here
  326. int pos=m_combotaoxiname.GetCurSel ();
  327. if(pos==-1)return;
  328. CArray<CStringArray, CStringArray>sparray;
  329. sparray.SetSize(m_List1.GetItemCount ());
  330. int realcount=0;
  331. for(int i=0; i<m_List1.GetItemCount (); i++)
  332. {
  333. if(m_List1.GetItemText (i, 0).IsEmpty ())continue;
  334. sparray.ElementAt (realcount).Add ( m_List1array.ElementAt (pos).ElementAt (0) );
  335. sparray.ElementAt (realcount).Add ( m_List1.GetItemText (i, 0) );
  336. sparray.ElementAt (realcount).Add ( m_List1.GetItemText (i, 2) );
  337. realcount++;
  338. }
  339. sparray.SetSize(realcount);
  340. if(realcount==0)
  341. {
  342. sparray.SetSize(1);
  343. sparray.ElementAt (0).Add (m_List1array.ElementAt (pos).ElementAt (0));
  344. }
  345. CMemFile memfile;
  346. CArchive ar(&memfile, CArchive::store);
  347. for(int ii=0; ii<sparray.GetSize (); ii++)
  348. {
  349. sparray.ElementAt (ii).Serialize (ar);
  350. }
  351. ar.Close();
  352. int length=memfile.GetLength ();
  353. BYTE *pData = memfile.Detach();
  354. int size=sparray.GetSize ();
  355. BYTE *pData2=new BYTE[length+sizeof(int)];
  356. memcpy(pData2, pData, length);
  357. memcpy(pData2+length, &size, sizeof(int));
  358. delete []pData;
  359. length+=sizeof(int);
  360. g_nSendCode=1;
  361. g_pMainWnd->ProcessChatMessageRequest2(pData2, length);
  362. g_nSendCode=0;
  363. delete []pData2;
  364. if(g_bSendOK==0)return;
  365. g_sendhead.bsql=0;
  366. g_sendhead.code[0]=7;
  367. g_sendhead.code[1]=10;
  368. g_sendhead.tabcount=2;
  369. g_pMainWnd->ProcessChatMessageRequest2(7);if(g_bSendOK==0)return;
  370. DataToArray(&m_List2array, &m_List3array);
  371. AfxMessageBox("保存成功!", MB_ICONINFORMATION);
  372. }
  373. void TXSPDlg::OnBUTdel()
  374. {
  375. // TODO: Add your control notification handler code here
  376. POSITION pos;
  377. pos=m_List1.GetFirstSelectedItemPosition();
  378. if(pos==NULL)
  379. {
  380. AfxMessageBox("请先选中您要删除的项目!", MB_ICONINFORMATION);
  381. return;
  382. }
  383. int iItem=m_List1.GetNextSelectedItem(pos);
  384. m_List1.DeleteItem (iItem);
  385. int count=m_List1.GetItemCount ();
  386. if(count==0)return;
  387. if(iItem==count)
  388. iItem=0;
  389. m_List1.SetItemState (iItem, LVIS_SELECTED, LVIS_SELECTED);
  390. }
  391. void TXSPDlg::OnBUTspbox()
  392. {
  393. // TODO: Add your control notification handler code here
  394. SPBox dlg;
  395. if(dlg.DoModal ()!=IDOK)return;
  396. int pos=m_List1.GetItemCount ();
  397. if(pos)
  398. {
  399. if(m_List1.GetItemText (pos-1, 0).IsEmpty ()&&m_List1.GetItemText (pos-1, 1).IsEmpty ()&&m_List1.GetItemText (pos-1, 2).IsEmpty ())
  400. {
  401. pos--;
  402. m_List1.SetItemText(pos,0, dlg.m_spid);
  403. m_List1.SetItemText(pos,1, GetSPNameFromId(dlg.m_spid));
  404. }
  405. else
  406. {
  407. m_List1.InsertItem(pos, dlg.m_spid);
  408. m_List1.SetItemText(pos,1, GetSPNameFromId(dlg.m_spid));
  409. }
  410. }
  411. else
  412. {
  413. m_List1.InsertItem(pos, dlg.m_spid);
  414. m_List1.SetItemText(pos,1, GetSPNameFromId(dlg.m_spid));
  415. }
  416. }
  417. void TXSPDlg::OnBUTclose()
  418. {
  419. // TODO: Add your control notification handler code here
  420. GetParent()->SendMessage(WM_CLOSE);
  421. }
  422. void TXSPDlg::OnBUTsave2()
  423. {
  424. // TODO: Add your control notification handler code here
  425. int pos=m_combotaoxiname.GetCurSel ();
  426. if(pos==-1)return;
  427. CArray<CStringArray, CStringArray>sparray;
  428. sparray.SetSize(m_List2.GetItemCount ());
  429. int realcount=0;
  430. for(int i=0; i<m_List2.GetItemCount (); i++)
  431. {
  432. if(m_List2.GetItemText (i, 0).IsEmpty ())continue;
  433. sparray.ElementAt (realcount).Add ( m_List1array.ElementAt (pos).ElementAt (0) );
  434. sparray.ElementAt (realcount).Add ( m_List2.GetItemText (i, 0) );
  435. sparray.ElementAt (realcount).Add ( m_List2.GetItemText (i, 2) );
  436. realcount++;
  437. }
  438. sparray.SetSize(realcount);
  439. if(realcount==0)
  440. {
  441. sparray.SetSize(1);
  442. sparray.ElementAt (0).Add (m_List1array.ElementAt (pos).ElementAt (0));
  443. }
  444. CMemFile memfile;
  445. CArchive ar(&memfile, CArchive::store);
  446. for(int ii=0; ii<sparray.GetSize (); ii++)
  447. {
  448. sparray.ElementAt (ii).Serialize (ar);
  449. }
  450. ar.Close();
  451. int length=memfile.GetLength ();
  452. BYTE *pData = memfile.Detach();
  453. int size=sparray.GetSize ();
  454. BYTE *pData2=new BYTE[length+sizeof(int)];
  455. memcpy(pData2, pData, length);
  456. memcpy(pData2+length, &size, sizeof(int));
  457. delete []pData;
  458. length+=sizeof(int);
  459. g_nSendCode=2;
  460. g_pMainWnd->ProcessChatMessageRequest2(pData2, length);
  461. g_nSendCode=0;
  462. delete []pData2;
  463. if(g_bSendOK==0)return;
  464. g_sendhead.bsql=0;
  465. g_sendhead.code[0]=7;
  466. g_sendhead.code[1]=10;
  467. g_sendhead.tabcount=2;
  468. g_pMainWnd->ProcessChatMessageRequest2(7);if(g_bSendOK==0)return;
  469. DataToArray(&m_List2array, &m_List3array);
  470. AfxMessageBox("保存成功!", MB_ICONINFORMATION);
  471. }
  472. void TXSPDlg::OnBUTdel2()
  473. {
  474. // TODO: Add your control notification handler code here
  475. POSITION pos;
  476. pos=m_List2.GetFirstSelectedItemPosition();
  477. if(pos==NULL)
  478. {
  479. AfxMessageBox("请先选中您要删除的项目!", MB_ICONINFORMATION);
  480. return;
  481. }
  482. int iItem=m_List2.GetNextSelectedItem(pos);
  483. m_List2.DeleteItem (iItem);
  484. int count=m_List2.GetItemCount ();
  485. if(count==0)return;
  486. if(iItem==count)
  487. iItem=0;
  488. m_List2.SetItemState (iItem, LVIS_SELECTED, LVIS_SELECTED);
  489. }
  490. void TXSPDlg::OnBUTspbox2()
  491. {
  492. // TODO: Add your control notification handler code here
  493. SPBox dlg;
  494. if(dlg.DoModal ()!=IDOK)return;
  495. int pos=m_List2.GetItemCount ();
  496. if(pos)
  497. {
  498. if(m_List2.GetItemText (pos-1, 0).IsEmpty ()&&m_List2.GetItemText (pos-1, 1).IsEmpty ()&&m_List2.GetItemText (pos-1, 2).IsEmpty ())
  499. {
  500. pos--;
  501. m_List2.SetItemText(pos,0, dlg.m_spid);
  502. m_List2.SetItemText(pos,1, GetSPNameFromId(dlg.m_spid));
  503. }
  504. else
  505. {
  506. m_List2.InsertItem(pos, dlg.m_spid);
  507. m_List2.SetItemText(pos,1, GetSPNameFromId(dlg.m_spid));
  508. }
  509. }
  510. else
  511. {
  512. m_List2.InsertItem(pos, dlg.m_spid);
  513. m_List2.SetItemText(pos,1, GetSPNameFromId(dlg.m_spid));
  514. }
  515. }
  516. void TXSPDlg::OnBUTclose2()
  517. {
  518. // TODO: Add your control notification handler code here
  519. GetParent()->SendMessage(WM_CLOSE);
  520. }