/
datepicker_win32.cpp
132 lines (112 loc) · 3.9 KB
/
datepicker_win32.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "datepicker.h"
#include "externalview_hwnd.h"
#include "vstgui/lib/platform/win32/win32factory.h"
#include <CommCtrl.h>
//------------------------------------------------------------------------
namespace VSTGUI {
namespace ExternalView {
//------------------------------------------------------------------------
struct DatePicker::Impl : ExternalHWNDBase
{
using Base::Base;
~Impl () noexcept
{
if (font)
DeleteObject (font);
}
ChangeCallback changeCallback;
HFONT font {nullptr};
};
//------------------------------------------------------------------------
DatePicker::DatePicker ()
{
auto hInstance = getPlatformFactory ().asWin32Factory ()->getInstance ();
impl = std::make_unique<Impl> (hInstance);
impl->child = CreateWindowExW (0, DATETIMEPICK_CLASS, TEXT ("DateTime"),
WS_BORDER | WS_CHILD | WS_VISIBLE | DTS_SHORTDATEFORMAT, 0, 0,
80, 20, impl->container.getHWND (), NULL, hInstance, NULL);
impl->container.setWindowProc ([this] (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message)
{
case WM_NOTIFY:
{
LPNMHDR hdr = reinterpret_cast<LPNMHDR> (lParam);
switch (hdr->code)
{
case DTN_DATETIMECHANGE:
{
LPNMDATETIMECHANGE lpChange = reinterpret_cast<LPNMDATETIMECHANGE> (lParam);
if (impl->changeCallback)
{
Date date;
date.day = lpChange->st.wDay;
date.month = lpChange->st.wMonth;
date.year = lpChange->st.wYear;
impl->changeCallback (date);
}
break;
}
}
break;
}
}
return DefWindowProc (hwnd, message, wParam, lParam);
});
}
//------------------------------------------------------------------------
DatePicker::~DatePicker () noexcept {}
//------------------------------------------------------------------------
void DatePicker::setDate (Date date)
{
SYSTEMTIME st = {};
st.wDay = date.day;
st.wMonth = date.month;
st.wYear = date.year;
DateTime_SetSystemtime (impl->child, GDT_VALID, &st);
}
//------------------------------------------------------------------------
void DatePicker::setChangeCallback (const ChangeCallback& callback)
{
impl->changeCallback = callback;
}
//------------------------------------------------------------------------
bool DatePicker::platformViewTypeSupported (PlatformViewType type)
{
return impl->platformViewTypeSupported (type);
}
//------------------------------------------------------------------------
bool DatePicker::attach (void* parent, PlatformViewType parentViewType)
{
return impl->attach (parent, parentViewType);
}
//------------------------------------------------------------------------
bool DatePicker::remove () { return impl->remove (); }
//------------------------------------------------------------------------
void DatePicker::setViewSize (IntRect frame, IntRect visible)
{
impl->setViewSize (frame, visible);
}
//------------------------------------------------------------------------
void DatePicker::setContentScaleFactor (double scaleFactor)
{
if (impl->font)
DeleteObject (impl->font);
auto logFont = NonClientMetrics::get ().lfCaptionFont;
logFont.lfHeight = static_cast<LONG> (std::round (logFont.lfHeight * scaleFactor));
impl->font = CreateFontIndirect (&logFont);
if (impl->font)
SendMessage (impl->child, WM_SETFONT, (WPARAM)impl->font, 0);
}
//------------------------------------------------------------------------
void DatePicker::setMouseEnabled (bool state) { impl->setMouseEnabled (state); }
//------------------------------------------------------------------------
void DatePicker::takeFocus () { impl->takeFocus (); }
//------------------------------------------------------------------------
void DatePicker::looseFocus () { impl->looseFocus (); }
void DatePicker::setTookFocusCallback (const TookFocusCallback& callback)
{
impl->setTookFocusCallback (callback);
}
//------------------------------------------------------------------------
} // ExternalView
} // VSTGUI