xref: /MusicPlayer2/MusicPlayer2/BrowseEdit.cpp (revision d0f663722daed37d7c579eeb34fb31f1424fe445)
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