Commit before breaking everything
[matches/honours.git] / research / transmission_spectroscopy / TOF / Win32++ / samples / Picture / src / View.cpp
diff --git a/research/transmission_spectroscopy/TOF/Win32++/samples/Picture/src/View.cpp b/research/transmission_spectroscopy/TOF/Win32++/samples/Picture/src/View.cpp
new file mode 100644 (file)
index 0000000..2e3c8d0
--- /dev/null
@@ -0,0 +1,348 @@
+//////////////////////////////////////////////\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

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