gradpal.cpp
上传用户:f091118568
上传日期:2007-01-03
资源大小:53k
文件大小:5k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // GRADPAL.CPP
  2. // Written by chensu
  3. #include <afxwin.h>
  4. #include "gradpal.h"
  5. //*****************************************************************************
  6. //-----------------------------------------------------------------------------
  7. CGradpalApp GradpalApp;
  8. //-----------------------------------------------------------------------------
  9. //*****************************************************************************
  10. //*****************************************************************************
  11. //-----------------------------------------------------------------------------
  12. BOOL CGradpalApp::InitInstance()
  13. {
  14. CGradpalWnd *pMainFrame = new CGradpalWnd();
  15. if (!pMainFrame->CreateWnd())
  16. return FALSE;
  17. pMainFrame->ShowWindow(m_nCmdShow);
  18. pMainFrame->UpdateWindow();
  19. m_pMainWnd = pMainFrame;
  20. return TRUE;
  21. }
  22. //-----------------------------------------------------------------------------
  23. //*****************************************************************************
  24. //*****************************************************************************
  25. //-----------------------------------------------------------------------------
  26. CGradpalWnd::CGradpalWnd() :
  27. m_nPaintSteps(236), // the number of steps
  28. m_nPaintDir(GPD_BTOT), // the direction
  29. m_nPaintRGB(GPC_BLUE) // the color
  30. {
  31. VERIFY(this->CreateGradPalette());
  32. }
  33. //-----------------------------------------------------------------------------
  34. BEGIN_MESSAGE_MAP(CGradpalWnd, CFrameWnd)
  35. ON_WM_QUERYNEWPALETTE()
  36. ON_WM_PALETTECHANGED()
  37. ON_WM_PAINT()
  38. END_MESSAGE_MAP()
  39. //-----------------------------------------------------------------------------
  40. BOOL CGradpalWnd::OnQueryNewPalette()
  41. {
  42. CClientDC dc(this);
  43. CPalette *pPalOld = dc.SelectPalette(&m_Pal, FALSE);
  44. BOOL bRet = dc.RealizePalette();
  45. dc.SelectPalette(pPalOld, FALSE);
  46. if (bRet)
  47. // some colors changed
  48. this->Invalidate();
  49. return bRet;
  50. }
  51. //-----------------------------------------------------------------------------
  52. void CGradpalWnd::OnPaletteChanged(CWnd *pFocusWnd)
  53. {
  54. if (pFocusWnd != this)
  55. this->OnQueryNewPalette();
  56. }
  57. //-----------------------------------------------------------------------------
  58. void CGradpalWnd::OnPaint()
  59. {
  60. CPaintDC dc(this);
  61. CPalette *pPalOld = dc.SelectPalette(&m_Pal, FALSE);
  62. dc.RealizePalette();
  63. RECT rect;
  64. this->GetClientRect(&rect);
  65. this->PaintGradiantRect(&dc, rect);
  66. dc.SelectPalette(pPalOld, FALSE);
  67. }
  68. //-----------------------------------------------------------------------------
  69. void CGradpalWnd::PaintGradiantRect(CDC *pDC, const RECT &rect) const
  70. {
  71. ASSERT(pDC != NULL);
  72. ASSERT_KINDOF(CDC, pDC);
  73. // initialize
  74. RECT rectVar = { rect.left, rect.top, rect.left, rect.top };
  75. int nTotalSize;
  76. if (m_nPaintDir == GPD_TTOB || m_nPaintDir == GPD_BTOT)
  77. {
  78. rectVar.right = rect.right;
  79. nTotalSize = rect.bottom - rect.top;
  80. }
  81. else
  82. {
  83. rectVar.bottom = rect.bottom;
  84. nTotalSize = rect.right - rect.left;
  85. }
  86. // paint nSteps times
  87. for (int nIndex = 0; nIndex < m_nPaintSteps; nIndex++)
  88. {
  89. // calculate the rectangle
  90. if (m_nPaintDir == GPD_TTOB || m_nPaintDir == GPD_BTOT)
  91. {
  92. rectVar.top = rectVar.bottom;
  93. rectVar.bottom = rect.top +
  94.  ::MulDiv(nIndex + 1, nTotalSize, m_nPaintSteps);
  95. }
  96. else
  97. {
  98. rectVar.left = rectVar.right;
  99. rectVar.right = rect.left +
  100. ::MulDiv(nIndex + 1, nTotalSize, m_nPaintSteps);
  101. }
  102. // calculate the color value
  103. int nColor = ::MulDiv(nIndex, 255, m_nPaintSteps);
  104. if (m_nPaintDir == GPD_BTOT || m_nPaintDir == GPD_RTOL)
  105. nColor = 255 - nColor;
  106. const COLORREF clrBr =
  107. PALETTERGB((BYTE)(m_nPaintRGB & GPC_RED ? nColor : 0),
  108.    (BYTE)(m_nPaintRGB & GPC_GREEN ? nColor : 0),
  109.    (BYTE)(m_nPaintRGB & GPC_BLUE ? nColor : 0));
  110. // paint the rectangle with the brush
  111. CBrush brush(clrBr);
  112. pDC->FillRect(&rectVar, &brush);
  113. }
  114. }
  115. //-----------------------------------------------------------------------------
  116. BOOL CGradpalWnd::CreateGradPalette()
  117. {
  118. if (m_Pal.GetSafeHandle() != NULL)
  119. return FALSE;
  120. BOOL bSucc = FALSE;
  121. const int nNumColors = 236;
  122. LPLOGPALETTE lpPal = (LPLOGPALETTE)new BYTE[sizeof(LOGPALETTE) +
  123. sizeof(PALETTEENTRY) *
  124. nNumColors];
  125. if (lpPal != NULL)
  126. {
  127. lpPal->palVersion = 0x300;
  128. lpPal->palNumEntries = nNumColors;
  129. PALETTEENTRY *ppe = lpPal->palPalEntry;
  130. for (int nIndex = 0; nIndex < nNumColors; nIndex++)
  131. {
  132. const int nColor = ::MulDiv(nIndex, 255, nNumColors);
  133. ppe->peRed = (BYTE)(m_nPaintRGB & GPC_RED ? nColor : 0);
  134. ppe->peGreen = (BYTE)(m_nPaintRGB & GPC_GREEN ? nColor : 0);
  135. ppe->peBlue = (BYTE)(m_nPaintRGB & GPC_BLUE ? nColor : 0);
  136. ppe->peFlags = (BYTE)0;
  137. ppe++;
  138. }
  139. bSucc = m_Pal.CreatePalette(lpPal);
  140. delete [](PBYTE)lpPal;
  141. }
  142. return bSucc;
  143. }
  144. //-----------------------------------------------------------------------------
  145. //*****************************************************************************
  146. // End of GRADPAL.CPP