DrawWnd.cpp
上传用户:liuhua
上传日期:2022-07-19
资源大小:27k
文件大小:5k
源码类别:

屏幕保护

开发平台:

Visual C++

  1. // DrawWnd.cpp : implementation file
  2. // Download by http://www.codefans.net
  3. #include "stdafx.h"
  4. #include "ScreenSavePrograme.h"
  5. #include "DrawWnd.h"
  6. /////////////////MY code starts here
  7. #include <stdlib.h>
  8. #include <time.h>
  9. #include <math.h>
  10. #include <stdio.h>
  11.  
  12. #define attract  0.0001   //吸引子灵敏度  
  13. #define MaxColor 16 //最大颜色数‘
  14. #define  zoom 2.0  
  15. #define MaxY  800
  16. /////////////////my codes end here
  17. #ifdef _DEBUG
  18. #define new DEBUG_NEW
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22. /////////////////////////////////////////////////////////////////////////////
  23. // CDrawWnd
  24. LPCTSTR CDrawWnd::m_lpszClassName=NULL;
  25. CDrawWnd::CDrawWnd()
  26. {
  27. p=0.576;
  28. q=0.09;
  29. value=50;
  30. }
  31. CDrawWnd::~CDrawWnd()
  32. {
  33. }
  34. BEGIN_MESSAGE_MAP(CDrawWnd, CWnd)
  35. //{{AFX_MSG_MAP(CDrawWnd)
  36. ON_WM_CREATE()
  37. ON_WM_PAINT()
  38. ON_WM_TIMER()
  39. //}}AFX_MSG_MAP
  40. END_MESSAGE_MAP()
  41. /////////////////////////////////////////////////////////////////////////////
  42. // CDrawWnd message handlers
  43. BOOL CDrawWnd::Create(DWORD dwExStyle, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
  44. {
  45. // TODO: Add your specialized code here and/or call the base class
  46.     // Register a class with no cursor
  47. if (m_lpszClassName == NULL)
  48. {
  49.      m_lpszClassName = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,
  50. ::LoadCursor(AfxGetResourceHandle(), 
  51. MAKEINTRESOURCE(IDC_NULLCURSOR)));
  52. }
  53. m_nSize=rect;
  54. // TODO: Add your specialized code here and/or call the base class
  55. return CreateEx(dwExStyle, m_lpszClassName, _T(""), dwStyle, 
  56. rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, 
  57. pParentWnd->GetSafeHwnd(), NULL, NULL );
  58. //return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
  59. }
  60. int CDrawWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  61. {
  62. if (CWnd::OnCreate(lpCreateStruct) == -1)
  63. return -1;
  64. /////////My code starts here
  65. int nSpeed = AfxGetApp()->GetProfileInt("Config", "Speed", 50);
  66. SetSpeed(nSpeed);
  67. // TODO: Add your specialized creation code here
  68. return 0;
  69. }
  70. void CDrawWnd::OnPaint() 
  71. {
  72. CPaintDC dc(this); // device context for painting
  73.  /*  */
  74. Draw(dc);
  75. // TODO: Add your message handler code here
  76. // Do not call CWnd::OnPaint() for painting messages
  77. }
  78. void CDrawWnd::OnTimer(UINT nIDEvent) 
  79. {
  80. // TODO: Add your message handler code here and/or call default
  81. // if(MapRand(2)<1)
  82. {
  83. draw=0;
  84. if(MapRand(1)<=0.5)
  85.  {
  86.     p=double(MapRand(2)/1.034);
  87. if(MapRand(1)<0.5)
  88.              { 
  89.   q=double(MapRand(2)/1.0834);
  90.   } 
  91.  
  92. else if(MapRand(1)>=0.5)
  93. { q=double(MapRand(2)/1.0345);
  94.  q=-q;
  95. }
  96. }
  97. else if(MapRand(1)>0.5)
  98. {     p=double(MapRand(2)/1.034);
  99.        p=-p;
  100. if(MapRand(1)<0.5)
  101.              { 
  102.   q=double(MapRand(2)/1.0834);
  103.   } 
  104.  
  105. else if(MapRand(1)>=0.5)
  106. { q=double(MapRand(2)/1.0345);
  107.  q=-q;
  108. }
  109. }
  110. }
  111. /* else if(MapRand(2)>=1)
  112. {
  113. draw=1;
  114. a[0]=0.0+MapRand(1)/2.0;a[1]=0.85;a[2]=0.2;a[3]=-0.15;
  115. b[0]=0 ;b[1]=0.04+MapRand(1)/2.0;b[2]=-0.26 ;b[3]=0.28 ;
  116. c[0]=0 ;c[1]=-0.04 +MapRand(1)/2.0;c[2]=0.23 ;c[3]=0.26 ;
  117. d[0]=0.16+MapRand(1)/2.0 ;d[1]=0.85 ;d[2]=0.22 ;d[3]=0.24 ;
  118. e[0]=0+MapRand(1)/2.0;e[1]=0 ;e[2]=0 ;e[3]=0 ;
  119. f[0]=0+MapRand(1)/2.0 ;f[1]=1.6 ;f[2]=1.6 ;f[3]=0.44 ;
  120. pp[0]=0.01+MapRand(1)/20.0;pp[1]=0.85;pp[2]=0.07+MapRand(1)/20.0;pp[3]=0.07;
  121. stepx=15;
  122. stepy=15;
  123. totalsteps=32000;
  124. m_pColor=RGB(MapRand(250),MapRand(255),MapRand(255));
  125. m_N=4;
  126. }*/
  127.          
  128.    Invalidate();
  129. // CClientDC dc(this);
  130. // CDC& dc;
  131. // draw(dc);
  132.   CWnd::OnTimer(nIDEvent);
  133. }
  134. double CDrawWnd::MapRand(double nMax)
  135. {
  136.  
  137.  int nRand =rand();
  138.  double fMap=double(nRand)/RAND_MAX;
  139.  double nRetVal=fMap*nMax+0.5f;
  140.  return  nRetVal;
  141. }
  142. void CDrawWnd::Draw(CDC &dc)
  143. {
  144. //
  145. if(draw==0)
  146. {
  147. int i,j;int k;
  148.     double x1=MapRand(2);
  149. double x2=MapRand(2);
  150. scale=float(2.0*zoom/MaxY);//坐标转换
  151. for (i=0;i<MaxY;i++)
  152. {
  153. for(j=0;j<MaxY;j++)
  154. {
  155. x[0]=float(scale*i-zoom);//初始值变换
  156. y[0]=float(zoom-scale*j);
  157. k=0;
  158. mag=0;
  159.              while((mag<100)&&(k<MaxColor*2)) 
  160. {
  161.     x[k+1]=x[k]*x[k]-y[k]*y[k]+p;//复数的平方
  162.   y[k+1]=2*x[k]*y[k]+q;
  163.  
  164. mag= x[k+1]*x[k+1]+y[k+1]*y[k+1];//复数模的平方
  165. k=k+1;
  166. }
  167.        if((k==MaxColor*2)||(mag>100))//发散速度不同用不同的颜色来绘制
  168.    {
  169.            dc.SetPixel(i ,(j-150),RGB(int(k*value/x1),int(k*value),int(k*value/x2)));
  170.    }
  171. }
  172. }
  173. }
  174. if(draw==1)
  175. {
  176.  CBrush brush(RGB(0,0,0));
  177.   CRect rect;
  178.   GetClientRect(rect);
  179.   dc.FillRect(&rect,&brush);
  180.      for(i=1;i<m_N;i++)
  181. {
  182. pp[i]=pp[i]+pp[i-1];
  183. }
  184. double xj;//,m;
  185. xx=0;yy=0;
  186. // srand(unsigned(time(NULL)));
  187. for(i=0;i<totalsteps;i++)
  188. {  
  189.  // m=float(rand());
  190.   //xj=float(m/RAND_MAX);
  191.   xj=MapRand(1);
  192. if(xj<=pp[0]) k=0;
  193. if((xj>pp[0])&&(xj<=pp[1])) k=1;
  194. if((xj>pp[1])&&(xj<=pp[2])) k=2;
  195. if((xj>pp[2])&&(xj<=pp[3])) k=3;
  196. if((xj>pp[3])&&(xj<=pp[4]))k=4;
  197. if((xj>pp[4])&&(xj<=pp[5])) k=5;
  198. if((xj>pp[5])&&(xj<=pp[6]))k=6;
  199. if((xj>pp[6]) &&(xj<=pp[7]))k=7; 
  200.                 xx=a[k]*xx+b[k]*yy+e[k];
  201. yy=c[k]*xx+d[k]*yy+f[k];
  202. if(i>10)
  203. dc.SetPixel(int(MaxY*xx/stepx+MaxY/2 ) , MaxY-int(MaxY*yy/stepy+30)-100 ,m_pColor);
  204. }
  205. }
  206. }
  207. void CDrawWnd::SetSpeed(int nSpeed)
  208. {
  209. KillTimer(1);
  210. VERIFY(SetTimer(1,50+500-nSpeed*5,NULL)!=0);
  211. }