MYWND.CPP
上传用户:trhysrzt
上传日期:2022-03-19
资源大小:9454k
文件大小:17k
源码类别:

屏幕保护

开发平台:

Visual C++

  1. // MyWnd.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ScreenSafe.h"
  5. #include "MyWnd.h"
  6. #include "Mmsystem.h"
  7. #include "math.h"
  8. // CMyWnd
  9. IMPLEMENT_DYNAMIC(CMyWnd, CWnd)
  10. CMyWnd::CMyWnd()
  11. {
  12. m_prePoint=CPoint(0,0);
  13. }
  14. LPCSTR CMyWnd::lpszClassName=NULL;
  15. CMyWnd::~CMyWnd()
  16. {
  17. }
  18. BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
  19. ON_WM_CREATE()
  20. ON_WM_TIMER()
  21. ON_WM_PAINT()
  22. ON_WM_KEYDOWN()
  23. ON_WM_SYSCOMMAND()
  24. ON_WM_DESTROY()
  25. ON_WM_LBUTTONDOWN()
  26. ON_WM_MOVE()
  27. END_MESSAGE_MAP()
  28. // CMyWnd message handlers
  29. bool CMyWnd::Create()
  30. {
  31. // TODO:  Add your specialized creation code here
  32. if(lpszClassName==NULL)
  33. {
  34. //注册类,IDC_NOCURSOR为新建的光标ID,这个光标没有任何图案
  35. lpszClassName=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,::LoadCursor(AfxGetResourceHandle(),
  36. MAKEINTRESOURCE(IDC_NOCURSOR)));
  37. }
  38. CRect rect(0,0,::GetSystemMetrics(SM_CXSCREEN),
  39. ::GetSystemMetrics(SM_CYSCREEN));
  40. //创建一个全屏的窗口
  41. CreateEx(WS_EX_TOPMOST,lpszClassName,_T(""),WS_VISIBLE|WS_POPUP,
  42. rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,
  43. GetSafeHwnd(),NULL,NULL);
  44. SetTimer(0,5000,NULL);//计时器
  45. return true;
  46. }
  47. void CMyWnd::OnTimer(UINT nIDEvent)
  48. {
  49. // TODO: Add your message handler code here and/or call default
  50. CClientDC dc(this);
  51. static nIndexBit=0;
  52. if(nIndexBit>=3)
  53. nIndexBit=0;
  54. DrawBitmap(dc,nIndexBit++);
  55. CWnd::OnTimer(nIDEvent);
  56. }
  57. void CMyWnd::DrawBitmap(CDC& dc, int nIndexBit)
  58. {
  59. CRect rect;
  60. GetClientRect(rect);
  61. //绘制图形
  62. CBitmap m_Bitmap;
  63. m_Bitmap.LoadBitmap(IDB_BITMAP1+nIndexBit);
  64. int rnd=rand();
  65. int i=rnd%7;
  66. switch(i)
  67. {
  68. case 0:
  69.         MasicWindow(&dc,&m_Bitmap,rect.left,rect.top,rect.Width(),rect.Height());
  70. break;
  71. case 1:
  72. MoveDown(&dc,&m_Bitmap,rect.left,rect.top,rect.Width(),rect.Height());
  73. break;
  74. case 2:
  75. MoveUp(&dc,&m_Bitmap,rect.left,rect.top,rect.Width(),rect.Height());
  76. break;
  77. case 3:
  78.         BlindWindow(&dc,&m_Bitmap,rect.left,rect.top,rect.Width(),rect.Height());
  79. break;
  80. case 4:
  81. ScanRight(&dc,&m_Bitmap,rect.left,rect.top,rect.Width(),rect.Height());
  82. break;
  83. case 5:
  84. ScanDown(&dc,&m_Bitmap,rect.left,rect.top,rect.Width(),rect.Height());
  85. break;
  86. case 6:
  87. StripWindow(&dc,&m_Bitmap,rect.left,rect.top,rect.Width(),rect.Height());
  88. break;
  89. }
  90. }
  91. void CMyWnd::OnPaint()
  92. {
  93. CPaintDC dc(this); // device context for painting
  94. // TODO: Add your message handler code here
  95. CBrush brush(RGB(0,0,0));
  96. CRect rect1;
  97. GetClientRect(rect1);
  98. dc.FillRect(&rect1,&brush);
  99. OnTimer(0);
  100. }
  101. void CMyWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
  102. {
  103. // TODO: Add your message handler code here and/or call default
  104. PostMessage(WM_CLOSE);
  105. CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
  106. }
  107. void CMyWnd::OnSysCommand(UINT nID, LPARAM lParam)
  108. {
  109. // TODO: Add your message handler code here and/or call default
  110. CWnd::OnSysCommand(nID, lParam);
  111. }
  112. BOOL CMyWnd::PreCreateWindow(CREATESTRUCT& cs)
  113. {
  114. // TODO: Add your specialized code here and/or call the base class
  115. return CWnd::PreCreateWindow(cs);
  116. }
  117. void CMyWnd::OnDestroy()
  118. {
  119. CWnd::OnDestroy();
  120. // TODO: Add your message handler code here
  121. }
  122. ///////////////////////////////////////////////
  123. //特效,向下逐行显示
  124. //nLeft, nTop      //显示区域的左上角坐标
  125. //nWidth, nHeight        //显示区域的宽、高
  126. //bmph,bmpw              //位图的高、宽
  127. //nStart            //显示区域上所处理块开始位置
  128. //nEnd             //显示区域上所处理块结束位置
  129. //nBlock            //所处理块的大小
  130. ///////////////////////////////////////////////
  131. void CMyWnd::ScanDown(CDC* pDC, CBitmap* pBmp, int nLeft, int nTop, int nWidth, int nHeight)
  132. {
  133. CBrush brush(RGB(0,0,0));
  134. CBrush* oldBrush=pDC->SelectObject(&brush);
  135. CPen pen(PS_SOLID,1,RGB(0,0,0));
  136. CPen* oldPen=pDC->SelectObject(&pen);
  137. pDC->Rectangle(0,0,nWidth,nHeight);
  138. //起始行的上下高度
  139. int nStart=0;
  140. int nEnd=25;
  141. BITMAP bmpinfo;
  142. CDC MemDC;
  143. CBitmap *oldBmp;
  144. MemDC.CreateCompatibleDC(pDC);
  145. oldBmp=MemDC.SelectObject(pBmp);
  146. pBmp->GetBitmap(&bmpinfo);
  147. int bmpw=bmpinfo.bmWidth;//位图的高、宽
  148. int bmph=bmpinfo.bmHeight;
  149. int nBlock=25;  //所处理块的大小
  150. int ddbEnd,ddbBlock,ddbStart;
  151. //下移
  152. for(nEnd=nBlock;nEnd<nHeight+nBlock;nEnd=nEnd+nBlock)
  153. {
  154. ddbEnd=int(nEnd*bmph/nHeight); //位图上所处理块结束位置
  155. ddbBlock=int(nBlock*bmph/nHeight);//位图上所处理块的大小
  156. ddbStart=int(nStart*bmph/nHeight);//位图上所处理块开始位置
  157. pDC->StretchBlt(nLeft,nStart,
  158.         nWidth,nBlock,
  159. &MemDC,
  160. 0,ddbStart,
  161. bmpw,ddbBlock,
  162. SRCCOPY);
  163. nStart=nEnd;
  164. WaitTime(100);
  165. }
  166. WaitTime(3000);
  167. oldBrush=pDC->SelectObject(&brush);
  168. oldPen=pDC->SelectObject(&pen);
  169. pDC->SelectObject(oldBrush);
  170. pDC->SelectObject(oldPen);
  171. }
  172. ///////////////////////////////////////////////
  173. //特效,向右逐行显示
  174. //nLeft, nTop      //显示区域的左上角坐标
  175. //nWidth, nHeight        //显示区域的宽、高
  176. //bmph,bmpw              //位图的高、宽
  177. //nStart            //显示区域上所处理块开始位置
  178. //nEnd             //显示区域上所处理块结束位置
  179. //nBlock            //所处理块的大小
  180. ///////////////////////////////////////////////
  181. void CMyWnd::ScanRight(CDC* pDC, CBitmap* pBmp, int nLeft, int nTop, int nWidth, int nHeight)
  182. {
  183. CBrush brush(RGB(0,0,0));
  184. CBrush* oldBrush=pDC->SelectObject(&brush);
  185. CPen pen(PS_SOLID,1,RGB(0,0,0));
  186. CPen* oldPen=pDC->SelectObject(&pen);
  187. pDC->Rectangle(0,0,nWidth,nHeight);
  188. //起始行的上下高度
  189. int nStart=0;
  190. int nEnd=25;
  191. BITMAP bmpinfo;
  192. CDC MemDC;
  193. CBitmap *oldBmp;
  194. MemDC.CreateCompatibleDC(pDC);
  195. oldBmp=MemDC.SelectObject(pBmp);
  196. pBmp->GetBitmap(&bmpinfo);
  197. int bmpw=bmpinfo.bmWidth;//位图的高、宽
  198. int bmph=bmpinfo.bmHeight;
  199. int nBlock=25;  //所处理块的大小
  200. int ddbEnd,ddbBlock,ddbStart;
  201. //下移
  202. for(nEnd=nBlock;nEnd<nWidth+nBlock;nEnd=nEnd+nBlock)
  203. {
  204. ddbEnd=int(nEnd*bmpw/nWidth);//位图上所处理块结束位置
  205. ddbBlock=int(nBlock*bmpw/nWidth);//位图上所处理块的大小
  206. ddbStart=int(nStart*bmpw/nWidth);//位图上所处理块开始位置
  207. pDC->StretchBlt(nStart,nTop,
  208.             nBlock,nHeight,
  209. &MemDC,
  210. ddbStart,0,
  211. ddbBlock,bmph,
  212. SRCCOPY);
  213. nStart=nEnd;
  214. WaitTime(100);
  215. }
  216. WaitTime(1000);
  217. oldBrush=pDC->SelectObject(&brush);
  218. oldPen=pDC->SelectObject(&pen);
  219. pDC->SelectObject(oldBrush);
  220. pDC->SelectObject(oldPen);
  221. }
  222. ///////////////////////////////////////////////
  223. //MoveDown 特效,向下移动显示
  224. //nLeft, nTop      //显示区域的左上角坐标
  225. //nWidth, nHeight        //显示区域的宽、高
  226. //bmph,bmpw              //位图的高、宽
  227. //nStart            //显示区域上所处理块开始位置
  228. //nEnd             //显示区域上所处理块结束位置
  229. //nBlock            //所处理块的大小
  230. ///////////////////////////////////////////////
  231. void CMyWnd::MoveDown(CDC* pDC, CBitmap* pBmp, int nLeft, int nTop, int nWidth, int nHeight)
  232. {
  233. CBrush brush(RGB(0,0,0));
  234. CBrush* oldBrush=pDC->SelectObject(&brush);
  235. CPen pen(PS_SOLID,1,RGB(0,0,0));
  236. CPen* oldPen=pDC->SelectObject(&pen);
  237. pDC->Rectangle(0,0,nWidth,nHeight);
  238. //起始行的上下高度
  239. int nStart=0;
  240. int nEnd=25;
  241. BITMAP bmpinfo;
  242. CDC MemDC;
  243. CBitmap *oldBmp;
  244. MemDC.CreateCompatibleDC(pDC);
  245. oldBmp=MemDC.SelectObject(pBmp);
  246. pBmp->GetBitmap(&bmpinfo);
  247. int bmpw=bmpinfo.bmWidth;//位图的高、宽
  248. int bmph=bmpinfo.bmHeight;
  249. int nBlock=25;  //所处理块的大小
  250. //下移
  251. for(int i=0;i<nHeight+nBlock;i=i+nBlock)
  252. {
  253. int ddbi=int(i*bmph/nHeight);
  254. pDC->StretchBlt(nLeft,nTop,
  255. nWidth,i,
  256. &MemDC,
  257. 0,bmph-ddbi,
  258. bmpw,ddbi,
  259. SRCCOPY);
  260. WaitTime(100);
  261. }
  262. WaitTime(1000);
  263. //清除
  264. for(int j=0;j<=nHeight;j++)
  265. {
  266. pDC->Rectangle(0,j,nWidth,0);
  267. }
  268. pDC->SelectObject(oldBrush);
  269. pDC->SelectObject(oldPen);
  270. }
  271. ///////////////////////////////////////////////
  272. //MoveUp 特效,向上移动显示
  273. //nLeft, nTop      //显示区域的左上角坐标
  274. //nWidth, nHeight        //显示区域的宽、高
  275. //bmph,bmpw              //位图的高、宽
  276. //nStart            //显示区域上所处理块开始位置
  277. //nEnd             //显示区域上所处理块结束位置
  278. //nBlock            //所处理块的大小
  279. ///////////////////////////////////////////////
  280. void CMyWnd::MoveUp(CDC* pDC, CBitmap* pBmp, int nLeft, int nTop, int nWidth, int nHeight)
  281. {
  282. CBrush brush(RGB(0,0,0));
  283. CBrush* oldBrush=pDC->SelectObject(&brush);
  284. CPen pen(PS_SOLID,1,RGB(0,0,0));
  285. CPen* oldPen=pDC->SelectObject(&pen);
  286. pDC->Rectangle(0,0,nWidth,nHeight);
  287. //起始行的上下高度
  288. int nStart=0;
  289. int nEnd=25;
  290. BITMAP bmpinfo;
  291. CDC MemDC;
  292. CBitmap *oldBmp;
  293. MemDC.CreateCompatibleDC(pDC);
  294. oldBmp=MemDC.SelectObject(pBmp);
  295. pBmp->GetBitmap(&bmpinfo);
  296. int bmpw=bmpinfo.bmWidth;//位图的高、宽
  297. int bmph=bmpinfo.bmHeight;
  298. int nBlock=25;  //所处理块的大小
  299. for(int i=0;i<nHeight+nBlock;i=i+nBlock)
  300. {
  301. int ddbi=int(i*bmph/nHeight);
  302. pDC->StretchBlt(nLeft,nHeight-i,
  303. nWidth,i,
  304. &MemDC,
  305. 0,0,
  306. bmpw,ddbi,
  307. SRCCOPY);
  308. WaitTime(100);
  309. }
  310. WaitTime(1000);
  311. //清除
  312. for(int j=0;j<=nHeight;j++)
  313. {
  314. pDC->Rectangle(0,nHeight-j,nWidth,nHeight);
  315. }
  316. pDC->SelectObject(oldBrush);
  317. pDC->SelectObject(oldPen);
  318. }
  319. ///////////////////////////////////////////////
  320. //BlindWindow 特效,百叶窗显示
  321. //nLeft, nTop      //显示区域的左上角坐标
  322. //nWidth, nHeight        //显示区域的宽、高
  323. //bmph,bmpw              //位图的高、宽
  324. //nStart            //显示区域上所处理块开始位置
  325. //nEnd             //显示区域上所处理块结束位置
  326. //nBlock            //所处理块的大小
  327. //nScanLine //条纹数
  328. ///////////////////////////////////////////////
  329. void CMyWnd::BlindWindow(CDC* pDC, CBitmap* pBmp, int nLeft, int nTop, int nWidth, int nHeight)
  330. {
  331. CBrush brush(RGB(0,0,0));
  332. CBrush* oldBrush=pDC->SelectObject(&brush);
  333. CPen pen(PS_SOLID,1,RGB(0,0,0));
  334. CPen* oldPen=pDC->SelectObject(&pen);
  335. pDC->Rectangle(0,0,nWidth,nHeight);
  336. //起始行的上下高度
  337. int nStart=0;
  338. int nEnd=25;
  339. BITMAP bmpinfo;
  340. CDC MemDC;
  341. CBitmap *oldBmp;
  342. MemDC.CreateCompatibleDC(pDC);
  343. oldBmp=MemDC.SelectObject(pBmp);
  344. pBmp->GetBitmap(&bmpinfo);
  345. int bmpw=bmpinfo.bmWidth;//位图的高、宽
  346. int bmph=bmpinfo.bmHeight;
  347. int nBlock=25;  //所处理块的大小
  348. int nScanLine=20;
  349. int temp,temp1;
  350. if(bmpw>nWidth)
  351. {
  352. if(fmod(bmpw,nWidth)!=0)
  353. temp=int(bmpw/nWidth)+1;
  354. else
  355. temp=int(bmpw/nWidth);
  356. temp1=1;
  357. }
  358. else
  359. {
  360. if(fmod(nWidth,bmpw)!=0)
  361. temp1=int(nWidth/bmpw)+1;
  362. else
  363. temp1=int(nWidth/bmpw);
  364. temp=1;
  365. }
  366. for(int i=0;i<nScanLine;++i)
  367. {
  368. for(int j=i;j<nWidth;j=j+nScanLine)
  369. {
  370. pDC->StretchBlt(j,0,
  371. temp1,nHeight,
  372. &MemDC,
  373. j*bmpw/nWidth,0,
  374. temp,bmph,
  375. SRCCOPY);
  376. }
  377. WaitTime(100);
  378. }
  379. WaitTime(1000);
  380. for(int i=0;i<nScanLine;++i)
  381. {
  382. for(int j=i;j<nWidth;j=j+nScanLine)
  383. {
  384. pDC->Rectangle(j,0,j+1,nHeight);
  385. }
  386. WaitTime(100);
  387. }
  388. pDC->SelectObject(oldBrush);
  389. pDC->SelectObject(oldPen);
  390. }
  391. ///////////////////////////////////////////////
  392. //StripWindow 特效,栅条显示
  393. //nLeft, nTop      //显示区域的左上角坐标
  394. //nWidth, nHeight        //显示区域的宽、高
  395. //bmph,bmpw              //位图的高、宽
  396. //nStart            //显示区域上所处理块开始位置
  397. //nEnd             //显示区域上所处理块结束位置
  398. //nBlock            //所处理块的大小
  399. //nScanLine //条纹数
  400. ///////////////////////////////////////////////
  401. void CMyWnd::StripWindow(CDC* pDC, CBitmap* pBmp, int nLeft, int nTop, int nWidth, int nHeight)
  402. {
  403. CBrush brush(RGB(0,0,0));
  404. CBrush* oldBrush=pDC->SelectObject(&brush);
  405. CPen pen(PS_SOLID,1,RGB(0,0,0));
  406. CPen* oldPen=pDC->SelectObject(&pen);
  407. pDC->Rectangle(0,0,nWidth,nHeight);
  408. //起始行的上下高度
  409. int nStart=0;
  410. int nEnd=25;
  411. BITMAP bmpinfo;
  412. CDC MemDC;
  413. CBitmap *oldBmp;
  414. MemDC.CreateCompatibleDC(pDC);
  415. oldBmp=MemDC.SelectObject(pBmp);
  416. pBmp->GetBitmap(&bmpinfo);
  417. int bmpw=bmpinfo.bmWidth;//位图的高、宽
  418. int bmph=bmpinfo.bmHeight;
  419. int nBlock=25;  //所处理块的大小
  420. int nScanLine=20;
  421. double wScale=(double)bmpw/(double)nWidth;
  422. double hScale=(double)bmph/(double)nHeight;
  423. for(int i=0;i<nHeight+1;i=i+10)
  424. {
  425. for(int j=0;j<nWidth;j=j+2*nScanLine)
  426. {
  427. pDC->StretchBlt(j,0,
  428. nScanLine,i+1,
  429. &MemDC,
  430. (int)(j*wScale),0,
  431. (int)(nScanLine*wScale),(int)(hScale*(i+1)),
  432. SRCCOPY);
  433. int k=j+nScanLine;
  434. pDC->StretchBlt(k,nHeight-i,
  435. nScanLine,i,
  436. &MemDC,
  437. (int)(k*wScale),(int)((nHeight-i)*hScale),
  438. (int)(nScanLine*wScale),(int)(i*hScale),
  439. SRCCOPY);
  440. }
  441. }
  442. WaitTime(1000);
  443. for(int i=0;i<nHeight+1;i=i+10)
  444. {
  445. for(int j=0;j<nWidth;j=j+2*nScanLine)
  446. {
  447. pDC->StretchBlt(j,i,
  448. nScanLine,nHeight-i,
  449. &MemDC,
  450. (int)(j*wScale),(int)(i*hScale),
  451. (int)(nScanLine*wScale),(int)(hScale*(nHeight-i)),
  452. SRCCOPY);
  453. pDC->Rectangle(j,i-1,j+nScanLine,i-11);
  454. int k=j+nScanLine;
  455. pDC->StretchBlt(k,0,nScanLine,nHeight-i,
  456. &MemDC,
  457. (int)(k*wScale),0,
  458. (int)(nScanLine*wScale),
  459. (int)((nHeight-i)*hScale),
  460. SRCCOPY);
  461. pDC->Rectangle(k,nHeight-i,k+nScanLine,nHeight-i+10);
  462. }
  463. }
  464. pDC->SelectObject(oldBrush);
  465. pDC->SelectObject(oldPen);
  466. }
  467. ///////////////////////////////////////////////
  468. //MasicWindow 特效,马赛克显示
  469. //nLeft, nTop      //显示区域的左上角坐标
  470. //nWidth, nHeight        //显示区域的宽、高
  471. //bmph,bmpw              //位图的高、宽
  472. //nStart            //显示区域上所处理块开始位置
  473. //nEnd             //显示区域上所处理块结束位置
  474. //nBlock            //所处理块的大小
  475. //nScanLine //条纹数
  476. ///////////////////////////////////////////////
  477. void CMyWnd::MasicWindow(CDC* pDC, CBitmap* pBmp, int nLeft, int nTop, int nWidth, int nHeight)
  478. {
  479. CBrush brush(RGB(0,0,0));
  480. CBrush* oldBrush=pDC->SelectObject(&brush);
  481. CPen pen(PS_SOLID,1,RGB(0,0,0));
  482. CPen* oldPen=pDC->SelectObject(&pen);
  483. pDC->Rectangle(0,0,nWidth,nHeight);
  484. //起始行的上下高度
  485. int nStart=0;
  486. int nEnd=25;
  487. BITMAP bmpinfo;
  488. CDC MemDC;
  489. CBitmap *oldBmp;
  490. MemDC.CreateCompatibleDC(pDC);
  491. oldBmp=MemDC.SelectObject(pBmp);
  492. pBmp->GetBitmap(&bmpinfo);
  493. int bmpw=bmpinfo.bmWidth;//位图的高、宽
  494. int bmph=bmpinfo.bmHeight; //源位图的尺寸
  495. int nBlock=25;  //所处理块的大小
  496. int nScanLine=20;
  497. int nDividedSize=75;
  498. int nWidthAppend=0;
  499. int nHeightAppend=0;
  500. //如果不能整除,横纵方块的数量要加1
  501. if((nWidth%nDividedSize)!=0)
  502. nWidthAppend=1;
  503. if((nHeight%nDividedSize)!=0)
  504. nHeightAppend=1;
  505. //划分的方块数量
  506. long lDividedNum=(nWidth/nDividedSize+nWidthAppend)*(nHeight/nDividedSize+nHeightAppend);
  507. //申请数组,存储方块的坐标
  508. POINT *point=new POINT[lDividedNum];
  509. //为数组赋值的临时变量
  510. long mx=0; 
  511. long my=0; 
  512. double wScale=(double)bmpw/(double)nWidth;//
  513. double hScale=(double)bmph/(double)nHeight;//
  514. //为数组赋值
  515. for(long mi=0;mi<lDividedNum;mi++)
  516. {
  517. point[mi].x=mx;
  518. point[mi].y=my;
  519. mx=mx+nDividedSize;
  520. if(mx>nWidth)
  521. {
  522. mx=0;
  523. my=my+nDividedSize;
  524. }
  525. }
  526. //RAND_MAX是系统定义的最大随机数,是0x7fff,即32767
  527. double fmax=RAND_MAX;
  528. for(mi=lDividedNum-1;mi>=0;mi--)
  529. {
  530. //产生随机数
  531. int randNum=rand();
  532. //计算要随机显示的方块
  533. int n=(int)((double)randNum*(double)lDividedNum/fmax);
  534. //得到此方块的位置
  535. mx=point[n].x;
  536. my=point[n].y;
  537. //随机显示方块
  538. pDC->StretchBlt(mx, my,
  539.        nDividedSize, nDividedSize,
  540.    &MemDC,
  541.        (int)(mx*wScale), 
  542.        (int)((my+nDividedSize)*hScale),
  543.        (int)(nDividedSize*wScale), 
  544.        (int)(nDividedSize*hScale),
  545.    SRCCOPY);
  546. WaitTime(100);
  547. //将显示过的方块设置标志,以补充绘制
  548. point[n].x=-1;
  549. point[n].y=-1;
  550. }
  551. //补充绘制上面没有绘制到的方块
  552. for(mi=lDividedNum-1;mi>=0;mi--)
  553. {
  554. if(point[mi].x!=-1&&point[mi].y!=-1)
  555. {
  556. mx=point[mi].x;
  557. my=point[mi].y;
  558. pDC->StretchBlt(mx, my,
  559.        nDividedSize, nDividedSize,
  560.        &MemDC,
  561.        (int)(mx*wScale), 
  562.        (int)((my+nDividedSize)*hScale), 
  563.        (int)(nDividedSize*wScale), 
  564.        (int)(nDividedSize*hScale),
  565.    SRCCOPY);
  566. }
  567. }
  568. delete []point;
  569. WaitTime(1000);
  570. //清除
  571. POINT *erasePoint=new POINT[lDividedNum];
  572. mx=0; 
  573. my=0; 
  574. for(mi=0;mi<lDividedNum;mi++)
  575. {
  576. erasePoint[mi].x=mx;
  577. erasePoint[mi].y=my;
  578. mx=mx+nDividedSize;
  579. if(mx>nWidth)
  580. {
  581. mx=0;
  582. my=my+nDividedSize;
  583. }
  584. }
  585. //利用随机数清除
  586. for(mi=lDividedNum-1;mi>=0;mi--)
  587. {
  588. int randNum=rand();
  589. int n=(int)((double)randNum*(double)lDividedNum/fmax);
  590. mx=erasePoint[n].x;
  591. my=erasePoint[n].y;
  592. pDC->Rectangle(mx,my,mx+nDividedSize,my+nDividedSize);
  593. WaitTime(1);
  594. erasePoint[n].x=-1;//设置标志
  595. erasePoint[n].y=-1;
  596. }
  597. for(mi=lDividedNum-1;mi>=0;mi--)//补充绘制
  598. {
  599. if(erasePoint[mi].x!=-1&&erasePoint[mi].y!=-1)
  600. {
  601. mx=erasePoint[mi].x;
  602. my=erasePoint[mi].y;
  603. pDC->Rectangle(mx,my,mx+nDividedSize,my+nDividedSize);
  604. }
  605. }
  606. delete []erasePoint;
  607. }
  608. void CMyWnd::WaitTime(int nDelay)
  609. {//延时一定的时间
  610. int nBegin,nEnd;
  611. nBegin=timeGetTime();
  612. do
  613. {
  614. nEnd=timeGetTime();
  615. }while(nEnd-nBegin<nDelay);
  616. }
  617. void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point)
  618. {
  619. // TODO: Add your message handler code here and/or call default
  620. PostMessage(WM_CLOSE);
  621. CWnd::OnLButtonDown(nFlags, point);
  622. }
  623. void CMyWnd::OnMove(int x, int y)
  624. {
  625. CWnd::OnMove(x, y);
  626. PostMessage(WM_CLOSE);
  627. // TODO: Add your message handler code here
  628. }