1 //////////////////////////////////////////////
\r
3 // Definitions for the CView class
\r
7 #include "PictureApp.h"
\r
10 #include "resource.h"
\r
12 #define HIMETRIC_INCH 2540
\r
14 CView::CView() : m_pPicture(NULL),m_BStrString(NULL),
\r
15 m_xCurrentScroll(0), m_yCurrentScroll(0)
\r
17 ::CoInitialize(NULL);
\r
23 m_pPicture->Release();
\r
28 CRect CView::GetImageRect()
\r
30 // get width and height of picture
\r
36 m_pPicture->get_Width(&hmWidth);
\r
37 m_pPicture->get_Height(&hmHeight);
\r
40 // convert himetric to pixels
\r
42 int nWidth = MulDiv(hmWidth, dc.GetDeviceCaps(LOGPIXELSX), HIMETRIC_INCH);
\r
43 int nHeight = MulDiv(hmHeight, dc.GetDeviceCaps(LOGPIXELSY), HIMETRIC_INCH);
\r
46 rcImage.right = MAX(nWidth, 200);
\r
47 rcImage.bottom = MAX(nHeight, 200);
\r
51 void CView::NewPictureFile()
\r
55 m_pPicture->Release();
\r
59 GetParent()->SetWindowText(LoadString(IDW_MAIN).c_str());
\r
63 BOOL CView::LoadPictureFile(LPCTSTR szFile)
\r
67 m_pPicture->Release();
\r
74 m_xCurrentScroll = 0;
\r
75 m_yCurrentScroll = 0;
\r
76 ShowScrollBar(SB_HORZ, FALSE);
\r
77 ShowScrollBar(SB_VERT, FALSE);
\r
79 // Create IPicture from image file
\r
80 if (S_OK == ::OleLoadPicturePath(T2OLE(szFile), NULL, 0, 0, IID_IPicture, (LPVOID *)&m_pPicture))
\r
82 GetParent()->SetWindowText(szFile);
\r
83 CMainFrame& Frame = GetPicApp().GetMainFrame();
\r
84 Frame.AdjustFrameRect(GetImageRect());
\r
90 TRACE(_T("Failed to load picture\n"));
\r
92 // Set Frame title back to default
\r
93 GetParent()->SetWindowText(LoadString(IDW_MAIN).c_str());
\r
98 void CView::OnDraw(CDC* pDC)
\r
103 void CView::OnInitialUpdate()
\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
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
115 if (LoadPictureFile(szPath))
\r
117 CMainFrame& Frame = GetPicApp().GetMainFrame();
\r
118 CRect rcImage = GetImageRect();
\r
119 Frame.AdjustFrameRect(rcImage);
\r
123 void CView::OnHScroll(WPARAM wParam, LPARAM /*lParam*/)
\r
127 switch (LOWORD(wParam))
\r
129 case SB_PAGEUP: // User clicked the scroll bar shaft left of the scroll box.
\r
130 xNewPos = m_xCurrentScroll - 50;
\r
133 case SB_PAGEDOWN: // User clicked the scroll bar shaft right of the scroll box.
\r
134 xNewPos = m_xCurrentScroll + 50;
\r
137 case SB_LINEUP: // User clicked the left arrow.
\r
138 xNewPos = m_xCurrentScroll - 5;
\r
141 case SB_LINEDOWN: // User clicked the right arrow.
\r
142 xNewPos = m_xCurrentScroll + 5;
\r
145 case SB_THUMBPOSITION: // User dragged the scroll box.
\r
146 xNewPos = HIWORD(wParam);
\r
149 case SB_THUMBTRACK: // User dragging the scroll box.
\r
150 xNewPos = HIWORD(wParam);
\r
154 xNewPos = m_xCurrentScroll;
\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
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
173 void CView::OnVScroll(WPARAM wParam, LPARAM /*lParam*/)
\r
177 switch (LOWORD(wParam))
\r
179 case SB_PAGEUP: // User clicked the scroll bar shaft above the scroll box.
\r
180 yNewPos = m_yCurrentScroll - 50;
\r
183 case SB_PAGEDOWN: // User clicked the scroll bar shaft below the scroll box.
\r
184 yNewPos = m_yCurrentScroll + 50;
\r
187 case SB_LINEUP: // User clicked the top arrow.
\r
188 yNewPos = m_yCurrentScroll - 5;
\r
191 case SB_LINEDOWN: // User clicked the bottom arrow.
\r
192 yNewPos = m_yCurrentScroll + 5;
\r
195 case SB_THUMBPOSITION: // User dragged the scroll box.
\r
196 yNewPos = HIWORD(wParam);
\r
199 case SB_THUMBTRACK: // User dragging the scroll box.
\r
200 yNewPos = HIWORD(wParam);
\r
204 yNewPos = m_yCurrentScroll;
\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
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
224 void CView::OnWindowPosChanged(WPARAM /*wParam*/, LPARAM /*lParam*/)
\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
233 CRect rcView = GetClientRect();
\r
234 AdjustWindowRectEx(&rcView, dwStyle, FALSE, dwExStyle);
\r
236 SCROLLINFO si = {0};
\r
237 si.cbSize = sizeof(si);
\r
238 si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
\r
241 if (rcView.Width() >= rcImage.Width())
\r
243 m_xCurrentScroll = 0;
\r
244 ShowScrollBar(SB_HORZ, FALSE);
\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
255 if (rcView.Height() >= rcImage.Height())
\r
257 m_yCurrentScroll = 0;
\r
258 ShowScrollBar(SB_VERT, FALSE);
\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
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
274 // Paint the window directly to eliminate flicker
\r
275 CClientDC dcView(this);
\r
280 void CView::Paint(HDC hDC)
\r
284 // get width and height of picture
\r
287 m_pPicture->get_Width(&hmWidth);
\r
288 m_pPicture->get_Height(&hmHeight);
\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
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
298 // Render the picture to the DC
\r
299 m_pPicture->Render(hDC, 0, 0, nWidth, nHeight, xStart, hmHeight - yStart, hmWidth, -hmHeight, NULL);
\r
303 void CView::PreCreate(CREATESTRUCT &cs)
\r
305 // Set the Window Class name
\r
306 cs.lpszClass = _T("PictureView");
\r
308 cs.style = WS_CHILD | WS_HSCROLL | WS_VSCROLL ;
\r
310 // Set the extended style
\r
311 cs.dwExStyle = WS_EX_CLIENTEDGE;
\r
314 void CView::SavePicture(LPCTSTR szFile)
\r
316 // get a IPictureDisp interface from your IPicture pointer
\r
317 IPictureDisp *pDisp = NULL;
\r
319 if (SUCCEEDED(m_pPicture->QueryInterface(IID_IPictureDisp, (void**) &pDisp)))
\r
321 // Save the IPicture image as a bitmap
\r
322 OleSavePictureFile(pDisp, T2BSTR(szFile));
\r
327 LRESULT CView::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
\r
331 case WM_WINDOWPOSCHANGED:
\r
332 OnWindowPosChanged(wParam, lParam);
\r
336 OnHScroll(wParam, lParam);
\r
340 OnVScroll(wParam, lParam);
\r
344 // Pass unhandled messages on for default processing
\r
345 return WndProcDefault(uMsg, wParam, lParam);
\r