FIREWND.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // FireWnd.h : Declaration of the CFireWnd
  2. //
  3. // This is a part of the Active Template Library.
  4. // Copyright (C) 1996-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Active Template Library Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Active Template Library product.
  12. #ifndef __FIREWND_H_
  13. #define __FIREWND_H_
  14. #include "resource.h"       // main symbols
  15. #include "size.h"
  16. #include "propdlg.h"
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CFireWnd
  19. class CFireWnd :
  20. public CDialogImpl<CFireWnd>
  21. {
  22. public:
  23. CFireWnd();
  24. ~CFireWnd();
  25. enum { IDD = IDD_FIREWND };
  26. BEGIN_MSG_MAP(CFireWnd)
  27. MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
  28. MESSAGE_HANDLER(WM_PAINT, OnPaint)
  29. MESSAGE_HANDLER(WM_RBUTTONDOWN, OnRButtonDown)
  30. MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
  31. MESSAGE_HANDLER(WM_PALETTECHANGED, OnPaletteChanged)
  32. MESSAGE_HANDLER(WM_QUERYNEWPALETTE, OnQueryNewPalette)
  33. MESSAGE_HANDLER(WM_TIMER, OnTimer)
  34. MESSAGE_HANDLER(WM_SIZE, OnSize)
  35. COMMAND_ID_HANDLER(IDM_PROPERTIES, OnProperties)
  36. END_MSG_MAP()
  37. public:
  38. // Message handlers
  39. LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  40. LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  41. LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  42. LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  43. LRESULT OnPaletteChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  44. LRESULT OnQueryNewPalette(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  45. LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  46. LRESULT OnProperties(WORD wNotifyCode, WORD wID, HWND hWndCtlr, BOOL& bHandled);
  47. LRESULT OnRButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  48. // Fire Attributes
  49. long m_nDecay;
  50. long m_nFlammability;
  51. long m_nMaxHeat;
  52. long m_nSpreadRate;
  53. long m_nSize;
  54. long m_nSmoothness;
  55. long m_nDistribution;
  56. long m_nChaos;
  57. long m_curColor;
  58. long m_MaxBurn;
  59. UINT m_uTimerID;
  60. CSize rcSize;   // the size of the rect cached from SetObjectRects
  61. CSize bmSize;   // bitmap size cx = width, cy = height
  62. protected:
  63. HMENU m_hRightMenu;
  64. HMENU m_hPropMenu;
  65. BYTE* m_Fire;
  66. // Seed used by faster Rand().
  67. static unsigned long m_RandSeed;
  68. // Device Context Attributes
  69. HDC m_hMemDC;
  70. HDC m_hWinDC;
  71. // Palette Attributes
  72. RGBQUAD m_rgbPalette[256];
  73. HPALETTE m_hPalette;
  74. HPALETTE m_pOldPalette;
  75. // Bitmap Attributes
  76. HBITMAP m_hBitmap;
  77. HBITMAP m_pOldBitmap;
  78. BYTE* m_pBits;
  79. // Operations
  80. public:
  81. enum { red = 1, green = 2, blue = 3 };
  82. void InitFire(int nColor);
  83. HPALETTE* GetPalette();
  84. void RenderFlame();
  85. void PaintFlame(HDC hDC = NULL);
  86. void CreatePopup();
  87. void CreatePalette(int nColor);
  88. protected:
  89. void CreateBitmap();
  90. void BurnPoint(BYTE* pRow, BYTE* pNextRow);
  91. // This function replaces the crt lib rand() function.
  92. // The CRT lib function is very slow.  Since rand() is
  93. // one of the most frequently called functions it was
  94. // necessary to optimize it.  This function may be
  95. // inlined and is computationally simple.
  96. unsigned long Rand();
  97. };
  98. inline unsigned long CFireWnd::Rand()
  99. {
  100. // Using the current seed, generate a new random value
  101. // and seed and return it.  The random value is shifted
  102. // to reduce some of the noise and produce a more
  103. // realistic flame.
  104. return (m_RandSeed = 1664525L * m_RandSeed + 1013904223L) >> 5;
  105. }
  106. inline void CFireWnd::BurnPoint(BYTE* pRow, BYTE* pNextRow)
  107. {
  108. BYTE* pTarget;
  109. int off = Rand() % (m_nDistribution + 1);
  110. int val = m_nDecay + 1;
  111. val = Rand() % val;
  112. val = *pNextRow - val;
  113. if (Rand() & 1)
  114. pTarget = pRow + off;
  115. else
  116. pTarget = pRow - off;
  117. if (val > 16)
  118. *pTarget = (BYTE)val;
  119. else
  120. *pTarget = 16;
  121. }
  122. #endif //__FIREWND_H_