#include "stdafx.h" #include "resource.h" #include "AnnBmp.h" #include "HpLnkDlg.h" #include "AnnDoc.h" #include "AnnView.h" //--------------------------------------------- CAnnDemoBitmap::CAnnDemoBitmap() //--------------------------------------------- { m_bShowLocked = TRUE; m_nHotspots = m_nButtons=0; SetDisplayMode(DISPLAYMODE_SCALETOGRAY|DISPLAYMODE_FAVORBLACK,DISPLAYMODE_SCALETOGRAY); } //--------------------------------------------- /*virtual*/ CAnnDemoBitmap::~CAnnDemoBitmap() //--------------------------------------------- { } //--------------------------------------------- void CAnnDemoBitmap::ToolChecked(UINT uTool) //--------------------------------------------- { switch((UINT) uTool) { case ANNTOOL_SELECT: m_nAnnObject = IDM_TOOLSELECT; break; case ANNTOOL_LINE: m_nAnnObject = IDM_TOOLLINE; break; case ANNTOOL_RECT: m_nAnnObject = IDM_TOOLRECT; break; case ANNTOOL_ELLIPSE: m_nAnnObject = IDM_TOOLELLIPSE; break; case ANNTOOL_POLYLINE: m_nAnnObject = IDM_TOOLPOLYLINE; break; case ANNTOOL_POLYGON: m_nAnnObject = IDM_TOOLPOLYGON; break; case ANNTOOL_POINTER: m_nAnnObject = IDM_TOOLPOINTER; break; case ANNTOOL_FREEHAND: m_nAnnObject = IDM_TOOLFREEHAND; break; case ANNTOOL_HILITE: m_nAnnObject = IDM_TOOLHILITE; break; case ANNTOOL_REDACT: m_nAnnObject = IDM_TOOLREDACT; break; case ANNTOOL_TEXT: m_nAnnObject = IDM_TOOLTEXT; break; case ANNTOOL_NOTE: m_nAnnObject = IDM_TOOLNOTE; break; case ANNTOOL_STAMP: m_nAnnObject = IDM_TOOLSTAMP; break; case ANNTOOL_BUTTON: m_nAnnObject = IDM_TOOLBUTTON; break; case ANNTOOL_HOTSPOT: m_nAnnObject = IDM_TOOLHOTSPOT; break; case ANNTOOL_AUDIO: m_nAnnObject = IDM_TOOLAUDIO; break; case ANNTOOL_RULER: m_nAnnObject = IDM_TOOLRULER; break; case ANNTOOL_CROSSPRODUCT : m_nAnnObject = IDM_TOOL_CROSSPRODUCT; break; case ANNTOOL_POINT: m_nAnnObject = IDM_TOOL_POINT; break; case ANNTOOL_PROTRACTOR: m_nAnnObject = IDM_TOOL_PROTRACTOR; break; case ANNTOOL_VIDEO: m_nAnnObject = IDM_TOOL_VIDEO; break; case ANNTOOL_PUSHPIN: m_nAnnObject = IDM_TOOL_PUSHPIN; break; case ANNTOOL_FREEHANDHOTSPOT: m_nAnnObject = IDM_TOOL_FREEHANDHOTSPOT; break; case ANNTOOL_STAMP_APPROVED: m_nAnnObject = IDM_TOOL_STAMP_APPROVED; break; case ANNTOOL_STAMP_ASSIGNED: m_nAnnObject = IDM_TOOL_STAMP_ASSIGNED; break; case ANNTOOL_STAMP_CHECKED: m_nAnnObject = IDM_TOOL_STAMP_CHECKED; break; case ANNTOOL_STAMP_CLATPRV: m_nAnnObject = IDM_TOOL_STAMP_CLATPRV; break; case ANNTOOL_STAMP_COPY: m_nAnnObject = IDM_TOOL_STAMP_COPY; break; case ANNTOOL_STAMP_DRAFT: m_nAnnObject = IDM_TOOL_STAMP_DRAFT; break; case ANNTOOL_STAMP_EXTENDED: m_nAnnObject = IDM_TOOL_STAMP_EXTENDED; break; case ANNTOOL_STAMP_FAX: m_nAnnObject = IDM_TOOL_STAMP_FAX; break; case ANNTOOL_STAMP_FAXED: m_nAnnObject = IDM_TOOL_STAMP_FAXED; break; case ANNTOOL_STAMP_IMPORTANT: m_nAnnObject = IDM_TOOL_STAMP_IMPORTANT; break; case ANNTOOL_STAMP_INVOICE: m_nAnnObject = IDM_TOOL_STAMP_INVOICE; break; case ANNTOOL_STAMP_NOTICE: m_nAnnObject = IDM_TOOL_STAMP_NOTICE; break; case ANNTOOL_STAMP_OFFICIAL: m_nAnnObject = IDM_TOOL_STAMP_OFFICIAL; break; case ANNTOOL_STAMP_ONFILE: m_nAnnObject = IDM_TOOL_STAMP_ONFILE; break; case ANNTOOL_STAMP_PAID: m_nAnnObject = IDM_TOOL_STAMP_PAID; break; case ANNTOOL_STAMP_PASSED: m_nAnnObject = IDM_TOOL_STAMP_PASSED; break; case ANNTOOL_STAMP_PENDING: m_nAnnObject = IDM_TOOL_STAMP_PENDING; break; case ANNTOOL_STAMP_PROCESSED: m_nAnnObject = IDM_TOOL_STAMP_PROCESSED; break; case ANNTOOL_STAMP_RECEIVED: m_nAnnObject = IDM_TOOL_STAMP_RECEIVED; break; case ANNTOOL_STAMP_REJECTED: m_nAnnObject = IDM_TOOL_STAMP_REJECTED; break; case ANNTOOL_STAMP_RELEASE: m_nAnnObject = IDM_TOOL_STAMP_RELEASE; break; case ANNTOOL_STAMP_SENT: m_nAnnObject = IDM_TOOL_STAMP_SENT; break; case ANNTOOL_STAMP_SHIPPED: m_nAnnObject = IDM_TOOL_STAMP_SHIPPED; break; case ANNTOOL_STAMP_TOPSECRET: m_nAnnObject = IDM_TOOL_STAMP_TOPSECRET; break; case ANNTOOL_STAMP_URGENT: m_nAnnObject = IDM_TOOL_STAMP_URGENT; break; case ANNTOOL_STAMP_VOID: m_nAnnObject = IDM_TOOL_STAMP_VOID; break; case ANNTOOL_TEXTPOINTER: m_nAnnObject = IDM_TOOL_TEXTPOINTER; break; case ANNTOOL_ENCRYPT: m_nAnnObject = IDM_TOOL_ENCRYPT; break; case ANNTOOL_POLYRULER: m_nAnnObject = IDM_TOOL_POLYRULER; break; case ANNTOOL_RTF: m_nAnnObject = IDM_TOOL_RTF; break; case ANNTOOL_CURVECLOSED: m_nAnnObject = IDM_TOOL_CURVECLOSED; break; case ANNTOOL_CURVE: m_nAnnObject = IDM_TOOL_CURVE; break; default : return; } GetAutomationObject().SetTool(uTool); if (GetToolBar().GetToolChecked()!=uTool) GetToolBar().SetToolChecked(uTool); } //--------------------------------------------- UINT CAnnDemoBitmap::GetCurrentObjectID() //--------------------------------------------- { return m_nAnnObject; } //-------------------------------------------------------------------------------- /*virtual*/ L_VOID CAnnDemoBitmap::OnAnnEvent(L_UINT uAnnEvent,L_UINT32 lParam) //-------------------------------------------------------------------------------- { LAnnotationWindow::OnAnnEvent(uAnnEvent, lParam); switch (uAnnEvent) { case LTANNEVENT_INSERT: { LAnnotation * pAnnObj; pAnnObj = LAnnotation::CreateAnnObject((HANNOBJECT) lParam); if (pAnnObj->GetType()== ANNOBJECT_BUTTON) { pAnnObj->SetTag(++m_nButtons, 0); } else if (pAnnObj->GetType()== ANNOBJECT_HOTSPOT) { pAnnObj->SetTag(++m_nHotspots, 0); } } break; case LTANNEVENT_AUTOCLICKED: { LAnnotation * pAnnObj; TCHAR temp[200]; pAnnObj = LAnnotation::CreateAnnObject((HANNOBJECT) lParam); L_UINT32 uTag = pAnnObj->GetTag(); if (pAnnObj->GetType()== ANNOBJECT_BUTTON) { wsprintf(temp, _T("Button with tag %lu was clicked"), uTag); } else if (pAnnObj->GetType()== ANNOBJECT_HOTSPOT) { wsprintf(temp, _T("HotSpot with tag %lu was clicked"), uTag); } else if (pAnnObj->GetType()== ANNOBJECT_FREEHANDHOTSPOT) { wsprintf(temp, _T("FreehandHotSpot with tag %lu was clicked"), uTag); } else break; ::MessageBox(m_hWnd, temp, _T("Event"), MB_OK|MB_ICONINFORMATION); } break; case LTANNEVENT_TOOLCHECKED : ToolChecked(lParam); break; case LTANNEVENT_AUTOENDSET: ToolChecked(ANNTOOL_SELECT); break; case LTANNEVENT_HYPERLINKMENU: GetHyperlink (LAnnotation::CreateAnnObject((HANNOBJECT)lParam)); break; case LTANNEVENT_HYPERLINK: ::MessageBox(NULL, _T("Object's hyperlink has been activated!"), _T("WM_LTANNEVENT"), MB_OK); break; case LTANNEVENT_TOOLDESTROY: { CAnnDemoView * pView = (CAnnDemoView * )CWnd::FromHandle(GetParent(m_hWnd)); if (pView) { pView->m_bShowToolbar = FALSE; } } break; } } void CAnnDemoBitmap::ShowLocked(BOOL bShow) { m_bShowLocked = bShow; GetContainerObject().ShowLockedIcon(bShow, ANNFLAG_RECURSE); } BOOL CAnnDemoBitmap::IsLockedVisible() { return m_bShowLocked; } void CAnnDemoBitmap::Realize() { GetContainerObject().SetOffsetX(0); GetContainerObject().SetOffsetY(0); GetContainerObject().Realize(GetHandle(), NULL, TRUE); } void CAnnDemoBitmap::Unrealize() { if (GetContainerObject().Unrealize(GetHandle(), NULL, FALSE)==ERROR_ANN_LOCKED) { ::MessageBox(GetBitmapWnd(), _T("Some redact objects are locked and cannot be restored"), _T("Warning"), MB_OK|MB_ICONSTOP); } } void CAnnDemoBitmap::PrintImage(CDC * pDC) { RECT rc; HDC hDC; pBITMAPHANDLE pBitmap = GetHandle(); HCURSOR hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); hDC = pDC->GetSafeHdc(); SetRect(&rc, 1, 1, MulDiv(BITMAPWIDTH(pBitmap), GetDeviceCaps(hDC,LOGPIXELSX), pBitmap->XResolution), MulDiv(BITMAPHEIGHT(pBitmap),GetDeviceCaps(hDC,LOGPIXELSY), pBitmap->YResolution)); hDC = L_PRINTBITMAP(hDC, pBitmap, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, FALSE); rc.left = rc.top = 0; AnnPrint(hDC, rc.left, rc.top, rc.right, rc.bottom); SetCursor (hCursor); } int CAnnDemoBitmap::GetHyperlink(LAnnotation * pAnnObject) { CHyperLinkDlg HpLnkDlg; L_UINT uType; L_UINT uMsg; WPARAM wParam; TCHAR szLink[2048]; int nRet = 0; pAnnObject->GetHyperlink(&uType,&uMsg,&wParam,szLink); HpLnkDlg.m_nHyperLinkType = (int) uType; if (HpLnkDlg.m_nHyperLinkType==3) HpLnkDlg.m_Program = szLink; else if (HpLnkDlg.m_nHyperLinkType==4) HpLnkDlg.m_WebPage= szLink; if (HpLnkDlg.DoModal()==IDOK) { /* Object is Automation in one or two cases: a) there are no objects selected and you want to change the default properties of the objects that will be created or b) there are 2 or more objects that are selected and whose Hyperlinks need to be changed otherwise (if there is only one object selected) hObject is the handle of the selected object I change the automation object as well as the selected object(s) so that the newly created objects will have the same hyperlink as the last object's Hyperlink. If you don't want this, remove the line with SetHyperlink(..... */ uType = HpLnkDlg.m_nHyperLinkType; switch(HpLnkDlg.m_nHyperLinkType) { case 2: uMsg = WM_USERMSG; /* set a user message and a wParam */ wParam= 0; break; case 3: lstrcpy(szLink, (LPTSTR)(LPCTSTR)HpLnkDlg.m_Program); break; case 4: lstrcpy(szLink, (LPTSTR)(LPCTSTR)HpLnkDlg.m_WebPage); break; default: szLink[0]='\0'; } if(pAnnObject->GetType() == ANNOBJECT_AUTOMATION) /* change the automation object and all selected objects */ { pAnnObject->SetHyperlink(uType, uMsg, wParam, szLink, 0); nRet = GetContainerObject().SetHyperlink(uType, uMsg, wParam, szLink, ANNFLAG_RECURSE|ANNFLAG_SELECTED); } else /* change the automation object and the selected object */ { GetAutomationObject().SetHyperlink(uType, uMsg, wParam, szLink, 0); nRet = pAnnObject->SetHyperlink(uType, uMsg, wParam, szLink, 0); } } return nRet; } /*virtual*/ LRESULT CAnnDemoBitmap::MsgProcCB(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch (uMsg) { case WM_USERMSG: return OnUserMessage(wParam, lParam); break; case WM_KEYDOWN: { L_UINT Tmp = (WPARAM)(UINT)(wParam); switch ((WPARAM)(UINT)(wParam)) { case 0xBB: //VK_OEM_PLUS: { L_FLOAT zoomPer = GetZoomFactor(); SetZoomFactor(zoomPer+0.1f); } break; case 0xBD: //VK_OEM_MINUS: { L_FLOAT zoomPer = GetZoomFactor(); SetZoomFactor(zoomPer-0.1f); } break; } } break; default : break; } return LAnnotationWindow::MsgProcCallBack( hWnd, uMsg, wParam, lParam); } LONG CAnnDemoBitmap::OnUserMessage(UINT wp, LONG lp) { TCHAR s[50]; UINT uType; LAnnotation * pObject = LAnnotation::CreateAnnObject((HANNOBJECT)lp); TCHAR *szObjectTypes[] = { _T("CONTAINER"), _T("POINTER"), _T("AUDIO"), _T("BUTTON"), _T("ELLIPSE"), _T("FREEHAND"), _T("HILITE"), _T("HOTSPOT"), _T("LINE"), _T("NOTE"), _T("POLYGON"), _T("POLYLINE"), _T("RECT"), _T("REDACT"), _T("STAMP"), _T("TEXT"), _T("AUTOMATION") }; if (pObject) { uType = pObject->GetType(); if(uType < sizeof(szObjectTypes) / sizeof(szObjectTypes[0])) wsprintf(s, _T("Object type = %s, wParam = %d"), (LPTSTR)szObjectTypes[uType], wp); else wsprintf(s, _T("Object type = Unknown(%d), wParam = %d"), uType, wp); } else wsprintf(s, _T("Unknown object - cannot get the type, wParam = %d"), wp); AfxGetMainWnd()->MessageBox(s, _T("HYPERLINK USER MESSAGE"), MB_OK|MB_ICONINFORMATION); return 0; } void CAnnDemoBitmap::GetAnnFile(LPTSTR pDest, LPTSTR pSource, L_UINT nPage, L_INT nFormat) { LPTSTR p; L_UINT16 uType; L_UINT32 uCount; LOADFILEOPTION LoadFileOption; LFile CSrc(this, pSource); LBaseFile::GetDefaultLoadFileOption(&LoadFileOption, sizeof(LoadFileOption)); LoadFileOption.PageNumber = nPage; if( nFormat < 0 && CSrc.ReadTag(ANNTAG_TIFF, &uType, &uCount, NULL, &LoadFileOption) > 0 || ISTIF(nFormat) ) // the file has annotation data! lstrcpy(pDest, pSource); else { // else look for a .ANN file lstrcpy(pDest, pSource); p = _tcsrchr(pDest, '.'); if(!p) p = _tcsrchr(pDest, '\0'); lstrcpy(p, _T(".ann")); } }