SpecialFxDlg.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. // SpecialFxDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "SpecialFx.h"
  5. #include "SpecialFxDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #endif
  9. // CSpecialFxDlg 对话框
  10. CSpecialFxDlg::CSpecialFxDlg(CWnd* pParent /*=NULL*/)
  11. : CDialog(CSpecialFxDlg::IDD, pParent)
  12. {
  13. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  14. m_bStop = FALSE;
  15. }
  16. void CSpecialFxDlg::DoDataExchange(CDataExchange* pDX)
  17. {
  18. CDialog::DoDataExchange(pDX);
  19. DDX_Control(pDX, IDC_CHECKWATER, m_chkWater);
  20. DDX_Control(pDX, IDC_CHECKFIRE, m_chkFire);
  21. DDX_Control(pDX, IDC_CHECKPLASMA, m_chkPlasma);
  22. DDX_Control(pDX, IDC_SLIDERFIREALPHA, m_sldrFire);
  23. DDX_Control(pDX, IDC_SLIDERPLASMAALPHA, m_sldrPlasma);
  24. }
  25. BEGIN_MESSAGE_MAP(CSpecialFxDlg, CDialog)
  26. ON_WM_PAINT()
  27. ON_WM_QUERYDRAGICON()
  28. //}}AFX_MSG_MAP
  29. ON_WM_MOUSEMOVE()
  30. ON_WM_LBUTTONDOWN()
  31. ON_WM_TIMER()
  32. ON_BN_CLICKED(IDC_CHECKWATER, OnBnClickedCheckwater)
  33. ON_BN_CLICKED(IDC_CHECKFIRE, OnBnClickedCheckfire)
  34. ON_BN_CLICKED(IDC_CHECKPLASMA, OnBnClickedCheckplasma)
  35. ON_BN_CLICKED(IDC_BUTTONANIMATE, OnBnClickedButtonanimate)
  36. ON_BN_CLICKED(IDC_BUTTONSTOP, OnBnClickedButtonstop)
  37. ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDERFIREALPHA, OnNMCustomdrawSliderfirealpha)
  38. ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDERPLASMAALPHA, OnNMCustomdrawSliderplasmaalpha)
  39. END_MESSAGE_MAP()
  40. // CSpecialFxDlg 消息处理程序
  41. BOOL CSpecialFxDlg::OnInitDialog()
  42. {
  43. CDialog::OnInitDialog();
  44. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  45. // 执行此操作
  46. SetIcon(m_hIcon, TRUE); // 设置大图标
  47. SetIcon(m_hIcon, FALSE); // 设置小图标
  48. // TODO: 在此添加额外的初始化代码
  49. /************************************************************************/
  50. CPictureHolder myTmpPicture;
  51. myTmpPicture.CreateFromBitmap(IDB_CODEPROJECTBMP);
  52. m_bmpRenderSource.Create32BitFromPicture(&myTmpPicture,402,120);
  53. m_bmpRenderTarget.Create32BitFromPicture(&myTmpPicture,402,120);
  54. // m_bmpRenderTarget.SetBitmap(IDB_CODEPROJECTBMP);// will be overwritten....
  55. // create water object
  56. m_myWater.Create(402,120);
  57. // come on baby light my fire.. (ok create our fire object)
  58. m_myFire.m_iAlpha = 30;// want a 30% alpha
  59. m_myFire.m_iHeight = 120;
  60. m_myFire.m_iWidth = 402;
  61. m_myFire.InitFire();
  62. m_sldrFire.SetRange(1,100,TRUE);
  63. m_sldrFire.SetPos(30);
  64. // finally the plasma
  65. m_myPlasma.Create(402,120);
  66. m_myPlasma.m_iAlpha = 30;// 30 % alpha
  67. m_sldrPlasma.SetRange(1,100,TRUE);
  68. m_sldrPlasma.SetPos(30);
  69. // set up the check boxes and our booleans
  70. m_bRunWater = TRUE;
  71. m_bRunFire = FALSE;
  72. m_bRunPlasma = FALSE;
  73. m_chkWater.SetCheck(TRUE);
  74. /************************************************************************/
  75. return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
  76. }
  77. // 如果向对话框添加最小化按钮,则需要下面的代码
  78. // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  79. // 这将由框架自动完成。
  80. void CSpecialFxDlg::OnPaint()
  81. {
  82. if (IsIconic())
  83. {
  84. CPaintDC dc(this); // 用于绘制的设备上下文
  85. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  86. // 使图标在工作矩形中居中
  87. int cxIcon = GetSystemMetrics(SM_CXICON);
  88. int cyIcon = GetSystemMetrics(SM_CYICON);
  89. CRect rect;
  90. GetClientRect(&rect);
  91. int x = (rect.Width() - cxIcon + 1) / 2;
  92. int y = (rect.Height() - cyIcon + 1) / 2;
  93. // 绘制图标
  94. dc.DrawIcon(x, y, m_hIcon);
  95. }
  96. else
  97. {
  98. CPaintDC dc(this);
  99. CPoint ptOrigin(15,20);
  100. m_bmpRenderTarget.Draw(&dc,ptOrigin);
  101. CDialog::OnPaint();
  102. }
  103. }
  104. //当用户拖动最小化窗口时系统调用此函数取得光标显示。
  105. HCURSOR CSpecialFxDlg::OnQueryDragIcon()
  106. {
  107. return static_cast<HCURSOR>(m_hIcon);
  108. }
  109. void CSpecialFxDlg::OnMouseMove(UINT nFlags, CPoint point)
  110. {
  111. // see if its in our picture...
  112. // ScreenToClient(&point);
  113. if ( m_bStop )
  114. return;
  115. CRect rcPicture;
  116. rcPicture.left = 15;
  117. rcPicture.top = 20;
  118. rcPicture.right = rcPicture.left + m_bmpRenderSource.GetWidth();
  119. rcPicture.bottom = rcPicture.top + m_bmpRenderSource.GetHeight();
  120. if(rcPicture.PtInRect(point) == TRUE)
  121. {
  122. // since dibs are drawn upside down we need to flip the y position (for it to look right)
  123. point.y -= 20;// offset from top of screen to image..
  124. point.y = 120-point.y;
  125. m_myWater.HeightBlob(point.x -15,point.y,5,50,m_myWater.m_iHpage);
  126. }
  127. CDialog::OnMouseMove(nFlags, point);
  128. }
  129. void CSpecialFxDlg::OnLButtonDown(UINT nFlags, CPoint point)
  130. {
  131. if ( m_bStop )
  132. return;
  133. CRect rcPicture;
  134. rcPicture.left = 15;
  135. rcPicture.top = 20;
  136. rcPicture.right = rcPicture.left + m_bmpRenderSource.GetWidth();
  137. rcPicture.bottom = rcPicture.top + m_bmpRenderSource.GetHeight();
  138. if(rcPicture.PtInRect(point) == TRUE)
  139. {
  140. // since dibs are drawn upside down we need to flip the y position (for it to look right)
  141. point.y -= 20;// offset from top of screen to image..
  142. point.y = 120-point.y;
  143. // ;
  144. m_myWater.HeightBlob(point.x-15,point.y,50,500,m_myWater.m_iHpage);
  145. }
  146. CDialog::OnLButtonDown(nFlags, point);
  147. }
  148. // 如何使波纹不在OnTimer内实现;
  149. void CSpecialFxDlg::OnTimer(UINT nIDEvent)
  150. {
  151. if(nIDEvent == 1971)
  152. {
  153. // if ( m_bStop )
  154. // return;
  155. if(!m_bRunWater)
  156. m_myWater.FlattenWater();// flatten it so it appears we turned it off...
  157. m_myWater.Render((DWORD*)m_bmpRenderSource.GetDIBits(),(DWORD*)m_bmpRenderTarget.GetDIBits());
  158. if(m_bRunFire)
  159. m_myFire.Render((DWORD*)m_bmpRenderTarget.GetDIBits(),402,120);
  160. if(m_bRunPlasma)
  161. m_myPlasma.Render((DWORD*)m_bmpRenderTarget.GetDIBits(),402,120,402);
  162. CClientDC dc(this);
  163. CPoint ptOrigin(15,20);
  164. m_bmpRenderTarget.Draw(&dc,ptOrigin);
  165. }
  166. CDialog::OnTimer(nIDEvent);
  167. }
  168. void CSpecialFxDlg::OnBnClickedCheckwater()
  169. {
  170. m_bRunWater = m_chkWater.GetCheck();
  171. }
  172. void CSpecialFxDlg::OnBnClickedCheckfire()
  173. {
  174. m_bRunFire = m_chkFire.GetCheck();
  175. }
  176. void CSpecialFxDlg::OnBnClickedCheckplasma()
  177. {
  178. m_bRunPlasma = m_chkPlasma.GetCheck();
  179. }
  180. void CSpecialFxDlg::OnBnClickedButtonanimate()
  181. {
  182. m_nTimer = SetTimer(1971,5,NULL);
  183. m_bStop = FALSE;
  184. }
  185. void CSpecialFxDlg::OnBnClickedButtonstop()
  186. {
  187. m_bStop = TRUE;
  188. //KillTimer(m_nTimer);
  189. }
  190. void CSpecialFxDlg::OnNMCustomdrawSliderfirealpha(NMHDR *pNMHDR, LRESULT *pResult)
  191. {
  192. LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
  193. m_myFire.m_iAlpha = m_sldrFire.GetPos();
  194. *pResult = 0;
  195. }
  196. void CSpecialFxDlg::OnNMCustomdrawSliderplasmaalpha(NMHDR *pNMHDR, LRESULT *pResult)
  197. {
  198. LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
  199. m_myPlasma.m_iAlpha = m_sldrPlasma.GetPos();
  200. *pResult = 0;
  201. }
  202. //
  203. // 内存泄漏,在KillTimer后,m_bmpRenderTarget
  204. // 和 m_bmpRenderSource仍在活动;
  205. // 内存DC一块没有清除完全;
  206. BOOL CSpecialFxDlg::DestroyWindow()
  207. {
  208. m_bStop = TRUE;
  209. KillTimer(m_nTimer);
  210. Sleep(500);
  211. #if 1
  212. m_myWater.~CWaterRoutine();
  213. m_myFire.~CFireRoutine();
  214. m_myPlasma.~CPlasmaRoutine();
  215. #endif
  216. m_bmpRenderTarget.DeleteObject();
  217. m_bmpRenderSource.DeleteObject();
  218. return CDialog::DestroyWindow();
  219. }