COLORLIS.CPP
上传用户:aakk678
上传日期:2022-07-09
资源大小:406k
文件大小:4k
源码类别:

界面编程

开发平台:

Visual C++

  1. // colorlis.cpp : implementation file
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1997 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 "wordpad.h"
  14. #include "colorlis.h"
  15. #ifdef _DEBUG
  16. #undef THIS_FILE
  17. static char BASED_CODE THIS_FILE[] = __FILE__;
  18. #endif
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CColorMenu
  21. /*
  22. int BASED_CODE CColorMenu::indexMap[17] = {
  23. 0,  //black
  24. 19,  //white
  25. 13,  //red
  26. 14,  //green
  27. 16,  //blue
  28. 15,  //yellow
  29. 17,  //magenta
  30. 18,  //cyan
  31. 1,  //dark red
  32. 2,  //dark green
  33. 4,  //dark blue
  34. 3,  //light brown
  35. 5,  //purple
  36. 6,  //dark cyan
  37. 7,  //light gray
  38. 12,  //gray
  39. 0}; //automatic
  40. */
  41. int BASED_CODE CColorMenu::indexMap[17] = {
  42. 0,  //black
  43. 1,  //dark red
  44. 2,  //dark green
  45. 3,  //light brown
  46. 4,  //dark blue
  47. 5,  //purple
  48. 6,  //dark cyan
  49. 12,  //gray
  50. 7,  //light gray
  51. 13,  //red
  52. 14,  //green
  53. 15,  //yellow
  54. 16,  //blue
  55. 17,  //magenta
  56. 18,  //cyan
  57. 19,  //white
  58. 0}; //automatic
  59. CColorMenu::CColorMenu()
  60. {
  61. VERIFY(CreatePopupMenu());
  62. ASSERT(GetMenuItemCount()==0);
  63. for (int i=0; i<=16;i++)
  64. VERIFY(AppendMenu(MF_OWNERDRAW, ID_COLOR0+i, (LPCTSTR)(ID_COLOR0+i)));
  65. }
  66. COLORREF CColorMenu::GetColor(UINT id)
  67. {
  68. ASSERT(id >= ID_COLOR0);
  69. ASSERT(id <= ID_COLOR16);
  70. if (id == ID_COLOR16) // autocolor
  71. return ::GetSysColor(COLOR_WINDOWTEXT);
  72. else
  73. {
  74. CPalette* pPal = CPalette::FromHandle( (HPALETTE) GetStockObject(DEFAULT_PALETTE));
  75. ASSERT(pPal != NULL);
  76. PALETTEENTRY pe;
  77. if (pPal->GetPaletteEntries(indexMap[id-ID_COLOR0], 1, &pe) == 0)
  78. return ::GetSysColor(COLOR_WINDOWTEXT);
  79. else
  80. return RGB(pe.peRed,pe.peGreen,pe.peBlue);
  81. // return PALETTEINDEX(CColorMenu::indexMap[id-ID_COLOR0]);
  82. }
  83. }
  84. void CColorMenu::DrawItem(LPDRAWITEMSTRUCT lpDIS)
  85. {
  86. ASSERT(lpDIS->CtlType == ODT_MENU);
  87. UINT id = (UINT)(WORD)lpDIS->itemID;
  88. ASSERT(id == lpDIS->itemData);
  89. ASSERT(id >= ID_COLOR0);
  90. ASSERT(id <= ID_COLOR16);
  91. CDC dc;
  92. dc.Attach(lpDIS->hDC);
  93. CRect rc(lpDIS->rcItem);
  94. ASSERT(rc.Width() < 500);
  95. if (lpDIS->itemState & ODS_FOCUS)
  96. dc.DrawFocusRect(&rc);
  97. COLORREF cr = (lpDIS->itemState & ODS_SELECTED) ? 
  98. ::GetSysColor(COLOR_HIGHLIGHT) :
  99. dc.GetBkColor();
  100. CBrush brushFill(cr);
  101. cr = dc.GetTextColor();
  102. if (lpDIS->itemState & ODS_SELECTED)
  103. dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
  104. int nBkMode = dc.SetBkMode(TRANSPARENT);
  105. dc.FillRect(&rc, &brushFill);
  106. rc.left += 50;
  107. CString strColor;
  108. strColor.LoadString(id);
  109. dc.TextOut(rc.left,rc.top,strColor,strColor.GetLength());
  110. rc.left -= 45;
  111. rc.top += 2;
  112. rc.bottom -= 2;
  113. rc.right = rc.left + 40;
  114. CBrush brush(GetColor(id));
  115. CBrush* pOldBrush = dc.SelectObject(&brush);
  116. dc.Rectangle(rc);
  117. dc.SelectObject(pOldBrush);
  118. dc.SetTextColor(cr);
  119. dc.SetBkMode(nBkMode);
  120. dc.Detach();
  121. }
  122. void CColorMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
  123. {
  124. ASSERT(lpMIS->CtlType == ODT_MENU);
  125. UINT id = (UINT)(WORD)lpMIS->itemID;
  126. ASSERT(id == lpMIS->itemData);
  127. ASSERT(id >= ID_COLOR0);
  128. ASSERT(id <= ID_COLOR16);
  129. CDisplayIC dc;
  130. CString strColor;
  131. strColor.LoadString(id);
  132. CSize sizeText = dc.GetTextExtent(strColor,strColor.GetLength());
  133. ASSERT(sizeText.cx < 500);
  134. lpMIS->itemWidth = sizeText.cx + 50;
  135. lpMIS->itemHeight = sizeText.cy;
  136. }