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