1 // CMenuEditCtrl.cpp: 实现文件
2 //
3
4 #include "stdafx.h"
5 #include "MenuEditCtrl.h"
6 #include "MusicPlayer2.h"
7 #include "DrawCommon.h"
8
9 // CMenuEditCtrl
10
IMPLEMENT_DYNAMIC(CMenuEditCtrl,CMFCEditBrowseCtrl)11 IMPLEMENT_DYNAMIC(CMenuEditCtrl, CMFCEditBrowseCtrl)
12
13 CMenuEditCtrl::CMenuEditCtrl()
14 : m_theme_color(theApp.m_app_setting_data.theme_color)
15 {
16 }
17
~CMenuEditCtrl()18 CMenuEditCtrl::~CMenuEditCtrl()
19 {
20 }
21
SetTooltopText(const CString & tooltip_text)22 void CMenuEditCtrl::SetTooltopText(const CString& tooltip_text)
23 {
24 m_tooltip_text = tooltip_text;
25 }
26
OnBrowse()27 void CMenuEditCtrl::OnBrowse()
28 {
29 PostMessage(WM_KILLFOCUS, 0, 0);
30 CRect rect;
31 GetWindowRect(rect);
32 //ClientToScreen(rect);
33 theApp.m_menu_mgr.GetMenu(MenuMgr::RecentFolderPlaylistMenu)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, rect.left, rect.bottom, AfxGetMainWnd());
34 }
35
OnDrawBrowseButton(CDC * pDC,CRect rect,BOOL bIsButtonPressed,BOOL bIsButtonHot)36 void CMenuEditCtrl::OnDrawBrowseButton(CDC* pDC, CRect rect, BOOL bIsButtonPressed, BOOL bIsButtonHot)
37 {
38 if (m_btn_rect != rect)
39 {
40 m_btn_rect = rect;
41 UpdateToolTipPosition();
42 }
43 //使用双缓冲绘图
44 CDrawDoubleBuffer drawDoubleBuffer(pDC, rect);
45 CDrawCommon drawer;
46 drawer.Create(drawDoubleBuffer.GetMemDC());
47 CRect rc_draw{ rect };
48 rc_draw.MoveToXY(0, 0);
49
50 //使用圆角风格时,先填充背景色,再画按钮
51 if (theApp.m_app_setting_data.button_round_corners)
52 {
53 COLORREF back_color;
54 bool is_read_only = (GetStyle() & ES_READONLY) != 0;
55 if (is_read_only || !IsWindowEnabled())
56 back_color = GetSysColor(COLOR_3DFACE);
57 else
58 back_color = GetSysColor(COLOR_WINDOW);
59 drawer.GetDC()->FillSolidRect(rc_draw, back_color);
60 }
61
62 COLORREF btn_color;
63 if (bIsButtonPressed)
64 btn_color = m_theme_color.light1_5;
65 else if (bIsButtonHot)
66 btn_color = m_theme_color.light2_5;
67 else
68 btn_color = CColorConvert::m_gray_color.light3;
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 CSize icon_size(theApp.DPI(16), theApp.DPI(16));
82 CPoint icon_top_left;
83 icon_top_left.x = rc_draw.left + (rc_draw.Width() - icon_size.cx) / 2;
84 icon_top_left.y = rc_draw.top + (rc_draw.Height() - icon_size.cy) / 2;
85 HICON hIcon = theApp.m_icon_mgr.GetHICON(IconMgr::IconType::IT_Triangle_Down, IconMgr::IconStyle::IS_OutlinedDark, IconMgr::IconSize::IS_DPI_16);
86 drawer.DrawIcon(hIcon, icon_top_left, icon_size);
87 }
88
89
OnChangeLayout()90 void CMenuEditCtrl::OnChangeLayout()
91 {
92 ASSERT_VALID(this);
93 ENSURE(GetSafeHwnd() != NULL);
94
95 m_nBrowseButtonWidth = max(theApp.DPI(20), m_sizeImage.cx + 8);
96
97 SetWindowPos(NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE);
98
99 if (m_Mode != BrowseMode_None)
100 {
101 GetWindowRect(m_rectBtn);
102 m_rectBtn.left = m_rectBtn.right - m_nBrowseButtonWidth;
103
104 ScreenToClient(&m_rectBtn);
105 }
106 else
107 {
108 m_rectBtn.SetRectEmpty();
109 }
110
111 }
112
UpdateToolTipPosition()113 void CMenuEditCtrl::UpdateToolTipPosition()
114 {
115 if (!m_btn_rect.IsRectEmpty())
116 m_tool_tip.SetToolRect(this, 1, m_btn_rect);
117 }
118
BEGIN_MESSAGE_MAP(CMenuEditCtrl,CMFCEditBrowseCtrl)119 BEGIN_MESSAGE_MAP(CMenuEditCtrl, CMFCEditBrowseCtrl)
120 ON_WM_NCLBUTTONDOWN()
121 ON_MESSAGE(WM_TABLET_QUERYSYSTEMGESTURESTATUS, &CMenuEditCtrl::OnTabletQuerysystemgesturestatus)
122 END_MESSAGE_MAP()
123
124
125
126 void CMenuEditCtrl::OnNcLButtonDown(UINT nHitTest, CPoint point)
127 {
128 if (HTCAPTION == nHitTest)
129 {
130 return;
131 }
132 CMFCEditBrowseCtrl::OnNcLButtonDown(nHitTest, point);
133 }
134
135
OnTabletQuerysystemgesturestatus(WPARAM wParam,LPARAM lParam)136 afx_msg LRESULT CMenuEditCtrl::OnTabletQuerysystemgesturestatus(WPARAM wParam, LPARAM lParam)
137 {
138 return 0;
139 }
140
141
PreSubclassWindow()142 void CMenuEditCtrl::PreSubclassWindow()
143 {
144 // TODO: 在此添加专用代码和/或调用基类
145 m_tool_tip.Create(this, TTS_ALWAYSTIP);
146 m_tool_tip.SetMaxTipWidth(theApp.DPI(400));
147 m_tool_tip.AddTool(this, m_tooltip_text, CRect(), 1);
148 UpdateToolTipPosition();
149
150 CMFCEditBrowseCtrl::PreSubclassWindow();
151 }
152
153
PreTranslateMessage(MSG * pMsg)154 BOOL CMenuEditCtrl::PreTranslateMessage(MSG* pMsg)
155 {
156 // TODO: 在此添加专用代码和/或调用基类
157 if (pMsg->message == WM_MOUSEMOVE)
158 m_tool_tip.RelayEvent(pMsg);
159
160 return CMFCEditBrowseCtrl::PreTranslateMessage(pMsg);
161 }
162