SportSportDlg.cpp
上传用户:qzzxgm
上传日期:2009-12-14
资源大小:1882k
文件大小:6k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // SportSportDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "SportSport.h"
  5. #include "SportSportDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. struct EditAndNO
  12. {
  13. CEdit *pEdit; //编辑框对象指针
  14. int iNO; //编辑框值
  15. };
  16. HANDLE *g_hThread=NULL; //保存所有线程
  17. HANDLE g_hEvent; //事件对象
  18. int *g_iRand=NULL; //保存随机数
  19. EditAndNO *g_pEAN=NULL; //保存所有EditAndNO结构对象
  20. int *g_piNumNum=NULL; //编辑框个数
  21. DWORD CALLBACK GenerateRand(LPVOID pParam);
  22. DWORD CALLBACK NumberChange(LPVOID pParam);
  23. /////////////////////////////////////////////////////
  24. //生成随机数的线程
  25. DWORD CALLBACK GenerateRand(LPVOID pParam)
  26. {
  27. int l_iNum=*(int *)pParam,i;
  28. while(WaitForSingleObject(g_hEvent,5)==WAIT_TIMEOUT)
  29. {
  30. //生成随机数
  31. srand(rand());
  32. for(i=0;i<l_iNum;i++)
  33. *(g_iRand+i)=rand()%10;
  34. }
  35. return 1;
  36. }
  37. //更新编辑框数字的线程
  38. DWORD CALLBACK NumberChange(LPVOID pParam)
  39. {
  40. EditAndNO *l_pEAN=(EditAndNO *)pParam;
  41. CEdit *l_pEdit=l_pEAN->pEdit;
  42. int l_iNO=l_pEAN->iNO;
  43. char l_cNum[2];
  44. memset(l_cNum,0,sizeof(l_cNum));
  45. l_cNum[0]='0';
  46. while(WaitForSingleObject(g_hEvent,10)==WAIT_TIMEOUT)
  47. {
  48. itoa(g_iRand[l_iNO]%10,l_cNum,10);
  49. //改变文本框数字
  50. l_pEdit->SetWindowText((LPCTSTR)(l_cNum));
  51. l_pEdit->UpdateData(false);
  52. }
  53. return 1;
  54. }
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CSportSportDlg dialog
  57. CSportSportDlg::CSportSportDlg(CWnd* pParent /*=NULL*/)
  58. : CDialog(CSportSportDlg::IDD, pParent)
  59. {
  60. //{{AFX_DATA_INIT(CSportSportDlg)
  61. m_1 = 0;
  62. m_2 = 0;
  63. m_3 = 0;
  64. m_4 = 0;
  65. m_5 = 0;
  66. m_6 = 0;
  67. //}}AFX_DATA_INIT
  68. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  69. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  70. }
  71. void CSportSportDlg::DoDataExchange(CDataExchange* pDX)
  72. {
  73. CDialog::DoDataExchange(pDX);
  74. //{{AFX_DATA_MAP(CSportSportDlg)
  75. DDX_Text(pDX, IDC_EDIT1, m_1);
  76. DDX_Text(pDX, IDC_EDIT2, m_2);
  77. DDX_Text(pDX, IDC_EDIT3, m_3);
  78. DDX_Text(pDX, IDC_EDIT4, m_4);
  79. DDX_Text(pDX, IDC_EDIT5, m_5);
  80. DDX_Text(pDX, IDC_EDIT6, m_6);
  81. //}}AFX_DATA_MAP
  82. }
  83. BEGIN_MESSAGE_MAP(CSportSportDlg, CDialog)
  84. //{{AFX_MSG_MAP(CSportSportDlg)
  85. ON_WM_PAINT()
  86. ON_WM_QUERYDRAGICON()
  87. ON_BN_CLICKED(IDC_BUTTONSTOP, OnButtonstop)
  88. //}}AFX_MSG_MAP
  89. END_MESSAGE_MAP()
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CSportSportDlg message handlers
  92. BOOL CSportSportDlg::OnInitDialog()
  93. {
  94. CDialog::OnInitDialog();
  95. // Set the icon for this dialog.  The framework does this automatically
  96. //  when the application's main window is not a dialog
  97. SetIcon(m_hIcon, TRUE); // Set big icon
  98. SetIcon(m_hIcon, FALSE); // Set small icon
  99. // TODO: Add extra initialization here
  100. //设置“停止”按钮无效
  101. GetDlgItem(IDC_BUTTONSTOP)->EnableWindow(false);
  102. return TRUE;  // return TRUE  unless you set the focus to a control
  103. }
  104. // If you add a minimize button to your dialog, you will need the code below
  105. //  to draw the icon.  For MFC applications using the document/view model,
  106. //  this is automatically done for you by the framework.
  107. void CSportSportDlg::OnPaint() 
  108. {
  109. if (IsIconic())
  110. {
  111. CPaintDC dc(this); // device context for painting
  112. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  113. // Center icon in client rectangle
  114. int cxIcon = GetSystemMetrics(SM_CXICON);
  115. int cyIcon = GetSystemMetrics(SM_CYICON);
  116. CRect rect;
  117. GetClientRect(&rect);
  118. int x = (rect.Width() - cxIcon + 1) / 2;
  119. int y = (rect.Height() - cyIcon + 1) / 2;
  120. // Draw the icon
  121. dc.DrawIcon(x, y, m_hIcon);
  122. }
  123. else
  124. {
  125. CDialog::OnPaint();
  126. }
  127. }
  128. // The system calls this to obtain the cursor to display while the user drags
  129. //  the minimized window.
  130. HCURSOR CSportSportDlg::OnQueryDragIcon()
  131. {
  132. return (HCURSOR) m_hIcon;
  133. }
  134. //开始选号
  135. void CSportSportDlg::OnOK() 
  136. {
  137. CEdit *l_pEdit[6];
  138. unsigned long id;
  139. //创建事件对象
  140. g_hThread=new HANDLE[7];
  141. g_hEvent=CreateEvent(NULL,true,false,NULL);
  142. g_pEAN=new EditAndNO[6];
  143. g_iRand=new int[6];
  144. //开始生成随机数的线程
  145. g_piNumNum=new int;
  146. *g_piNumNum=6;
  147. g_hThread[6]=CreateThread(NULL,0,GenerateRand,(LPVOID)g_piNumNum,0,&id);
  148. //分别开始更新每个编辑框的线程
  149. l_pEdit[0]=(CEdit *)GetDlgItem(IDC_EDIT1);
  150. g_pEAN[0].pEdit=l_pEdit[0];
  151. g_pEAN[0].iNO=0;
  152. g_hThread[0]=CreateThread(NULL,0,NumberChange,(LPVOID)g_pEAN,0,&id);
  153. l_pEdit[1]=(CEdit *)GetDlgItem(IDC_EDIT2);
  154. g_pEAN[1].pEdit=l_pEdit[1];
  155. g_pEAN[1].iNO=1;
  156. g_hThread[1]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+1),0,&id);
  157. l_pEdit[2]=(CEdit *)GetDlgItem(IDC_EDIT3);
  158. g_pEAN[2].pEdit=l_pEdit[2];
  159. g_pEAN[2].iNO=2;
  160. g_hThread[2]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+2),0,&id);
  161. l_pEdit[3]=(CEdit *)GetDlgItem(IDC_EDIT4);
  162. g_pEAN[3].pEdit=l_pEdit[3];
  163. g_pEAN[3].iNO=3;
  164. g_hThread[3]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+3),0,&id);
  165. l_pEdit[4]=(CEdit *)GetDlgItem(IDC_EDIT5);
  166. g_pEAN[4].pEdit=l_pEdit[4];
  167. g_pEAN[4].iNO=4;
  168. g_hThread[4]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+4),0,&id);
  169. l_pEdit[5]=(CEdit *)GetDlgItem(IDC_EDIT6);
  170. g_pEAN[5].pEdit=l_pEdit[5];
  171. g_pEAN[5].iNO=5;
  172. g_hThread[5]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+5),0,&id);
  173. //更新按钮状态
  174. GetDlgItem(IDC_BUTTONSTOP)->EnableWindow(true);
  175. GetDlgItem(IDOK)->EnableWindow(false);
  176. GetDlgItem(IDCANCEL)->EnableWindow(false);
  177. }
  178. //停止选号
  179. void CSportSportDlg::OnButtonstop() 
  180. {
  181. //关闭所有线程
  182. SetEvent(g_hEvent);
  183. CloseHandle(g_hThread[0]);
  184. CloseHandle(g_hThread[1]);
  185. CloseHandle(g_hThread[2]);
  186. CloseHandle(g_hThread[3]);
  187. CloseHandle(g_hThread[4]);
  188. CloseHandle(g_hThread[5]);
  189. CloseHandle(g_hEvent);
  190. delete [] g_hThread;
  191. delete [] g_iRand;
  192. delete [] g_pEAN;
  193. delete [] g_piNumNum;
  194. //更新按钮状态
  195. GetDlgItem(IDC_BUTTONSTOP)->EnableWindow(false);
  196. GetDlgItem(IDOK)->EnableWindow(true);
  197. GetDlgItem(IDCANCEL)->EnableWindow(true);
  198. }