1 // CBrowseEdit.cpp: 实现文件
2 //
3
4 #include "stdafx.h"
5 #include "BrowseEdit.h"
6 #include "MusicPlayer2.h"
7 #include "DrawCommon.h"
8 #include "FileNameFormDlg.h"
9 #include "EditStringListDlg.h"
10
11 // CBrowseEdit
12
IMPLEMENT_DYNAMIC(CBrowseEdit,CMFCEditBrowseCtrl)13 IMPLEMENT_DYNAMIC(CBrowseEdit, CMFCEditBrowseCtrl)
14
15 CBrowseEdit::CBrowseEdit()
16 : m_theme_color(theApp.m_app_setting_data.theme_color)
17 {
18 }
19
~CBrowseEdit()20 CBrowseEdit::~CBrowseEdit()
21 {
22 }
23
OnDrawBrowseButton(CDC * pDC,CRect rect,BOOL bIsButtonPressed,BOOL bIsButtonHot)24 void CBrowseEdit::OnDrawBrowseButton(CDC * pDC, CRect rect, BOOL bIsButtonPressed, BOOL bIsButtonHot)
25 {
26 //使用双缓冲绘图
27 CDrawDoubleBuffer drawDoubleBuffer(pDC, rect);
28 CDrawCommon drawer;
29 drawer.Create(drawDoubleBuffer.GetMemDC(), GetFont());
30 CRect rc_draw{ rect };
31 rc_draw.MoveToXY(0, 0);
32
33 //使用圆角风格时,先填充背景色,再画按钮
34 if (theApp.m_app_setting_data.button_round_corners)
35 {
36 COLORREF back_color;
37 bool is_read_only = (GetStyle() & ES_READONLY) != 0;
38 if (is_read_only || !IsWindowEnabled())
39 back_color = GetSysColor(COLOR_3DFACE);
40 else
41 back_color = GetSysColor(COLOR_WINDOW);
42 drawer.GetDC()->FillSolidRect(rc_draw, back_color);
43 }
44
45 COLORREF btn_color;
46 if (bIsButtonPressed)
47 btn_color = m_theme_color.light1_5;
48 else if (bIsButtonHot)
49 btn_color = m_theme_color.light2_5;
50 else
51 btn_color = CColorConvert::m_gray_color.light3;
52 if (theApp.m_app_setting_data.button_round_corners)
53 {
54 CRect rc_btn{ rc_draw };
55 rc_btn.DeflateRect(theApp.DPI(1), theApp.DPI(1));
56 drawer.DrawRoundRect(rc_btn, btn_color, theApp.DPI(3));
57 }
58 else
59 {
60 drawer.GetDC()->FillSolidRect(rc_draw, btn_color);
61 }
62
63 IconMgr::IconType icon_type = IconMgr::IconType::IT_Folder;
64 if (m_Mode == BrowseMode_Default)
65 icon_type = IconMgr::IconType::IT_Edit;
66
67 HICON hIcon = theApp.m_icon_mgr.GetHICON(icon_type, IconMgr::IconStyle::IS_OutlinedDark, IconMgr::IconSize::IS_DPI_16);
68 CSize icon_size = theApp.m_icon_mgr.GetIconSize(IconMgr::IconSize::IS_DPI_16);
69 CPoint icon_top_left;
70 icon_top_left.x = rc_draw.left + theApp.DPI(4);
71 icon_top_left.y = rc_draw.top + (rc_draw.Height() - icon_size.cy) / 2;
72 drawer.DrawIcon(hIcon, icon_top_left, icon_size);
73
74 CRect rc_text = rc_draw;
75 rc_text.left += theApp.DPI(20);
76 COLORREF text_color = CColorConvert::m_gray_color.dark4;
77 if (!IsWindowEnabled())
78 text_color = CColorConvert::m_gray_color.dark1;
79 drawer.DrawWindowText(rc_text, m_btn_str.c_str(), text_color, Alignment::CENTER, true);
80 }
81
82
OnChangeLayout()83 void CBrowseEdit::OnChangeLayout()
84 {
85 ASSERT_VALID(this);
86 ENSURE(GetSafeHwnd() != NULL);
87
88 int btn_width;
89 if (m_Mode == BrowseMode_Default)
90 m_btn_str = theApp.m_str_table.LoadText(L"TXT_BROWSE_EDIT_EDIT");
91 else
92 m_btn_str = theApp.m_str_table.LoadText(L"TXT_BROWSE_EDIT_BROWSE");
93
94 //如果编辑框的宽度小于一定值,则不显示按钮后面的文本
95 CRect rect_client;
96 GetClientRect(rect_client);
97 if (rect_client.Width() < theApp.DPI(120))
98 {
99 m_btn_str = L"";
100 btn_width = theApp.DPI(24);
101 }
102 else
103 {
104 CDC* pDC = GetDC(); // OnChangeLayout仅在设置浏览模式时被调用,不需要保持DC
105 CDrawCommon drawer;
106 drawer.Create(pDC, GetFont());
107 btn_width = drawer.GetTextExtent(m_btn_str.c_str()).cx + theApp.DPI(28);
108 ReleaseDC(pDC);
109 }
110 m_nBrowseButtonWidth = max(btn_width, m_sizeImage.cx + 8);
111
112 SetWindowPos(NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE);
113
114 if (m_Mode != BrowseMode_None)
115 {
116 GetWindowRect(m_rectBtn);
117 m_rectBtn.left = m_rectBtn.right - m_nBrowseButtonWidth;
118
119 ScreenToClient(&m_rectBtn);
120 }
121 else
122 {
123 m_rectBtn.SetRectEmpty();
124 }
125
126 }
127
OnBrowse()128 void CBrowseEdit::OnBrowse()
129 {
130 ASSERT_VALID(this);
131 ENSURE(GetSafeHwnd() != NULL);
132
133 switch (m_Mode)
134 {
135 //浏览文件夹
136 case BrowseMode_Folder:
137 {
138 CString strFolder;
139 GetWindowText(strFolder);
140 CFolderPickerDialog dlg(strFolder);
141 if(!m_strBrowseFolderTitle.IsEmpty())
142 dlg.m_ofn.lpstrTitle = m_strBrowseFolderTitle;
143 if (dlg.DoModal() == IDOK)
144 {
145 CString strFolderNew = dlg.GetPathName();
146 strFolderNew.AppendChar(_T('\\'));
147 if(strFolderNew != strFolder)
148 {
149 SetWindowText(strFolderNew);
150 SetModify(TRUE);
151 OnAfterUpdate();
152 }
153 }
154 }
155 break;
156
157 //浏览文件
158 case BrowseMode_File:
159 {
160 CString strFile;
161 GetWindowText(strFile);
162
163 if (!strFile.IsEmpty())
164 {
165 TCHAR fname[_MAX_FNAME];
166
167 _tsplitpath_s(strFile, NULL, 0, NULL, 0, fname, _MAX_FNAME, NULL, 0);
168
169 CString strFileName = fname;
170 strFileName.TrimLeft();
171 strFileName.TrimRight();
172
173 if (strFileName.IsEmpty())
174 {
175 strFile.Empty();
176 }
177
178 const CString strInvalidChars = _T("*?<>|");
179 if (strFile.FindOneOf(strInvalidChars) >= 0)
180 {
181 strFile.Empty();
182 }
183 }
184
185 CFileDialog dlg(TRUE, !m_strDefFileExt.IsEmpty() ? (LPCTSTR)m_strDefFileExt : (LPCTSTR)NULL, strFile, m_dwFileDialogFlags, !m_strFileFilter.IsEmpty() ? (LPCTSTR)m_strFileFilter : (LPCTSTR)NULL, NULL);
186 if (dlg.DoModal() == IDOK && strFile != dlg.GetPathName())
187 {
188 SetWindowText(dlg.GetPathName());
189 SetModify(TRUE);
190 OnAfterUpdate();
191 }
192
193 if (GetParent() != NULL)
194 {
195 GetParent()->RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
196 }
197 }
198 break;
199
200 //自定义浏览模式
201 case BrowseMode_Default:
202 {
203 switch (m_browse_mode)
204 {
205 case CBrowseEdit::EditBrowseMode::RENAME:
206 {
207 CString strFile;
208 GetWindowText(strFile);
209 // 这里无视m_poopup_dlg_title设置的对话框标题,如果有必要再加
210 CFileNameFormDlg dlg;
211 dlg.SetInitInsertFormular(strFile.GetString());
212
213 if (dlg.DoModal() == IDOK && strFile != dlg.GetFormularSelected().c_str())
214 {
215 SetWindowText(dlg.GetFormularSelected().c_str());
216 SetModify(TRUE);
217 OnAfterUpdate();
218 }
219
220 if (GetParent() != NULL)
221 {
222 GetParent()->RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
223 }
224 }
225 break;
226 case CBrowseEdit::EditBrowseMode::LIST:
227 {
228 //列表模式下,将编辑框的文本以逗号分隔后以列表的形式编辑
229 CString strFile;
230 GetWindowText(strFile);
231 vector<wstring> items;
232 CCommon::StringSplit(wstring(strFile), L',', items);
233
234 CEditStringListDlg dlg(items);
235 dlg.SetTitle(m_poopup_dlg_title);
236 if (dlg.DoModal() == IDOK)
237 {
238 strFile = CCommon::StringMerge(items, L',').c_str();
239 SetWindowText(strFile);
240 SetModify(TRUE);
241 OnAfterUpdate();
242 }
243
244 if (GetParent() != NULL)
245 {
246 GetParent()->RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
247 }
248 }
249 break;
250 case CBrowseEdit::EditBrowseMode::LIST2:
251 {
252 // 列表模式2 下,将编辑框的文本用""包裹后以逗号分隔后以列表的形式编辑
253 CString strFile;
254 GetWindowText(strFile);
255 vector<wstring> items;
256 CCommon::SplitStringList(items, wstring(strFile));
257
258 CEditStringListDlg dlg(items);
259 dlg.SetTitle(m_poopup_dlg_title);
260 if (dlg.DoModal() == IDOK)
261 {
262 strFile = CCommon::MergeStringList(items).c_str();
263 SetWindowText(strFile);
264 SetModify(TRUE);
265 OnAfterUpdate();
266 }
267
268 if (GetParent() != NULL)
269 {
270 GetParent()->RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
271 }
272 }
273 break;
274 default:
275 ASSERT(false);
276 break;
277
278 }
279 }
280 break;
281 }
282
283 SetFocus();
284 }
285
OnAfterUpdate()286 void CBrowseEdit::OnAfterUpdate()
287 {
288 CWnd* pParent = GetParent();
289 if (pParent != nullptr)
290 pParent->SendMessage(WM_EDIT_BROWSE_CHANGED, 0, LPARAM(this));
291 }
292
SetEditBrowseMode(EditBrowseMode browse_mode)293 void CBrowseEdit::SetEditBrowseMode(EditBrowseMode browse_mode)
294 {
295 m_browse_mode = browse_mode;
296 EnableBrowseButton(TRUE); //将基类的编辑模式改成BrowseMode_Default
297 }
298
SetPopupDlgTitle(const wstring & popup_dlg_title)299 void CBrowseEdit::SetPopupDlgTitle(const wstring& popup_dlg_title)
300 {
301 m_poopup_dlg_title = popup_dlg_title.c_str();
302 }
303
BEGIN_MESSAGE_MAP(CBrowseEdit,CMFCEditBrowseCtrl)304 BEGIN_MESSAGE_MAP(CBrowseEdit, CMFCEditBrowseCtrl)
305 ON_WM_NCLBUTTONDOWN()
306 ON_MESSAGE(WM_TABLET_QUERYSYSTEMGESTURESTATUS, &CBrowseEdit::OnTabletQuerysystemgesturestatus)
307 END_MESSAGE_MAP()
308
309
310 void CBrowseEdit::OnNcLButtonDown(UINT nHitTest, CPoint point)
311 {
312 if (HTCAPTION == nHitTest)
313 {
314 return;
315 }
316 CMFCEditBrowseCtrl::OnNcLButtonDown(nHitTest, point);
317 }
318
319
OnTabletQuerysystemgesturestatus(WPARAM wParam,LPARAM lParam)320 afx_msg LRESULT CBrowseEdit::OnTabletQuerysystemgesturestatus(WPARAM wParam, LPARAM lParam)
321 {
322 return 0;
323 }
324