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