[MSPAINT_NEW] bootstrap mspaint_new from mspaint
[reactos.git] / reactos / base / applications / mspaint_new / scrollbox.c
1 /*
2 * PROJECT: PAINT for ReactOS
3 * LICENSE: LGPL
4 * FILE: scrollbox.c
5 * PURPOSE: Functionality surrounding the scroll box window class
6 * PROGRAMMERS: Benedikt Freisen
7 */
8
9 /* INCLUDES *********************************************************/
10
11 #include "precomp.h"
12 #include "scrollbox.h"
13
14 /* FUNCTIONS ********************************************************/
15
16 void
17 RegisterWclScrollbox()
18 {
19 WNDCLASSEX wclScroll;
20 /* initializing and registering the window class used for the scroll box */
21 wclScroll.hInstance = hProgInstance;
22 wclScroll.lpszClassName = _T("Scrollbox");
23 wclScroll.lpfnWndProc = ScrollboxWinProc;
24 wclScroll.style = 0;
25 wclScroll.cbSize = sizeof(WNDCLASSEX);
26 wclScroll.hIcon = NULL;
27 wclScroll.hIconSm = NULL;
28 wclScroll.hCursor = LoadCursor(NULL, IDC_ARROW);
29 wclScroll.lpszMenuName = NULL;
30 wclScroll.cbClsExtra = 0;
31 wclScroll.cbWndExtra = 0;
32 wclScroll.hbrBackground = GetSysColorBrush(COLOR_APPWORKSPACE);
33 RegisterClassEx (&wclScroll);
34 }
35
36 void
37 UpdateScrollbox()
38 {
39 RECT clientRectScrollbox;
40 RECT clientRectImageArea;
41 SCROLLINFO si;
42 GetClientRect(hScrollbox, &clientRectScrollbox);
43 GetClientRect(hImageArea, &clientRectImageArea);
44 si.cbSize = sizeof(SCROLLINFO);
45 si.fMask = SIF_PAGE | SIF_RANGE;
46 si.nMax = clientRectImageArea.right + 6 - 1;
47 si.nMin = 0;
48 si.nPage = clientRectScrollbox.right;
49 SetScrollInfo(hScrollbox, SB_HORZ, &si, TRUE);
50 GetClientRect(hScrollbox, &clientRectScrollbox);
51 si.nMax = clientRectImageArea.bottom + 6 - 1;
52 si.nPage = clientRectScrollbox.bottom;
53 SetScrollInfo(hScrollbox, SB_VERT, &si, TRUE);
54 MoveWindow(hScrlClient,
55 -GetScrollPos(hScrollbox, SB_HORZ), -GetScrollPos(hScrollbox, SB_VERT),
56 max(clientRectImageArea.right + 6, clientRectScrollbox.right),
57 max(clientRectImageArea.bottom + 6, clientRectScrollbox.bottom), TRUE);
58 }
59
60 LRESULT CALLBACK
61 ScrollboxWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
62 {
63 switch (message)
64 {
65 case WM_SIZE:
66 if (hwnd == hScrollbox)
67 {
68 UpdateScrollbox();
69 }
70 break;
71 case WM_HSCROLL:
72 if (hwnd == hScrollbox)
73 {
74 SCROLLINFO si;
75 si.cbSize = sizeof(SCROLLINFO);
76 si.fMask = SIF_ALL;
77 GetScrollInfo(hScrollbox, SB_HORZ, &si);
78 switch (LOWORD(wParam))
79 {
80 case SB_THUMBTRACK:
81 case SB_THUMBPOSITION:
82 si.nPos = HIWORD(wParam);
83 break;
84 case SB_LINELEFT:
85 si.nPos -= 5;
86 break;
87 case SB_LINERIGHT:
88 si.nPos += 5;
89 break;
90 case SB_PAGELEFT:
91 si.nPos -= si.nPage;
92 break;
93 case SB_PAGERIGHT:
94 si.nPos += si.nPage;
95 break;
96 }
97 SetScrollInfo(hScrollbox, SB_HORZ, &si, TRUE);
98 MoveWindow(hScrlClient, -GetScrollPos(hScrollbox, SB_HORZ),
99 -GetScrollPos(hScrollbox, SB_VERT), imgXRes * zoom / 1000 + 6,
100 imgYRes * zoom / 1000 + 6, TRUE);
101 }
102 break;
103
104 case WM_VSCROLL:
105 if (hwnd == hScrollbox)
106 {
107 SCROLLINFO si;
108 si.cbSize = sizeof(SCROLLINFO);
109 si.fMask = SIF_ALL;
110 GetScrollInfo(hScrollbox, SB_VERT, &si);
111 switch (LOWORD(wParam))
112 {
113 case SB_THUMBTRACK:
114 case SB_THUMBPOSITION:
115 si.nPos = HIWORD(wParam);
116 break;
117 case SB_LINEUP:
118 si.nPos -= 5;
119 break;
120 case SB_LINEDOWN:
121 si.nPos += 5;
122 break;
123 case SB_PAGEUP:
124 si.nPos -= si.nPage;
125 break;
126 case SB_PAGEDOWN:
127 si.nPos += si.nPage;
128 break;
129 }
130 SetScrollInfo(hScrollbox, SB_VERT, &si, TRUE);
131 MoveWindow(hScrlClient, -GetScrollPos(hScrollbox, SB_HORZ),
132 -GetScrollPos(hScrollbox, SB_VERT), imgXRes * zoom / 1000 + 6,
133 imgYRes * zoom / 1000 + 6, TRUE);
134 }
135 break;
136
137 default:
138 return DefWindowProc(hwnd, message, wParam, lParam);
139 }
140
141 return 0;
142 }