Stroika Library 3.0d18
 
Loading...
Searching...
No Matches
ColorMenu.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4
5#include "Stroika/Foundation/StroikaPreComp.h"
6
7#if defined(WIN32)
8#include <afxwin.h>
9#endif
10
11#include "LedItResources.h"
12
13#include "ColorMenu.h"
14
15#if qStroika_Foundation_Common_Platform_Windows
16/*
17 ********************************************************************************
18 *********************************** ColorMenu **********************************
19 ********************************************************************************
20 */
21
22ColorMenu::ColorMenu ()
23{
24 VERIFY (CreatePopupMenu ());
25 ASSERT (GetMenuItemCount () == 0);
26 for (UINT i = 0; i <= 15; ++i) {
27 DISABLE_COMPILER_MSC_WARNING_START (4312)
28 VERIFY (AppendMenu (MF_OWNERDRAW, kBaseFontColorCmd + i, reinterpret_cast<LPCTSTR> (kBaseFontColorCmd + i)));
29 DISABLE_COMPILER_MSC_WARNING_END (4312)
30 }
31 // ADD:
32 // MenuItem SEPARATOR
33 // MenuItem "Other...", kFontSizeOtherCmdID
34}
35
36COLORREF ColorMenu::GetColor (UINT id)
37{
38 return FontCmdToColor (id).GetOSRep ();
39}
40
41Color ColorMenu::FontCmdToColor (UINT cmd)
42{
43 ASSERT (cmd >= kBaseFontColorCmd);
44 ASSERT (cmd <= kLastFontNamedColorCmd);
45 switch (cmd) {
46 case kBlackColorCmd:
47 return Color::kBlack;
48 case kMaroonColorCmd:
49 return Color::kMaroon;
50 case kGreenColorCmd:
51 return Color::kDarkGreen;
52 case kOliveColorCmd:
53 return Color::kOlive;
54 case kNavyColorCmd:
55 return Color::kNavyBlue;
56 case kPurpleColorCmd:
57 return Color::kPurple;
58 case kTealColorCmd:
59 return Color::kTeal;
60 case kGrayColorCmd:
61 return Color::kGray;
62 case kSilverColorCmd:
63 return Color::kSilver;
64 case kRedColorCmd:
65 return Color::kRed;
66 case kLimeColorCmd:
67 return Color::kGreen;
68 case kYellowColorCmd:
69 return Color::kYellow;
70 case kBlueColorCmd:
71 return Color::kBlue;
72 case kFuchsiaColorCmd:
73 return Color::kMagenta;
74 case kAquaColorCmd:
75 return Color::kCyan;
76 case kWhiteColorCmd:
77 return Color::kWhite;
78 default: /*Led_Assert (false);*/
79 return Color::kBlack;
80 }
81 // return Color (GetColor (cmd));
82}
83
84UINT ColorMenu::FontColorToCmd (Color color)
85{
86 for (UINT i = kBaseFontColorCmd; i <= kLastFontNamedColorCmd; ++i) {
87 if (FontCmdToColor (i) == color) {
88 return i;
89 }
90 }
91 return kFontColorOtherCmd;
92}
93
94void ColorMenu::DrawItem (LPDRAWITEMSTRUCT lpDIS)
95{
96 ASSERT (lpDIS->CtlType == ODT_MENU);
97 UINT id = (UINT)(WORD)lpDIS->itemID;
98 ASSERT (id == lpDIS->itemData);
99 ASSERT (id >= kBaseFontColorCmd);
100 ASSERT (id <= kLastFontNamedColorCmd);
101 CDC dc;
102 dc.Attach (lpDIS->hDC);
103
104 CRect rc (lpDIS->rcItem);
105 ASSERT (rc.Width () < 500);
106 if (lpDIS->itemState & ODS_FOCUS)
107 dc.DrawFocusRect (&rc);
108
109 COLORREF cr = (lpDIS->itemState & ODS_SELECTED) ? ::GetSysColor (COLOR_HIGHLIGHT) : dc.GetBkColor ();
110
111 CBrush brushFill (cr);
112 cr = dc.GetTextColor ();
113
114 if (lpDIS->itemState & ODS_SELECTED)
115 dc.SetTextColor (::GetSysColor (COLOR_HIGHLIGHTTEXT));
116
117 int nBkMode = dc.SetBkMode (TRANSPARENT);
118 dc.FillRect (&rc, &brushFill);
119
120 rc.left += 50;
121 CString strColor;
122 strColor.LoadString (id);
123 dc.TextOut (rc.left, rc.top, strColor, strColor.GetLength ());
124 rc.left -= 45;
125 rc.top += 2;
126 rc.bottom -= 2;
127 rc.right = rc.left + 40;
128 CBrush brush (GetColor (id));
129 CBrush* pOldBrush = dc.SelectObject (&brush);
130 dc.Rectangle (rc);
131
132 dc.SelectObject (pOldBrush);
133 dc.SetTextColor (cr);
134 dc.SetBkMode (nBkMode);
135
136 dc.Detach ();
137}
138
139void ColorMenu::MeasureItem (LPMEASUREITEMSTRUCT lpMIS)
140{
141 ASSERT (lpMIS->CtlType == ODT_MENU);
142 UINT id = (UINT)(WORD)lpMIS->itemID;
143 ASSERT (id == lpMIS->itemData);
144 ASSERT (id >= kBaseFontColorCmd);
145 ASSERT (id <= kLastFontNamedColorCmd);
146 class CDisplayIC : public CDC {
147 public:
148 CDisplayIC ()
149 {
150 CreateIC (_T("DISPLAY"), NULL, NULL, NULL);
151 }
152 };
153 CDisplayIC dc;
154 CString strColor;
155 strColor.LoadString (id);
156 CSize sizeText = dc.GetTextExtent (strColor, strColor.GetLength ());
157 ASSERT (sizeText.cx < 500);
158 lpMIS->itemWidth = sizeText.cx + 50;
159 lpMIS->itemHeight = sizeText.cy;
160}
161#endif