--- /dev/null
+//////////////////////////////////////////////\r
+// View.cpp\r
+// Definitions for the CView class\r
+\r
+\r
+#include "stdafx.h"\r
+#include "PictureApp.h"\r
+#include "Mainfrm.h"\r
+#include "view.h"\r
+#include "resource.h"\r
+\r
+#define HIMETRIC_INCH 2540\r
+\r
+CView::CView() : m_pPicture(NULL),m_BStrString(NULL),\r
+ m_xCurrentScroll(0), m_yCurrentScroll(0)\r
+{\r
+ ::CoInitialize(NULL);\r
+}\r
+\r
+CView::~CView()\r
+{\r
+ if (m_pPicture)\r
+ m_pPicture->Release();\r
+\r
+ ::CoUninitialize();\r
+}\r
+\r
+CRect CView::GetImageRect()\r
+{\r
+ // get width and height of picture\r
+ long hmWidth = 0;\r
+ long hmHeight = 0;\r
+\r
+ if (m_pPicture)\r
+ {\r
+ m_pPicture->get_Width(&hmWidth);\r
+ m_pPicture->get_Height(&hmHeight);\r
+ }\r
+\r
+ // convert himetric to pixels\r
+ CClientDC dc(this);\r
+ int nWidth = MulDiv(hmWidth, dc.GetDeviceCaps(LOGPIXELSX), HIMETRIC_INCH);\r
+ int nHeight = MulDiv(hmHeight, dc.GetDeviceCaps(LOGPIXELSY), HIMETRIC_INCH);\r
+\r
+ CRect rcImage;\r
+ rcImage.right = MAX(nWidth, 200);\r
+ rcImage.bottom = MAX(nHeight, 200);\r
+ return rcImage;\r
+}\r
+\r
+void CView::NewPictureFile()\r
+{\r
+ if (m_pPicture)\r
+ {\r
+ m_pPicture->Release();\r
+ m_pPicture = NULL;\r
+ }\r
+\r
+ GetParent()->SetWindowText(LoadString(IDW_MAIN).c_str());\r
+ Invalidate();\r
+}\r
+\r
+BOOL CView::LoadPictureFile(LPCTSTR szFile)\r
+{\r
+ if (m_pPicture)\r
+ {\r
+ m_pPicture->Release();\r
+ m_pPicture = NULL;\r
+ }\r
+\r
+ TRACE(szFile);\r
+ TRACE(_T("\n"));\r
+\r
+ m_xCurrentScroll = 0;\r
+ m_yCurrentScroll = 0;\r
+ ShowScrollBar(SB_HORZ, FALSE);\r
+ ShowScrollBar(SB_VERT, FALSE);\r
+\r
+ // Create IPicture from image file\r
+ if (S_OK == ::OleLoadPicturePath(T2OLE(szFile), NULL, 0, 0, IID_IPicture, (LPVOID *)&m_pPicture))\r
+ {\r
+ GetParent()->SetWindowText(szFile);\r
+ CMainFrame& Frame = GetPicApp().GetMainFrame();\r
+ Frame.AdjustFrameRect(GetImageRect());\r
+ Invalidate();\r
+ return TRUE;\r
+ }\r
+ else\r
+ {\r
+ TRACE(_T("Failed to load picture\n"));\r
+\r
+ // Set Frame title back to default\r
+ GetParent()->SetWindowText(LoadString(IDW_MAIN).c_str());\r
+ return FALSE;\r
+ }\r
+}\r
+\r
+void CView::OnDraw(CDC* pDC)\r
+{\r
+ Paint(*pDC);\r
+}\r
+\r
+void CView::OnInitialUpdate()\r
+{\r
+ // Set the window background to black\r
+ m_Brush.CreateSolidBrush(RGB(0,0,0));\r
+ SetClassLongPtr(GCLP_HBRBACKGROUND, (LONG_PTR)m_Brush.GetHandle());\r
+\r
+ // Load picture at startup\r
+ TCHAR szPath[MAX_STRING_SIZE];\r
+ TCHAR szFile[] = _T("/PongaFern.jpg");\r
+ GetCurrentDirectory(MAX_STRING_SIZE - lstrlen(szFile) , szPath);\r
+ lstrcat(szPath, _T("./PongaFern.jpg"));\r
+\r
+ if (LoadPictureFile(szPath))\r
+ {\r
+ CMainFrame& Frame = GetPicApp().GetMainFrame();\r
+ CRect rcImage = GetImageRect();\r
+ Frame.AdjustFrameRect(rcImage);\r
+ }\r
+}\r
+\r
+void CView::OnHScroll(WPARAM wParam, LPARAM /*lParam*/)\r
+{\r
+ int xNewPos;\r
+\r
+ switch (LOWORD(wParam))\r
+ {\r
+ case SB_PAGEUP: // User clicked the scroll bar shaft left of the scroll box.\r
+ xNewPos = m_xCurrentScroll - 50;\r
+ break;\r
+\r
+ case SB_PAGEDOWN: // User clicked the scroll bar shaft right of the scroll box.\r
+ xNewPos = m_xCurrentScroll + 50;\r
+ break;\r
+\r
+ case SB_LINEUP: // User clicked the left arrow.\r
+ xNewPos = m_xCurrentScroll - 5;\r
+ break;\r
+\r
+ case SB_LINEDOWN: // User clicked the right arrow.\r
+ xNewPos = m_xCurrentScroll + 5;\r
+ break;\r
+\r
+ case SB_THUMBPOSITION: // User dragged the scroll box.\r
+ xNewPos = HIWORD(wParam);\r
+ break;\r
+\r
+ case SB_THUMBTRACK: // User dragging the scroll box.\r
+ xNewPos = HIWORD(wParam);\r
+ break;\r
+\r
+ default:\r
+ xNewPos = m_xCurrentScroll;\r
+ }\r
+\r
+ // Scroll the window.\r
+ xNewPos = MAX(0, xNewPos);\r
+ xNewPos = MIN( xNewPos, GetImageRect().Width() - GetClientRect().Width() );\r
+ int xDelta = xNewPos - m_xCurrentScroll;\r
+ m_xCurrentScroll = xNewPos;\r
+ ScrollWindowEx(-xDelta, 0, NULL, NULL, NULL, NULL, SW_INVALIDATE);\r
+\r
+ // Reset the scroll bar.\r
+ SCROLLINFO si = {0};\r
+ si.cbSize = sizeof(si);\r
+ si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;\r
+ si.fMask = SIF_POS;\r
+ si.nPos = m_xCurrentScroll;\r
+ SetScrollInfo(SB_HORZ, si, TRUE);\r
+}\r
+\r
+void CView::OnVScroll(WPARAM wParam, LPARAM /*lParam*/)\r
+{\r
+ int yNewPos;\r
+\r
+ switch (LOWORD(wParam))\r
+ {\r
+ case SB_PAGEUP: // User clicked the scroll bar shaft above the scroll box.\r
+ yNewPos = m_yCurrentScroll - 50;\r
+ break;\r
+\r
+ case SB_PAGEDOWN: // User clicked the scroll bar shaft below the scroll box.\r
+ yNewPos = m_yCurrentScroll + 50;\r
+ break;\r
+\r
+ case SB_LINEUP: // User clicked the top arrow.\r
+ yNewPos = m_yCurrentScroll - 5;\r
+ break;\r
+\r
+ case SB_LINEDOWN: // User clicked the bottom arrow.\r
+ yNewPos = m_yCurrentScroll + 5;\r
+ break;\r
+\r
+ case SB_THUMBPOSITION: // User dragged the scroll box.\r
+ yNewPos = HIWORD(wParam);\r
+ break;\r
+\r
+ case SB_THUMBTRACK: // User dragging the scroll box.\r
+ yNewPos = HIWORD(wParam);\r
+ break;\r
+\r
+ default:\r
+ yNewPos = m_yCurrentScroll;\r
+ }\r
+\r
+ // Scroll the window.\r
+ yNewPos = MAX(0, yNewPos);\r
+ yNewPos = MIN( yNewPos, GetImageRect().Height() - GetClientRect().Height() );\r
+ int yDelta = yNewPos - m_yCurrentScroll;\r
+ m_yCurrentScroll = yNewPos;\r
+ ScrollWindowEx(0, -yDelta, NULL, NULL, NULL, NULL, SW_INVALIDATE);\r
+\r
+ // Reset the scroll bar.\r
+ SCROLLINFO si = {0};\r
+ si.cbSize = sizeof(si);\r
+ si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;\r
+ si.cbSize = sizeof(si);\r
+ si.fMask = SIF_POS;\r
+ si.nPos = m_yCurrentScroll;\r
+ SetScrollInfo(SB_VERT, si, TRUE);\r
+}\r
+\r
+void CView::OnWindowPosChanged(WPARAM /*wParam*/, LPARAM /*lParam*/)\r
+{\r
+ if (m_pPicture)\r
+ {\r
+ CRect rcImage = GetImageRect();\r
+ DWORD dwStyle = (DWORD)GetWindowLongPtr(GWL_STYLE);\r
+ DWORD dwExStyle = (DWORD)GetWindowLongPtr(GWL_EXSTYLE);\r
+ AdjustWindowRectEx(&rcImage, dwStyle, FALSE, dwExStyle);\r
+\r
+ CRect rcView = GetClientRect();\r
+ AdjustWindowRectEx(&rcView, dwStyle, FALSE, dwExStyle);\r
+\r
+ SCROLLINFO si = {0};\r
+ si.cbSize = sizeof(si);\r
+ si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;\r
+ si.nMin = 0;\r
+\r
+ if (rcView.Width() >= rcImage.Width())\r
+ {\r
+ m_xCurrentScroll = 0;\r
+ ShowScrollBar(SB_HORZ, FALSE);\r
+ }\r
+ else\r
+ {\r
+ si.nMax = rcImage.Width();\r
+ si.nPage = rcView.Width();\r
+ si.nPos = m_xCurrentScroll;\r
+ SetScrollInfo(SB_HORZ, si, TRUE);\r
+ ShowScrollBar(SB_HORZ, TRUE);\r
+ }\r
+\r
+ if (rcView.Height() >= rcImage.Height())\r
+ {\r
+ m_yCurrentScroll = 0;\r
+ ShowScrollBar(SB_VERT, FALSE);\r
+ }\r
+ else\r
+ {\r
+ si.nMax = rcImage.Height();\r
+ si.nPage = rcView.Height();\r
+ si.nPos = m_yCurrentScroll;\r
+ SetScrollInfo(SB_VERT, si, TRUE);\r
+ ShowScrollBar(SB_VERT, TRUE);\r
+ }\r
+\r
+ int xNewPos = MIN(m_xCurrentScroll, rcImage.Width() - rcView.Width());\r
+ m_xCurrentScroll = MAX(xNewPos, 0);\r
+ int yNewPos = MIN(m_yCurrentScroll, rcImage.Height() - rcView.Height());\r
+ m_yCurrentScroll = MAX(yNewPos, 0);\r
+\r
+ // Paint the window directly to eliminate flicker\r
+ CClientDC dcView(this);\r
+ Paint(dcView);\r
+ }\r
+}\r
+\r
+void CView::Paint(HDC hDC)\r
+{\r
+ if (m_pPicture)\r
+ {\r
+ // get width and height of picture\r
+ long hmWidth;\r
+ long hmHeight;\r
+ m_pPicture->get_Width(&hmWidth);\r
+ m_pPicture->get_Height(&hmHeight);\r
+\r
+ // convert himetric to pixels\r
+ int nWidth = MulDiv(hmWidth, GetDeviceCaps(hDC, LOGPIXELSX), HIMETRIC_INCH);\r
+ int nHeight = MulDiv(hmHeight, GetDeviceCaps(hDC, LOGPIXELSY), HIMETRIC_INCH);\r
+\r
+ // calculate himetric start pos\r
+ int xStart = MulDiv(m_xCurrentScroll, HIMETRIC_INCH, GetDeviceCaps(hDC, LOGPIXELSX));\r
+ int yStart = MulDiv(m_yCurrentScroll, HIMETRIC_INCH, GetDeviceCaps(hDC, LOGPIXELSY));\r
+\r
+ // Render the picture to the DC\r
+ m_pPicture->Render(hDC, 0, 0, nWidth, nHeight, xStart, hmHeight - yStart, hmWidth, -hmHeight, NULL);\r
+ }\r
+}\r
+\r
+void CView::PreCreate(CREATESTRUCT &cs)\r
+{\r
+ // Set the Window Class name\r
+ cs.lpszClass = _T("PictureView");\r
+\r
+ cs.style = WS_CHILD | WS_HSCROLL | WS_VSCROLL ;\r
+\r
+ // Set the extended style\r
+ cs.dwExStyle = WS_EX_CLIENTEDGE;\r
+}\r
+\r
+void CView::SavePicture(LPCTSTR szFile)\r
+{\r
+ // get a IPictureDisp interface from your IPicture pointer\r
+ IPictureDisp *pDisp = NULL;\r
+\r
+ if (SUCCEEDED(m_pPicture->QueryInterface(IID_IPictureDisp, (void**) &pDisp)))\r
+ {\r
+ // Save the IPicture image as a bitmap\r
+ OleSavePictureFile(pDisp, T2BSTR(szFile));\r
+ pDisp->Release();\r
+ }\r
+}\r
+\r
+LRESULT CView::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+{\r
+ switch (uMsg)\r
+ {\r
+ case WM_WINDOWPOSCHANGED:\r
+ OnWindowPosChanged(wParam, lParam);\r
+ break;\r
+\r
+ case WM_HSCROLL:\r
+ OnHScroll(wParam, lParam);\r
+ break;\r
+\r
+ case WM_VSCROLL:\r
+ OnVScroll(wParam, lParam);\r
+ break;\r
+ }\r
+\r
+ // Pass unhandled messages on for default processing\r
+ return WndProcDefault(uMsg, wParam, lParam);\r
+}\r
+\r
+\r