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
133
134
135
136
137
138
139
140
|
#include "main.h"
#include "./resource.h"
#include "../nu/DialogSkinner.h"
#include <windowsx.h>
static HBRUSH hbBack = NULL;
#define TIMER_SHOWTEXT_ID 1985
#define TIMER_SHOWTEXT_DELAY 1000
static INT_PTR WINAPI DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
// public function
HWND CreateWaitWindow(HWND hwndParent, CHAR cLetter)
{
return WASABI_API_CREATEDIALOGPARAMW(IDD_VIEW_WAIT, hwndParent, DlgProc, (LPARAM)cLetter);
}
static void CALLBACK Window_TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
switch(idEvent)
{
case TIMER_SHOWTEXT_ID:
KillTimer(hwnd, TIMER_SHOWTEXT_ID);
SetDlgItemTextW(hwnd, IDC_LBL_TEXT, WASABI_API_LNGSTRINGW(IDS_READINGDISC));
break;
}
}
static INT_PTR Window_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
SendMessageW(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(IDC_BTN_SHOWINFO, BN_EX_GETTEXT), (LPARAM)GetDlgItem(hwnd, IDC_BTN_SHOWINFO));
SetTimer(hwnd, TIMER_SHOWTEXT_ID, TIMER_SHOWTEXT_DELAY, Window_TimerProc);
return 0;
}
static void Window_OnDestroy(HWND hwnd)
{
if (hbBack)
{
DeleteObject(hbBack);
hbBack = NULL;
}
}
static void Window_OnDisplayChange(HWND hwnd, INT dpi, INT resX, INT resY)
{
if (hbBack)
{
DeleteObject(hbBack);
hbBack = NULL;
}
RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN);
}
static void Window_OnWindowPosChanged(HWND hwnd, WINDOWPOS *pwp)
{
HWND hwndCtrl;
RECT rw;
hwndCtrl = GetDlgItem(hwnd, IDC_BTN_SHOWINFO);
if(hwndCtrl)
{
GetWindowRect(hwndCtrl, &rw);
OffsetRect(&rw, -rw.left, -rw.top);
SetWindowPos(hwndCtrl, NULL, pwp->cx - rw.right, pwp->cy - rw.bottom, 0, 0,
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW | SWP_NOCOPYBITS);
}
hwndCtrl = GetDlgItem(hwnd, IDC_LBL_TEXT);
if(hwndCtrl)
{
GetWindowRect(hwndCtrl, &rw);
MapWindowPoints(HWND_DESKTOP, hwnd, (POINT*)&rw, 2);
SetWindowPos(hwndCtrl, NULL, 0, 0, pwp->cx - rw.left - 2, pwp->cy - 22 - rw.top,
SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW | SWP_NOCOPYBITS);
}
if (0 == (SWP_NOREDRAW & pwp->flags))
{
InvalidateRect(hwnd, NULL, TRUE);
RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
}
}
static void Window_OnCommand(HWND hwnd, INT eventId, INT ctrlId, HWND hwndCtrl)
{
switch(ctrlId)
{
case IDC_BTN_SHOWINFO:
switch(eventId)
{
case BN_CLICKED:
SendMessageW(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(ctrlId, eventId),(LPARAM)hwndCtrl);
break;
}
break;
}
}
static HBRUSH Window_OnStaticColor(HWND hwnd, HDC hdc)
{
if (!hbBack) hbBack = CreateSolidBrush(dialogSkinner.Color(WADLG_ITEMBG));
SetTextColor(hdc, dialogSkinner.Color(WADLG_ITEMFG));
SetBkColor(hdc, dialogSkinner.Color(WADLG_ITEMBG));
return hbBack;
}
static void Window_OnPaint(HWND hwnd)
{
int tab[] = { IDC_LBL_TEXT | DCW_SUNKENBORDER};
dialogSkinner.Draw(hwnd, tab, 1);
}
static void Window_OnQueryInfo(HWND hwnd)
{
HWND hwndParent;
hwndParent = GetParent(hwnd);
if (hwndParent) SendMessageW(hwndParent, WM_SHOWFILEINFO, (WPARAM)WISF_NORMAL, (LPARAM)L"");
}
static INT_PTR WINAPI DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
INT_PTR result;
if (WM_CTLCOLORSTATIC == uMsg) return (INT_PTR)Window_OnStaticColor(hwnd, (HDC)wParam);
result = dialogSkinner.Handle(hwnd, uMsg, wParam, lParam);
if (result) return result;
switch(uMsg)
{
case WM_INITDIALOG: return (INT_PTR)Window_OnInitDialog(hwnd, (HWND)wParam, lParam);
case WM_DESTROY: Window_OnDestroy(hwnd); break;
case WM_DISPLAYCHANGE: Window_OnDisplayChange(hwnd, (INT)wParam, LOWORD(lParam), HIWORD(lParam)); break;
case WM_WINDOWPOSCHANGED: Window_OnWindowPosChanged(hwnd, (WINDOWPOS*)lParam); break;
case WM_COMMAND: Window_OnCommand(hwnd, HIWORD(wParam), LOWORD(wParam), (HWND)lParam); break;
case WM_PAINT: Window_OnPaint(hwnd); break;
case WM_QUERYFILEINFO: Window_OnQueryInfo(hwnd); break;
}
return 0;
}
|