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

Windows编程

开发平台:

Visual C++

  1. // firewnd.cpp : implementation file
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include "stdafx.h"
  13. #include "fire.h"
  14. #include "firewnd.h"
  15. #include <math.h> // for HSI conversion
  16. #ifdef _DEBUG
  17. #undef THIS_FILE
  18. static char BASED_CODE THIS_FILE[] = __FILE__;
  19. #endif
  20. static RGBQUAD rgbStd256[] =
  21. {
  22. {   0,  0,  0, 0 }, {   0,  0,128, 0 }, {   0,128,  0, 0 }, {   0,128,128, 0 },
  23. { 128,  0,  0, 0 }, { 128,  0,128, 0 }, { 128,128,  0, 0 }, { 192,192,192, 0 },
  24. { 192,220,192, 0 }, { 240,202,166, 0 }, { 238,238,238, 0 }, { 221,221,221, 0 },
  25. { 204,204,204, 0 }, { 187,187,187, 0 }, { 170,170,170, 0 }, { 153,153,153, 0 },
  26. { 136,136,136, 0 }, { 119,119,119, 0 }, { 102,102,102, 0 }, {  85, 85, 85, 0 },
  27. {  68, 68, 68, 0 }, {  51, 51, 51, 0 }, {  34, 34, 34, 0 }, {  17, 17, 17, 0 },
  28. { 204,255,255, 0 }, { 153,255,255, 0 }, { 102,255,255, 0 }, {  51,255,255, 0 },
  29. { 255,204,255, 0 }, { 204,204,255, 0 }, { 153,204,255, 0 }, { 102,204,255, 0 },
  30. {  51,204,255, 0 }, {   0,204,255, 0 }, { 255,153,255, 0 }, { 204,153,255, 0 },
  31. { 153,153,255, 0 }, { 102,153,255, 0 }, {  51,153,255, 0 }, {   0,153,255, 0 },
  32. { 255,102,255, 0 }, { 204,102,255, 0 }, { 153,102,255, 0 }, { 102,102,255, 0 },
  33. {  51,102,255, 0 }, {   0,102,255, 0 }, { 255, 51,255, 0 }, { 204, 51,255, 0 },
  34. { 153, 51,255, 0 }, { 102, 51,255, 0 }, {  51, 51,255, 0 }, {   0, 51,255, 0 },
  35. { 204,  0,255, 0 }, { 153,  0,255, 0 }, { 102,  0,255, 0 }, {  51,  0,255, 0 },
  36. { 255,255,204, 0 }, { 204,255,204, 0 }, { 153,255,204, 0 }, { 102,255,204, 0 },
  37. {  51,255,204, 0 }, {   0,255,204, 0 }, { 255,204,204, 0 }, { 153,204,204, 0 },
  38. { 102,204,204, 0 }, {  51,204,204, 0 }, {   0,204,204, 0 }, { 255,153,204, 0 },
  39. { 204,153,204, 0 }, { 153,153,204, 0 }, { 102,153,204, 0 }, {  51,153,204, 0 },
  40. {   0,153,204, 0 }, { 255,102,204, 0 }, { 204,102,204, 0 }, { 153,102,204, 0 },
  41. { 102,102,204, 0 }, {  51,102,204, 0 }, {   0,102,204, 0 }, { 255, 51,204, 0 },
  42. { 204, 51,204, 0 }, { 153, 51,204, 0 }, { 102, 51,204, 0 }, {  51, 51,204, 0 },
  43. {   0, 51,204, 0 }, { 255,  0,204, 0 }, { 204,  0,204, 0 }, { 153,  0,204, 0 },
  44. { 102,  0,204, 0 }, {  51,  0,204, 0 }, { 255,255,153, 0 }, { 204,255,153, 0 },
  45. { 153,255,153, 0 }, { 102,255,153, 0 }, {  51,255,153, 0 }, {   0,255,153, 0 },
  46. { 255,204,153, 0 }, { 204,204,153, 0 }, { 153,204,153, 0 }, { 102,204,153, 0 },
  47. {  51,204,153, 0 }, {   0,204,153, 0 }, { 255,153,153, 0 }, { 204,153,153, 0 },
  48. { 102,153,153, 0 }, {  51,153,153, 0 }, {   0,153,153, 0 }, { 255,102,153, 0 },
  49. { 204,102,153, 0 }, { 153,102,153, 0 }, { 102,102,153, 0 }, {  51,102,153, 0 },
  50. {   0,102,153, 0 }, { 255, 51,153, 0 }, { 204, 51,153, 0 }, { 153, 51,153, 0 },
  51. { 102, 51,153, 0 }, {  51, 51,153, 0 }, {   0, 51,153, 0 }, { 255,  0,153, 0 },
  52. { 204,  0,153, 0 }, { 153,  0,153, 0 }, { 102,  0,153, 0 }, {  51,  0,153, 0 },
  53. { 255,255,102, 0 }, { 204,255,102, 0 }, { 153,255,102, 0 }, { 102,255,102, 0 },
  54. {  51,255,102, 0 }, {   0,255,102, 0 }, { 255,204,102, 0 }, { 204,204,102, 0 },
  55. { 153,204,102, 0 }, { 102,204,102, 0 }, {  51,204,102, 0 }, {   0,204,102, 0 },
  56. { 255,153,102, 0 }, { 204,153,102, 0 }, { 153,153,102, 0 }, { 102,153,102, 0 },
  57. {  51,153,102, 0 }, {   0,153,102, 0 }, { 255,102,102, 0 }, { 204,102,102, 0 },
  58. { 153,102,102, 0 }, {  51,102,102, 0 }, {   0,102,102, 0 }, { 255, 51,102, 0 },
  59. { 204, 51,102, 0 }, { 153, 51,102, 0 }, { 102, 51,102, 0 }, {  51, 51,102, 0 },
  60. {   0, 51,102, 0 }, { 255,  0,102, 0 }, { 204,  0,102, 0 }, { 153,  0,102, 0 },
  61. { 102,  0,102, 0 }, {  51,  0,102, 0 }, { 255,255, 51, 0 }, { 204,255, 51, 0 },
  62. { 153,255, 51, 0 }, { 102,255, 51, 0 }, {  51,255, 51, 0 }, {   0,255, 51, 0 },
  63. { 255,204, 51, 0 }, { 204,204, 51, 0 }, { 153,204, 51, 0 }, { 102,204, 51, 0 },
  64. {  51,204, 51, 0 }, {   0,204, 51, 0 }, { 255,153, 51, 0 }, { 204,153, 51, 0 },
  65. { 153,153, 51, 0 }, { 102,153, 51, 0 }, {  51,153, 51, 0 }, {   0,153, 51, 0 },
  66. { 255,102, 51, 0 }, { 204,102, 51, 0 }, { 153,102, 51, 0 }, { 102,102, 51, 0 },
  67. {  51,102, 51, 0 }, {   0,102, 51, 0 }, { 255, 51, 51, 0 }, { 204, 51, 51, 0 },
  68. { 153, 51, 51, 0 }, { 102, 51, 51, 0 }, {   0, 51, 51, 0 }, { 255,  0, 51, 0 },
  69. { 204,  0, 51, 0 }, { 153,  0, 51, 0 }, { 102,  0, 51, 0 }, {  51,  0, 51, 0 },
  70. { 204,255,  0, 0 }, { 153,255,  0, 0 }, { 102,255,  0, 0 }, {  51,255,  0, 0 },
  71. { 255,204,  0, 0 }, { 204,204,  0, 0 }, { 153,204,  0, 0 }, { 102,204,  0, 0 },
  72. {  51,204,  0, 0 }, { 255,153,  0, 0 }, { 204,153,  0, 0 }, { 153,153,  0, 0 },
  73. { 102,153,  0, 0 }, {   0,  0,238, 0 }, {   0,  0,221, 0 }, {   0,  0,204, 0 },
  74. {   0,  0,187, 0 }, {   0,  0,170, 0 }, {   0,  0,153, 0 }, {   0,  0,136, 0 },
  75. {   0,  0,119, 0 }, {   0,  0,102, 0 }, {   0,  0, 85, 0 }, {   0,  0, 68, 0 },
  76. {   0,  0, 51, 0 }, {   0,  0, 34, 0 }, {   0,  0, 17, 0 }, {   0,238,  0, 0 },
  77. {   0,221,  0, 0 }, {   0,204,  0, 0 }, {   0,187,  0, 0 }, {   0,170,  0, 0 },
  78. {   0,153,  0, 0 }, {   0,136,  0, 0 }, {   0,119,  0, 0 }, {   0,102,  0, 0 },
  79. {   0, 85,  0, 0 }, {   0, 68,  0, 0 }, {   0, 51,  0, 0 }, {   0, 34,  0, 0 },
  80. {   0, 17,  0, 0 }, { 238,  0,  0, 0 }, { 221,  0,  0, 0 }, { 204,  0,  0, 0 },
  81. { 187,  0,  0, 0 }, { 170,  0,  0, 0 }, { 153,  0,  0, 0 }, { 136,  0,  0, 0 },
  82. { 119,  0,  0, 0 }, { 102,  0,  0, 0 }, {  85,  0,  0, 0 }, {  68,  0,  0, 0 },
  83. {  51,  0,  0, 0 }, {  34,  0,  0, 0 }, { 240,251,255, 0 }, { 164,160,160, 0 },
  84. { 128,128,128, 0 }, {   0,  0,255, 0 }, {   0,255,  0, 0 }, {   0,255,255, 0 },
  85. { 255,  0,  0, 0 }, { 255,  0,255, 0 }, { 255,255,  0, 0 }, { 255,255,255, 0 }
  86. };
  87. /////////////////////////////////////////////////////////////////////////////
  88. // CFireWnd
  89. // Initialize the seed for random number generation.  For a more random
  90. // flame this could be initialized by a call to ::rand().  Declaring it
  91. // this way causes the same flame to be drawn each time the application
  92. // is executed.
  93. unsigned long CFireWnd::m_RandSeed = 0x38549391;
  94. CFireWnd::CFireWnd()
  95. {
  96. m_nDecay = 5;
  97. m_nFlammability = 385;
  98. m_nMaxHeat = 223;
  99. m_nSpreadRate = 20;
  100. m_nSmoothness = 1;
  101. m_nDistribution = 1;
  102. m_nChaos = 50;
  103. m_nSize = 0;
  104. m_MaxBurn = 0;
  105. m_Fire = NULL;
  106. m_pMemDC = NULL;
  107. m_pWinDC = NULL;
  108. m_pOldPalette = NULL;
  109. m_pOldBitmap = NULL;
  110. }
  111. CFireWnd::~CFireWnd()
  112. {
  113. }
  114. BEGIN_MESSAGE_MAP(CFireWnd, CStatic)
  115. //{{AFX_MSG_MAP(CFireWnd)
  116. ON_WM_PAINT()
  117. ON_WM_DESTROY()
  118. ON_WM_PALETTECHANGED()
  119. ON_WM_QUERYNEWPALETTE()
  120. //}}AFX_MSG_MAP
  121. END_MESSAGE_MAP()
  122. /////////////////////////////////////////////////////////////////////////////
  123. // CFireWnd Operations
  124. void CFireWnd::InitFire(int nColor)
  125. {
  126. CreatePalette(nColor);
  127. CreateBitmap();
  128. {
  129. CWnd* pActiveWnd = CWnd::GetActiveWindow();
  130. if (pActiveWnd != NULL)
  131. pActiveWnd->SendMessage(WM_QUERYNEWPALETTE);
  132. }
  133. }
  134. CPalette* CFireWnd::GetPalette()
  135. {
  136. if (m_Palette.m_hObject != NULL)
  137. return &m_Palette;
  138. else
  139. return NULL;
  140. }
  141. void CFireWnd::CreatePalette(int nColor)
  142. {
  143. UINT i;
  144. if (m_Palette.m_hObject != NULL)
  145. m_Palette.DeleteObject();
  146. memcpy( m_rgbPalette, rgbStd256, sizeof(RGBQUAD) * 256 );
  147. int r,g,b;
  148. switch(nColor)
  149. {
  150. case blue:
  151. b = 256+256+255;
  152. g = 256+255;
  153. r = 255;
  154. break;
  155. case green:
  156. g = 256+256+255;
  157. r = 256+255;
  158. b = 255;
  159. break;
  160. case red:
  161. default:
  162. r = 256+256+255;
  163. g = 256+255;
  164. b = 255;
  165. break;
  166. }
  167. for(i = 239; i > 15; i--)
  168. {
  169. m_rgbPalette[i].rgbRed = (r > 255) ? 255 : r;
  170. m_rgbPalette[i].rgbGreen = (g > 255) ? 255 : g;
  171. m_rgbPalette[i].rgbBlue = (b > 255) ? 255 : b;
  172. r = (r > 3) ? (r - 4) : 0;
  173. g = (g > 3) ? (g - 4) : 0;
  174. b = (b > 3) ? (b - 4) : 0;
  175. }
  176. LPLOGPALETTE lpLogPal;
  177. lpLogPal = (LPLOGPALETTE) new BYTE[sizeof(LOGPALETTE) + ((255) * sizeof(PALETTEENTRY))];
  178. lpLogPal->palVersion = 0x0300;
  179. lpLogPal->palNumEntries = 256;
  180. for (i = 0; i < 256; i++)
  181. {
  182. lpLogPal->palPalEntry[i].peRed = m_rgbPalette[i].rgbRed;
  183. lpLogPal->palPalEntry[i].peGreen = m_rgbPalette[i].rgbGreen;
  184. lpLogPal->palPalEntry[i].peBlue = m_rgbPalette[i].rgbBlue;
  185. lpLogPal->palPalEntry[i].peFlags = 0;
  186. }
  187. VERIFY( m_Palette.CreatePalette( lpLogPal ) );
  188. delete [] (BYTE *)lpLogPal;
  189. }
  190. CSize CFireWnd::GetBitmapSize()
  191. {
  192. if (m_Bitmap.m_hObject == NULL)
  193. return CSize(0,0);
  194. BITMAP bm;
  195. m_Bitmap.GetObject( sizeof(BITMAP), &bm );
  196. return CSize(bm.bmWidth, bm.bmHeight);
  197. }
  198. #define WIDTHBYTES(bits) ((((bits) + 31) / 32) * 4)
  199. void CFireWnd::CreateBitmap()
  200. {
  201. if (m_pMemDC != NULL)
  202. {
  203. m_pMemDC->SelectObject(m_pOldBitmap);
  204. delete m_pMemDC;
  205. m_pMemDC = NULL;
  206. m_pOldBitmap = NULL;
  207. }
  208. if (m_pWinDC != NULL)
  209. {
  210. m_pWinDC->SelectObject(m_pOldPalette);
  211. delete m_pWinDC;
  212. m_pWinDC = NULL;
  213. m_pOldPalette = NULL;
  214. }
  215. if (m_Bitmap.m_hObject != NULL)
  216. m_Bitmap.DeleteObject();
  217. if (m_Fire != NULL)
  218. {
  219. delete m_Fire;
  220. m_Fire = NULL;
  221. }
  222. CRect rect;
  223. CSize size;
  224. GetClientRect(&rect);
  225. size = rect.Size();
  226. if (m_MaxBurn == 0)
  227. m_MaxBurn = (int)(size.cy * 0.75);
  228. if (m_nSize == 0)
  229. m_nSize = (int)(size.cx / 2);
  230. m_Fire = new BYTE[size.cx];
  231. LPBITMAPINFO lpbi;
  232. // Fill in the BITMAPINFOHEADER
  233. lpbi = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER) + (256 * sizeof(RGBQUAD))];
  234. lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  235. lpbi->bmiHeader.biWidth = size.cx;
  236. lpbi->bmiHeader.biHeight = size.cy;
  237. lpbi->bmiHeader.biPlanes = 1;
  238. lpbi->bmiHeader.biBitCount = 8;
  239. lpbi->bmiHeader.biCompression = BI_RGB;
  240. lpbi->bmiHeader.biSizeImage = WIDTHBYTES((DWORD)size.cx * 8) * size.cy;
  241. lpbi->bmiHeader.biXPelsPerMeter = 0;
  242. lpbi->bmiHeader.biYPelsPerMeter = 0;
  243. lpbi->bmiHeader.biClrUsed = 0;
  244. lpbi->bmiHeader.biClrImportant = 0;
  245. // Fill in the color table
  246. UINT uUsage = DIB_RGB_COLORS;
  247. memcpy( lpbi->bmiColors, m_rgbPalette, sizeof(RGBQUAD) * 256 );
  248. m_pWinDC = new CWindowDC(this);
  249. HBITMAP hBitmap = CreateDIBSection( m_pWinDC->m_hDC, lpbi, uUsage, (void **)&m_pBits, NULL, 0 );
  250. delete [] (BYTE *)lpbi;
  251. ASSERT(hBitmap != NULL);
  252. m_Bitmap.Attach( hBitmap );
  253. for (int y = 0; y < size.cy; y++ )
  254. {
  255. BYTE* pRow = (m_pBits + WIDTHBYTES((DWORD)size.cx * 8) * y);
  256. for (int x = 0; x < size.cx; x++ )
  257. *pRow++ = 16;
  258. }
  259. m_pMemDC = new CDC;
  260. VERIFY( m_pMemDC->CreateCompatibleDC(m_pWinDC) );
  261. m_pOldPalette = m_pWinDC->SelectPalette( &m_Palette, FALSE );
  262. m_pWinDC->RealizePalette();
  263. m_pOldBitmap = m_pMemDC->SelectObject( &m_Bitmap );
  264. for (int x = 0; x < size.cx; x++ )
  265. m_Fire[x] = 16;
  266. }
  267. //
  268. //  This routine was adapted from a pascal routine written by
  269. //  Frank Jan Sorensen Alias:Frank Patxi (fjs@lab.jt.dk)
  270. //
  271. //  See AboutBox for a special thank you for all his work.
  272. //
  273. void CFireWnd::RenderFlame()
  274. {
  275. CSize size = GetBitmapSize();
  276. int xStart, xEnd, x, y;
  277. BYTE* pRow;
  278. BYTE* pNextRow;
  279. xStart = (size.cx - m_nSize) / 2;
  280. xEnd = xStart + m_nSize + 1;
  281. {
  282. pRow = m_pBits;
  283. for (x=0;x<size.cx;x++)
  284. {
  285. if (x < (xStart + m_nDistribution) || x >= (xEnd - m_nDistribution))
  286. m_Fire[x] = 16;
  287. *pRow++ = m_Fire[x];
  288. }
  289. }
  290. for (y = m_MaxBurn; y > 0; y--)
  291. {
  292. pRow = (m_pBits + WIDTHBYTES((DWORD)size.cx * 8) * y);
  293. pNextRow = (m_pBits + WIDTHBYTES((DWORD)size.cx * 8) * (y - 1));
  294. if ((rand() % 2) == 0)
  295. {
  296. for (x = 0; x < size.cx; x++)
  297. {
  298. BurnPoint(pRow, pNextRow);
  299. pRow++;
  300. pNextRow++;
  301. }
  302. }
  303. else
  304. {
  305. pRow += size.cx - 1;
  306. pNextRow += size.cx - 1;
  307. for (x = 0; x < size.cx; x++)
  308. {
  309. BurnPoint(pRow, pNextRow);
  310. pRow--;
  311. pNextRow--;
  312. }
  313. }
  314. }
  315. int MaxHeat = m_nMaxHeat + 16;
  316. if ( rand() % (400 - m_nFlammability) == 0)
  317. {
  318. int off = m_nSize - 5;
  319. off = rand() % off;
  320. off += xStart;
  321. for (x = off; x < off + 5; x++)
  322. m_Fire[x] = 239;
  323. }
  324. for (x = xStart; x < xEnd; x++)
  325. {
  326. if (m_Fire[x] < MaxHeat)
  327. {
  328. int val = rand() % m_nChaos+1;
  329. val -= m_nChaos / 2;
  330. val += m_nSpreadRate;
  331. val += m_Fire[x];
  332. if ( val > MaxHeat)
  333. m_Fire[x] = MaxHeat;
  334. else if ( val < 16)
  335. m_Fire[x] = 16;
  336. else
  337. m_Fire[x] = val;
  338. }
  339. else
  340. m_Fire[x] = MaxHeat;
  341. }
  342. if (m_nSmoothness > 0)
  343. {
  344. xStart += m_nSmoothness;
  345. xEnd -= m_nSmoothness;
  346. for (x = xStart; x < xEnd; x++)
  347. {
  348. int val = 0;
  349. for (y = x - m_nSmoothness; y < x + 1 + m_nSmoothness; y++)
  350. val += m_Fire[y];
  351. m_Fire[x] = val / (2*m_nSmoothness+1);
  352. }
  353. }
  354. }
  355. void CFireWnd::PaintFlame(CDC* pDC)
  356. {
  357. if (m_Palette.m_hObject != NULL  && m_Bitmap.m_hObject != NULL)
  358. {
  359. CSize size = GetBitmapSize();
  360. if (pDC != NULL)
  361. {
  362. CDC dc;
  363. CPalette *pOldPalette;
  364. pOldPalette = pDC->SelectPalette( &m_Palette, FALSE );
  365. pDC->RealizePalette();
  366. VERIFY( dc.CreateCompatibleDC(pDC) );
  367. CBitmap* pOldBitmap = dc.SelectObject( &m_Bitmap );
  368. pDC->BitBlt( 0, 0, size.cx, size.cy, &dc, 0, 0, SRCCOPY );
  369. dc.SelectObject(pOldBitmap);
  370. pDC->SelectPalette( pOldPalette, TRUE );
  371. }
  372. else
  373. {
  374. m_pWinDC->BitBlt( 0, 0, size.cx, size.cy, m_pMemDC, 0, 0, SRCCOPY );
  375. }
  376. }
  377. }
  378. void CFireWnd::SetMaxBurn(int nMax)
  379. {
  380. if (m_Palette.m_hObject != NULL  && m_Bitmap.m_hObject != NULL)
  381. {
  382. CSize size = GetBitmapSize();
  383. m_MaxBurn = (int)(size.cy * (nMax/100.0));
  384. int y;
  385. for (y = (size.cy - 1); y > m_MaxBurn; y--)
  386. {
  387. BYTE* pRow = (m_pBits + WIDTHBYTES((DWORD)size.cx * 8) * y);
  388. for (int x = 0; x < size.cx; x++)
  389. *pRow++ = 16;
  390. }
  391. }
  392. }
  393. int CFireWnd::GetMaxBurn()
  394. {
  395. return m_MaxBurn;
  396. }
  397. /////////////////////////////////////////////////////////////////////////////
  398. // CFireWnd message handlers
  399. void CFireWnd::OnDestroy()
  400. {
  401. CStatic::OnDestroy();
  402. if (m_pMemDC != NULL)
  403. {
  404. m_pMemDC->SelectObject(m_pOldBitmap);
  405. delete m_pMemDC;
  406. m_pMemDC = NULL;
  407. m_pOldBitmap = NULL;
  408. }
  409. if (m_pWinDC != NULL)
  410. {
  411. m_pWinDC->SelectObject(m_pOldPalette);
  412. delete m_pWinDC;
  413. m_pWinDC = NULL;
  414. m_pOldPalette = NULL;
  415. }
  416. if (m_Bitmap.m_hObject != NULL)
  417. m_Bitmap.DeleteObject();
  418. if (m_Palette.m_hObject != NULL)
  419. m_Palette.DeleteObject();
  420. if (m_Fire != NULL)
  421. {
  422. delete m_Fire;
  423. m_Fire = NULL;
  424. }
  425. }
  426. void CFireWnd::OnPaint()
  427. {
  428. CPaintDC dc(this); // device context for painting
  429. PaintFlame(&dc);
  430. }
  431. void CFireWnd::OnPaletteChanged(CWnd* pFocusWnd)
  432. {
  433. if (pFocusWnd == this || IsChild(pFocusWnd))
  434. return;
  435. OnQueryNewPalette();
  436. }
  437. BOOL CFireWnd::OnQueryNewPalette()
  438. {
  439. if (GetPalette() == NULL)
  440. return FALSE;
  441. {
  442. CClientDC dc(this);
  443. CPalette* pOldPalette = dc.SelectPalette(&m_Palette,
  444. GetCurrentMessage()->message == WM_PALETTECHANGED);
  445. UINT nChanged = dc.RealizePalette();
  446. dc.SelectPalette(pOldPalette, TRUE);
  447. if (nChanged == 0)  // no change to our mapping
  448. return FALSE;
  449. }
  450. // some changes have been made; invalidate
  451. Invalidate(FALSE);
  452. return TRUE;
  453. }