Commit before breaking everything
[matches/honours.git] / research / transmission_spectroscopy / TOF / Win32++ / samples / Picture / src / View.cpp
1 //////////////////////////////////////////////\r
2 // View.cpp\r
3 //  Definitions for the CView class\r
4 \r
5 \r
6 #include "stdafx.h"\r
7 #include "PictureApp.h"\r
8 #include "Mainfrm.h"\r
9 #include "view.h"\r
10 #include "resource.h"\r
11 \r
12 #define HIMETRIC_INCH   2540\r
13 \r
14 CView::CView() : m_pPicture(NULL),m_BStrString(NULL),\r
15                                         m_xCurrentScroll(0), m_yCurrentScroll(0)\r
16 {\r
17         ::CoInitialize(NULL);\r
18 }\r
19 \r
20 CView::~CView()\r
21 {\r
22         if (m_pPicture)\r
23                 m_pPicture->Release();\r
24 \r
25         ::CoUninitialize();\r
26 }\r
27 \r
28 CRect CView::GetImageRect()\r
29 {\r
30         // get width and height of picture\r
31         long hmWidth = 0;\r
32         long hmHeight = 0;\r
33 \r
34         if (m_pPicture)\r
35         {\r
36                 m_pPicture->get_Width(&hmWidth);\r
37                 m_pPicture->get_Height(&hmHeight);\r
38         }\r
39 \r
40         // convert himetric to pixels\r
41         CClientDC dc(this);\r
42         int nWidth      = MulDiv(hmWidth, dc.GetDeviceCaps(LOGPIXELSX), HIMETRIC_INCH);\r
43         int nHeight     = MulDiv(hmHeight, dc.GetDeviceCaps(LOGPIXELSY), HIMETRIC_INCH);\r
44 \r
45         CRect rcImage;\r
46         rcImage.right = MAX(nWidth, 200);\r
47         rcImage.bottom = MAX(nHeight, 200);\r
48         return rcImage;\r
49 }\r
50 \r
51 void CView::NewPictureFile()\r
52 {\r
53         if (m_pPicture)\r
54         {\r
55                 m_pPicture->Release();\r
56                 m_pPicture = NULL;\r
57         }\r
58 \r
59         GetParent()->SetWindowText(LoadString(IDW_MAIN).c_str());\r
60         Invalidate();\r
61 }\r
62 \r
63 BOOL CView::LoadPictureFile(LPCTSTR szFile)\r
64 {\r
65         if (m_pPicture)\r
66         {\r
67                 m_pPicture->Release();\r
68                 m_pPicture = NULL;\r
69         }\r
70 \r
71         TRACE(szFile);\r
72         TRACE(_T("\n"));\r
73 \r
74         m_xCurrentScroll = 0;\r
75         m_yCurrentScroll = 0;\r
76         ShowScrollBar(SB_HORZ, FALSE);\r
77         ShowScrollBar(SB_VERT, FALSE);\r
78 \r
79         // Create IPicture from image file\r
80         if (S_OK == ::OleLoadPicturePath(T2OLE(szFile), NULL, 0, 0,     IID_IPicture, (LPVOID *)&m_pPicture))\r
81         {\r
82                 GetParent()->SetWindowText(szFile);\r
83                 CMainFrame& Frame = GetPicApp().GetMainFrame();\r
84                 Frame.AdjustFrameRect(GetImageRect());\r
85                 Invalidate();\r
86                 return TRUE;\r
87         }\r
88         else\r
89         {\r
90                 TRACE(_T("Failed to load picture\n"));\r
91 \r
92                 // Set Frame title back to default\r
93                 GetParent()->SetWindowText(LoadString(IDW_MAIN).c_str());\r
94                 return FALSE;\r
95         }\r
96 }\r
97 \r
98 void CView::OnDraw(CDC* pDC)\r
99 {\r
100         Paint(*pDC);\r
101 }\r
102 \r
103 void CView::OnInitialUpdate()\r
104 {\r
105         // Set the window background to black\r
106         m_Brush.CreateSolidBrush(RGB(0,0,0));\r
107         SetClassLongPtr(GCLP_HBRBACKGROUND, (LONG_PTR)m_Brush.GetHandle());\r
108 \r
109         // Load picture at startup\r
110         TCHAR szPath[MAX_STRING_SIZE];\r
111         TCHAR szFile[] = _T("/PongaFern.jpg");\r
112         GetCurrentDirectory(MAX_STRING_SIZE - lstrlen(szFile) , szPath);\r
113         lstrcat(szPath, _T("./PongaFern.jpg"));\r
114 \r
115         if (LoadPictureFile(szPath))\r
116         {\r
117                 CMainFrame& Frame = GetPicApp().GetMainFrame();\r
118                 CRect rcImage = GetImageRect();\r
119                 Frame.AdjustFrameRect(rcImage);\r
120         }\r
121 }\r
122 \r
123 void CView::OnHScroll(WPARAM wParam, LPARAM /*lParam*/)\r
124 {\r
125         int xNewPos;\r
126 \r
127         switch (LOWORD(wParam))\r
128         {\r
129                 case SB_PAGEUP: // User clicked the scroll bar shaft left of the scroll box.\r
130                         xNewPos = m_xCurrentScroll - 50;\r
131                         break;\r
132 \r
133                 case SB_PAGEDOWN: // User clicked the scroll bar shaft right of the scroll box.\r
134                         xNewPos = m_xCurrentScroll + 50;\r
135                         break;\r
136 \r
137                 case SB_LINEUP: // User clicked the left arrow.\r
138                         xNewPos = m_xCurrentScroll - 5;\r
139                         break;\r
140 \r
141                 case SB_LINEDOWN: // User clicked the right arrow.\r
142                         xNewPos = m_xCurrentScroll + 5;\r
143                         break;\r
144 \r
145                 case SB_THUMBPOSITION: // User dragged the scroll box.\r
146                         xNewPos = HIWORD(wParam);\r
147                         break;\r
148 \r
149                 case SB_THUMBTRACK: // User dragging the scroll box.\r
150                         xNewPos = HIWORD(wParam);\r
151                         break;\r
152 \r
153                 default:\r
154                         xNewPos = m_xCurrentScroll;\r
155         }\r
156 \r
157         // Scroll the window.\r
158         xNewPos = MAX(0, xNewPos);\r
159         xNewPos = MIN( xNewPos, GetImageRect().Width() - GetClientRect().Width() );\r
160         int xDelta = xNewPos - m_xCurrentScroll;\r
161         m_xCurrentScroll = xNewPos;\r
162         ScrollWindowEx(-xDelta, 0,  NULL, NULL, NULL, NULL, SW_INVALIDATE);\r
163 \r
164         // Reset the scroll bar.\r
165         SCROLLINFO si = {0};\r
166         si.cbSize = sizeof(si);\r
167         si.fMask  = SIF_RANGE | SIF_PAGE | SIF_POS;\r
168         si.fMask  = SIF_POS;\r
169         si.nPos   = m_xCurrentScroll;\r
170         SetScrollInfo(SB_HORZ, si, TRUE);\r
171 }\r
172 \r
173 void CView::OnVScroll(WPARAM wParam, LPARAM /*lParam*/)\r
174 {\r
175         int yNewPos;\r
176 \r
177         switch (LOWORD(wParam))\r
178         {\r
179                 case SB_PAGEUP: // User clicked the scroll bar shaft above the scroll box.\r
180                         yNewPos = m_yCurrentScroll - 50;\r
181                         break;\r
182 \r
183                 case SB_PAGEDOWN: // User clicked the scroll bar shaft below the scroll box.\r
184                         yNewPos = m_yCurrentScroll + 50;\r
185                         break;\r
186 \r
187                 case SB_LINEUP: // User clicked the top arrow.\r
188                         yNewPos = m_yCurrentScroll - 5;\r
189                         break;\r
190 \r
191                 case SB_LINEDOWN: // User clicked the bottom arrow.\r
192                         yNewPos = m_yCurrentScroll + 5;\r
193                         break;\r
194 \r
195                 case SB_THUMBPOSITION: // User dragged the scroll box.\r
196                         yNewPos = HIWORD(wParam);\r
197                         break;\r
198 \r
199                 case SB_THUMBTRACK: // User dragging the scroll box.\r
200                         yNewPos = HIWORD(wParam);\r
201                         break;\r
202 \r
203                 default:\r
204                         yNewPos = m_yCurrentScroll;\r
205         }\r
206 \r
207         // Scroll the window.\r
208         yNewPos = MAX(0, yNewPos);\r
209         yNewPos = MIN( yNewPos, GetImageRect().Height() - GetClientRect().Height() );\r
210         int yDelta = yNewPos - m_yCurrentScroll;\r
211         m_yCurrentScroll = yNewPos;\r
212         ScrollWindowEx(0, -yDelta, NULL, NULL, NULL, NULL, SW_INVALIDATE);\r
213 \r
214         // Reset the scroll bar.\r
215         SCROLLINFO si = {0};\r
216         si.cbSize = sizeof(si);\r
217         si.fMask  = SIF_RANGE | SIF_PAGE | SIF_POS;\r
218         si.cbSize = sizeof(si);\r
219         si.fMask  = SIF_POS;\r
220         si.nPos   = m_yCurrentScroll;\r
221         SetScrollInfo(SB_VERT, si, TRUE);\r
222 }\r
223 \r
224 void CView::OnWindowPosChanged(WPARAM /*wParam*/, LPARAM /*lParam*/)\r
225 {\r
226         if (m_pPicture)\r
227         {\r
228                 CRect rcImage = GetImageRect();\r
229                 DWORD dwStyle = (DWORD)GetWindowLongPtr(GWL_STYLE);\r
230                 DWORD dwExStyle = (DWORD)GetWindowLongPtr(GWL_EXSTYLE);\r
231                 AdjustWindowRectEx(&rcImage, dwStyle, FALSE, dwExStyle);\r
232 \r
233                 CRect rcView = GetClientRect();\r
234                 AdjustWindowRectEx(&rcView, dwStyle, FALSE, dwExStyle);\r
235 \r
236                 SCROLLINFO si = {0};\r
237                 si.cbSize = sizeof(si);\r
238                 si.fMask  = SIF_RANGE | SIF_PAGE | SIF_POS;\r
239                 si.nMin   = 0;\r
240 \r
241                 if (rcView.Width()  >= rcImage.Width())\r
242                 {\r
243                         m_xCurrentScroll = 0;\r
244                         ShowScrollBar(SB_HORZ, FALSE);\r
245                 }\r
246                 else\r
247                 {\r
248                         si.nMax   = rcImage.Width();\r
249                         si.nPage  = rcView.Width();\r
250                         si.nPos   = m_xCurrentScroll;\r
251                         SetScrollInfo(SB_HORZ, si, TRUE);\r
252                         ShowScrollBar(SB_HORZ, TRUE);\r
253                 }\r
254 \r
255                 if (rcView.Height() >= rcImage.Height())\r
256                 {\r
257                         m_yCurrentScroll = 0;\r
258                         ShowScrollBar(SB_VERT, FALSE);\r
259                 }\r
260                 else\r
261                 {\r
262                         si.nMax   = rcImage.Height();\r
263                         si.nPage  = rcView.Height();\r
264                         si.nPos   = m_yCurrentScroll;\r
265                         SetScrollInfo(SB_VERT, si, TRUE);\r
266                         ShowScrollBar(SB_VERT, TRUE);\r
267                 }\r
268 \r
269                 int xNewPos = MIN(m_xCurrentScroll, rcImage.Width() - rcView.Width());\r
270                 m_xCurrentScroll = MAX(xNewPos, 0);\r
271                 int yNewPos = MIN(m_yCurrentScroll, rcImage.Height() - rcView.Height());\r
272                 m_yCurrentScroll = MAX(yNewPos, 0);\r
273 \r
274                 // Paint the window directly to eliminate flicker\r
275                 CClientDC dcView(this);\r
276                 Paint(dcView);\r
277         }\r
278 }\r
279 \r
280 void CView::Paint(HDC hDC)\r
281 {\r
282         if (m_pPicture)\r
283         {\r
284                 // get width and height of picture\r
285                 long hmWidth;\r
286                 long hmHeight;\r
287                 m_pPicture->get_Width(&hmWidth);\r
288                 m_pPicture->get_Height(&hmHeight);\r
289 \r
290                 // convert himetric to pixels\r
291                 int nWidth      = MulDiv(hmWidth, GetDeviceCaps(hDC, LOGPIXELSX), HIMETRIC_INCH);\r
292                 int nHeight     = MulDiv(hmHeight, GetDeviceCaps(hDC, LOGPIXELSY), HIMETRIC_INCH);\r
293 \r
294                 // calculate himetric start pos\r
295                 int xStart = MulDiv(m_xCurrentScroll, HIMETRIC_INCH, GetDeviceCaps(hDC, LOGPIXELSX));\r
296                 int yStart = MulDiv(m_yCurrentScroll, HIMETRIC_INCH, GetDeviceCaps(hDC, LOGPIXELSY));\r
297 \r
298                 // Render the picture to the DC\r
299                 m_pPicture->Render(hDC, 0, 0, nWidth, nHeight, xStart, hmHeight - yStart, hmWidth, -hmHeight, NULL);\r
300         }\r
301 }\r
302 \r
303 void CView::PreCreate(CREATESTRUCT &cs)\r
304 {\r
305         // Set the Window Class name\r
306         cs.lpszClass = _T("PictureView");\r
307 \r
308         cs.style = WS_CHILD | WS_HSCROLL | WS_VSCROLL ;\r
309 \r
310         // Set the extended style\r
311         cs.dwExStyle = WS_EX_CLIENTEDGE;\r
312 }\r
313 \r
314 void CView::SavePicture(LPCTSTR szFile)\r
315 {\r
316         // get a IPictureDisp interface from your IPicture pointer\r
317         IPictureDisp *pDisp = NULL;\r
318 \r
319         if (SUCCEEDED(m_pPicture->QueryInterface(IID_IPictureDisp,  (void**) &pDisp)))\r
320         {\r
321                 // Save the IPicture image as a bitmap\r
322                 OleSavePictureFile(pDisp,  T2BSTR(szFile));\r
323                 pDisp->Release();\r
324         }\r
325 }\r
326 \r
327 LRESULT CView::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)\r
328 {\r
329         switch (uMsg)\r
330         {\r
331         case WM_WINDOWPOSCHANGED:\r
332                 OnWindowPosChanged(wParam, lParam);\r
333                 break;\r
334 \r
335         case WM_HSCROLL:\r
336                 OnHScroll(wParam, lParam);\r
337                 break;\r
338 \r
339         case WM_VSCROLL:\r
340                 OnVScroll(wParam, lParam);\r
341         break;\r
342         }\r
343 \r
344         // Pass unhandled messages on for default processing\r
345         return WndProcDefault(uMsg, wParam, lParam);\r
346 }\r
347 \r
348 \r

UCC git Repository :: git.ucc.asn.au