xref: /MusicPlayer2/MusicPlayer2/SearchEditCtrl.cpp (revision db7d7dda1eb6b31c576728607b855910b129e090)
1 // CSearchEditCtrl.cpp: 实现文件
2 //
3 
4 #include "stdafx.h"
5 #include "SearchEditCtrl.h"
6 #include "MusicPlayer2.h"
7 #include "DrawCommon.h"
8 #include <algorithm>
9 #undef min
10 #undef max
11 
12 // CSearchEditCtrl
13 
IMPLEMENT_DYNAMIC(CSearchEditCtrl,CMFCEditBrowseCtrl)14 IMPLEMENT_DYNAMIC(CSearchEditCtrl, CMFCEditBrowseCtrl)
15 
16 CSearchEditCtrl::CSearchEditCtrl()
17     : m_theme_color(theApp.m_app_setting_data.theme_color)
18 {
19 }
20 
~CSearchEditCtrl()21 CSearchEditCtrl::~CSearchEditCtrl()
22 {
23 }
24 
OnBrowse()25 void CSearchEditCtrl::OnBrowse()
26 {
27     CWnd* pParent = GetParent();
28     if (pParent != nullptr)
29         pParent->SendMessage(WM_SEARCH_EDIT_BTN_CLICKED, (WPARAM)this, 0);
30 }
31 
OnDrawBrowseButton(CDC * pDC,CRect rect,BOOL bIsButtonPressed,BOOL bIsButtonHot)32 void CSearchEditCtrl::OnDrawBrowseButton(CDC * pDC, CRect rect, BOOL bIsButtonPressed, BOOL bIsButtonHot)
33 {
34     //使用双缓冲绘图
35     CDrawDoubleBuffer drawDoubleBuffer(pDC, rect);
36     CDrawCommon drawer;
37     drawer.Create(drawDoubleBuffer.GetMemDC());
38     CRect rc_draw{ rect };
39     rc_draw.MoveToXY(0, 0);
40 
41     m_draw_clear_btn = (GetWindowTextLength() > 0);
42 
43     //使用圆角风格时,先填充背景色,再画按钮
44     if (theApp.m_app_setting_data.button_round_corners)
45     {
46         COLORREF back_color;
47         bool is_read_only = (GetStyle() & ES_READONLY) != 0;
48         if (is_read_only || !IsWindowEnabled())
49             back_color = GetSysColor(COLOR_3DFACE);
50         else
51             back_color = GetSysColor(COLOR_WINDOW);
52         drawer.GetDC()->FillSolidRect(rc_draw, back_color);
53     }
54 
55     COLORREF btn_color;
56     if (m_draw_clear_btn)
57     {
58         if (bIsButtonPressed)
59             btn_color = m_theme_color.light1_5;
60         else if (bIsButtonHot)
61             btn_color = m_theme_color.light2_5;
62         else
63             btn_color = CColorConvert::m_gray_color.light3;
64     }
65     else
66     {
67         btn_color = GetSysColor(COLOR_WINDOW);
68     }
69 
70     if (theApp.m_app_setting_data.button_round_corners)
71     {
72         CRect rc_btn{ rc_draw };
73         rc_btn.DeflateRect(theApp.DPI(1), theApp.DPI(1));
74         drawer.DrawRoundRect(rc_btn, btn_color, theApp.DPI(3));
75     }
76     else
77     {
78         drawer.GetDC()->FillSolidRect(rc_draw, btn_color);
79     }
80 
81     IconMgr::IconType icon_type = IconMgr::IconType::IT_Find;
82     if (m_draw_clear_btn)   // 文本框为空时显示搜索图标,否则显示关闭图标
83         icon_type = IconMgr::IconType::IT_Cancel;
84     IconMgr::IconSize size_type = m_big_icon ? IconMgr::IconSize::IS_DPI_16_Full_Screen : IconMgr::IconSize::IS_DPI_16;
85     HICON hIcon = theApp.m_icon_mgr.GetHICON(icon_type, IconMgr::IconStyle::IS_OutlinedDark, size_type);
86     CSize icon_size = IconMgr::GetIconSize(size_type);
87     CPoint icon_top_left;
88     icon_top_left.x = rc_draw.left + (rc_draw.Width() - icon_size.cx) / 2;
89     icon_top_left.y = rc_draw.top + (rc_draw.Height() - icon_size.cy) / 2;
90     drawer.DrawIcon(hIcon, icon_top_left, icon_size);
91 
92     static bool last_draw_clear_btn{ false };
93     if (last_draw_clear_btn != m_draw_clear_btn)
94     {
95         UpdateToolTipPosition();
96         last_draw_clear_btn = m_draw_clear_btn;
97     }
98 }
99 
100 
OnChangeLayout()101 void CSearchEditCtrl::OnChangeLayout()
102 {
103     ASSERT_VALID(this);
104     ENSURE(GetSafeHwnd() != NULL);
105 
106     CRect rc_client;
107     GetWindowRect(rc_client);
108     m_nBrowseButtonWidth = std::max({ theApp.DPI(20), rc_client.Height() - theApp.DPI(3), static_cast<int>(m_sizeImage.cx + 8) });
109 
110     SetWindowPos(NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE);
111 
112     if (m_Mode != BrowseMode_None)
113     {
114         GetWindowRect(m_rectBtn);
115         m_rectBtn.left = m_rectBtn.right - m_nBrowseButtonWidth;
116 
117         ScreenToClient(&m_rectBtn);
118     }
119     else
120     {
121         m_rectBtn.SetRectEmpty();
122     }
123 
124 }
125 
SetBigIcon(bool big_icon)126 void CSearchEditCtrl::SetBigIcon(bool big_icon)
127 {
128     m_big_icon = big_icon;
129 }
130 
UpdateToolTipPosition()131 void CSearchEditCtrl::UpdateToolTipPosition()
132 {
133     CRect rc_client;
134     GetWindowRect(rc_client);
135     rc_client.MoveToXY(0, 0);
136     if(m_draw_clear_btn)
137     {
138         CRect rc_edit = rc_client;
139         rc_edit.right = rc_client.right - m_nBrowseButtonWidth - theApp.DPI(4);
140         CRect rc_btn = rc_client;
141         rc_btn.left = rc_edit.right + theApp.DPI(2);
142         m_tool_tip.SetToolRect(this, 1, rc_btn);
143         m_tool_tip.SetToolRect(this, 2, rc_edit);
144     }
145     else
146     {
147         m_tool_tip.SetToolRect(this, 1, CRect());
148         m_tool_tip.SetToolRect(this, 2, rc_client);
149     }
150 }
151 
BEGIN_MESSAGE_MAP(CSearchEditCtrl,CMFCEditBrowseCtrl)152 BEGIN_MESSAGE_MAP(CSearchEditCtrl, CMFCEditBrowseCtrl)
153     ON_WM_SIZE()
154     ON_CONTROL_REFLECT_EX(EN_CHANGE, &CSearchEditCtrl::OnEnChange)
155     ON_WM_NCLBUTTONDOWN()
156     ON_MESSAGE(WM_TABLET_QUERYSYSTEMGESTURESTATUS, &CSearchEditCtrl::OnTabletQuerysystemgesturestatus)
157 END_MESSAGE_MAP()
158 
159 
160 
161 // CSearchEditCtrl 消息处理程序
162 
163 
164 
165 
166 void CSearchEditCtrl::PreSubclassWindow()
167 {
168     // TODO: 在此添加专用代码和/或调用基类
169     m_tool_tip.Create(this, TTS_ALWAYSTIP);
170     m_tool_tip.SetMaxTipWidth(theApp.DPI(400));
171     m_tool_tip.AddTool(this, theApp.m_str_table.LoadText(L"TIP_SEARCH_EDIT_CLEAN").c_str(), CRect(), 1);
172     m_tool_tip.AddTool(this, theApp.m_str_table.LoadText(L"TIP_SEARCH_EDIT_INPUT").c_str(), CRect(), 2);
173     UpdateToolTipPosition();
174 
175     CMFCEditBrowseCtrl::PreSubclassWindow();
176 }
177 
178 
PreTranslateMessage(MSG * pMsg)179 BOOL CSearchEditCtrl::PreTranslateMessage(MSG* pMsg)
180 {
181     // TODO: 在此添加专用代码和/或调用基类
182     if (pMsg->message == WM_MOUSEMOVE)
183         m_tool_tip.RelayEvent(pMsg);
184 
185 
186     return CMFCEditBrowseCtrl::PreTranslateMessage(pMsg);
187 }
188 
189 
OnSize(UINT nType,int cx,int cy)190 void CSearchEditCtrl::OnSize(UINT nType, int cx, int cy)
191 {
192     CMFCEditBrowseCtrl::OnSize(nType, cx, cy);
193 
194     // TODO: 在此处添加消息处理程序代码
195     UpdateToolTipPosition();
196 }
197 
198 
OnEnChange()199 BOOL CSearchEditCtrl::OnEnChange()
200 {
201     // TODO:  如果该控件是 RICHEDIT 控件,它将不
202     // 发送此通知,除非重写 CMFCEditBrowseCtrl::OnInitDialog()
203     // 函数并调用 CRichEditCtrl().SetEventMask(),
204     // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
205 
206     // TODO:  在此添加控件通知处理程序代码
207     OnNcPaint();
208     return FALSE;           //这里返回FALSE表示EN_CHANGE的响应还没有响应完,此消息仍然会被发送到父窗口,否则表示这里已经做完所有的事情,消息不会被发送到父窗口
209 }
210 
211 
OnNcLButtonDown(UINT nHitTest,CPoint point)212 void CSearchEditCtrl::OnNcLButtonDown(UINT nHitTest, CPoint point)
213 {
214     if (HTCAPTION == nHitTest)
215     {
216         return;
217     }
218     CMFCEditBrowseCtrl::OnNcLButtonDown(nHitTest, point);
219 }
220 
221 
OnTabletQuerysystemgesturestatus(WPARAM wParam,LPARAM lParam)222 afx_msg LRESULT CSearchEditCtrl::OnTabletQuerysystemgesturestatus(WPARAM wParam, LPARAM lParam)
223 {
224     return 0;
225 }
226