// ReaderVCView.cpp : implementation of the CReaderVCView class | |
// | |
#include "stdafx.h" | |
#include "ReaderVC.h" | |
#include "MainFrm.h" | |
#include "ChildFrm.h" | |
#include "ReaderVCDoc.h" | |
#include "ReaderVCView.h" | |
#include "GotoPageDlg.h" | |
#include "ZoomDlg.h" | |
#include "FindDlg.h" | |
#include "ConvertDlg.h" | |
#include "JS_ResponseDlg.h" | |
#include "TestJsDlg.h" | |
//#include "../../include/pp_event.h" | |
#ifdef _DEBUG | |
#define new DEBUG_NEW | |
#undef THIS_FILE | |
static char THIS_FILE[] = __FILE__; | |
#endif | |
///////////////////////////////////////////////////////////////////////////// | |
// CReaderVCView | |
IMPLEMENT_DYNCREATE(CReaderVCView, CView) | |
BEGIN_MESSAGE_MAP(CReaderVCView, CView) | |
//{{AFX_MSG_MAP(CReaderVCView) | |
ON_COMMAND(ID_DOC_FIRSTPAGE, OnDocFirstpage) | |
ON_COMMAND(ID_DOC_GOTOPAGE, OnDocGotopage) | |
ON_COMMAND(ID_DOC_LASTPAGE, OnDocLastpage) | |
ON_COMMAND(ID_DOC_NEXTPAGE, OnDocNextpage) | |
ON_COMMAND(ID_DOC_PREPAGE, OnDocPrepage) | |
ON_COMMAND(ID_VIEW_CLOCKWISE, OnClockwise) | |
ON_COMMAND(ID_VIEW_COUNTERCLOCKWISE, OnCounterclockwise) | |
ON_COMMAND(ID_VIEW_ACTUALSIZE, OnViewActualSize) | |
ON_COMMAND(ID_VIEW_FITPAGE, OnViewFitPage) | |
ON_COMMAND(ID_VIEW_FITWIDTH, OnViewFitWidth) | |
ON_COMMAND(ID_VIEW_ZOOMIN, OnViewZoomIn) | |
ON_COMMAND(ID_VIEW_ZOOMOUT, OnViewZoomOut) | |
ON_COMMAND(ID_VIEW_ZOOMTO, OnViewZoomTo) | |
ON_COMMAND(ID_EDIT_FIND, OnEditFind) | |
ON_COMMAND(ID_FILE_PRINT, OnFilePrint) | |
ON_WM_LBUTTONDOWN() | |
ON_WM_LBUTTONUP() | |
ON_WM_MOUSEMOVE() | |
ON_WM_KEYDOWN() | |
ON_COMMAND(ID_TOOL_SNAPSHOT, OnToolSnapshot) | |
ON_COMMAND(ID_TOOL_SELECT, OnToolSelect) | |
ON_COMMAND(ID_TOOL_HAND, OnToolHand) | |
ON_COMMAND(ID_TOOL_PDF2TXT, OnToolPdf2txt) | |
ON_WM_SIZE() | |
ON_WM_HSCROLL() | |
ON_WM_VSCROLL() | |
ON_COMMAND(ID_TOOL_EXTRACTLINKS, OnToolExtractlinks) | |
ON_WM_DESTROY() | |
ON_UPDATE_COMMAND_UI(ID_DOC_FIRSTPAGE, OnUpdateDocFirstpage) | |
ON_UPDATE_COMMAND_UI(ID_DOC_LASTPAGE, OnUpdateDocLastpage) | |
ON_UPDATE_COMMAND_UI(ID_DOC_NEXTPAGE, OnUpdateDocNextpage) | |
ON_UPDATE_COMMAND_UI(ID_DOC_PREPAGE, OnUpdateDocPrepage) | |
ON_UPDATE_COMMAND_UI(ID_TOOL_HAND, OnUpdateToolHand) | |
ON_UPDATE_COMMAND_UI(ID_TOOL_SNAPSHOT, OnUpdateToolSnapshot) | |
ON_UPDATE_COMMAND_UI(ID_TOOL_SELECT, OnUpdateToolSelect) | |
ON_COMMAND(ID_VIEW_BOOKMARK, OnViewBookmark) | |
ON_WM_MOUSEWHEEL() | |
ON_WM_CONTEXTMENU() | |
ON_COMMAND(ID_EDIT_COPY, OnEditCopy) | |
ON_COMMAND(ID_RENDERBITMAP, OnRenderbitmap) | |
ON_COMMAND(ID_EXPORT_PDF_TO_BITMAP, OnExportPdfToBitmap) | |
ON_WM_CHAR() | |
ON_WM_KEYUP() | |
ON_COMMAND(ID_FILE_SAVE, OnFileSave) | |
ON_COMMAND(IDM_Test_JS, OnTestJS) | |
ON_COMMAND(TEST_PRINT_METALFILE, OnPrintMetalfile) | |
//}}AFX_MSG_MAP | |
// Standard printing commands | |
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) | |
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) | |
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) | |
END_MESSAGE_MAP() | |
///////////////////////////////////////////////////////////////////////////// | |
// CReaderVCView construction/destruction | |
void Sample_PageToDevice(struct _FPDF_FORMFILLINFO* pThis,FPDF_PAGE page,double page_x,double page_y, int* device_x, int* device_y) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
pView->PageToDeviceImpl(page, page_x, page_y, device_x, device_y); | |
} | |
//((CReaderVCView*)pThis)->PageToDeviceImpl(page, page_x, page_y, device_x, device_y); | |
} | |
void Sample_Invalidate(struct _FPDF_FORMFILLINFO* pThis,FPDF_PAGE page, double left, double top, double right, double bottom) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
pView->InvalidateImpl(page,left, top, right, bottom); | |
} | |
//((CReaderVCView*)pThis)->InvalidateImpl(page,left, top, right, bottom); | |
} | |
void Sample_OutputSelectedRect(struct _FPDF_FORMFILLINFO* pThis,FPDF_PAGE page, double left, double top, double right, double bottom) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
pView->OutputSelectedRectImpl(page,left, top, right, bottom); | |
} | |
} | |
void Sample_DeviceToPage(struct _FPDF_FORMFILLINFO* pThis,FPDF_PAGE page,int device_x, int device_y, double* page_x, double* page_y) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
pView->DeviceToPageImpl(page, device_x, device_y, page_x, page_y); | |
} | |
//((CReaderVCView*)pThis)->DeviceToPageImpl(page, device_x, device_y, page_x, page_y); | |
} | |
/* /* Remove by Amy Lin 20100913, Since we don't this the FFI_SetCaret any more. | |
void Sample_SetCaret(struct _FPDF_FORMFILLINFO* pThis,FPDF_PAGE page,double page_x, double page_y, int nWidth, int nHeight) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
pView->SetCaretImpl(page, page_x, page_y, nWidth, nHeight); | |
} | |
//((CReaderVCView*)pThis)->SetCaretImpl(page, page_x, page_y, nWidth, nHeight); | |
} | |
*/ | |
void Sample_Release(struct _FPDF_FORMFILLINFO* pThis) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
pView->ReleaseImpl(); | |
} | |
//((CReaderVCView*)pThis)->ReleaseImpl(); | |
} | |
int Sample_SetTimer(struct _FPDF_FORMFILLINFO* pThis, int uElapse, TimerCallback lpTimerFunc) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
return pView->SetTimerImpl(uElapse, lpTimerFunc); | |
}else{ | |
return -1; | |
} | |
//return ((CReaderVCView*)pThis)->SetTimerImpl(uElapse, lpTimerFunc); | |
} | |
void Sample_KillTimer(struct _FPDF_FORMFILLINFO* pThis,int nID) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
pView->KillTimerImpl(nID); | |
} | |
//((CReaderVCView*)pThis)->KillTimerImpl(nID); | |
} | |
void Sample_SetCursor(struct _FPDF_FORMFILLINFO* pThis,int nCursorType) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
pView->SetCurorImpl(nCursorType); | |
} | |
//((CReaderVCView*)pThis)->SetCurorImpl(nCursorType); | |
} | |
void Sample_OnChange(struct _FPDF_FORMFILLINFO* pThis) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
pView->OnChangeImpl(); | |
} | |
} | |
FPDF_BOOL Sample_IsSHIFTKeyDown(struct _FPDF_FORMFILLINFO* pThis) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
return pView->IsSHIFTKeyDownImpl(); | |
} | |
return FALSE; | |
} | |
FPDF_BOOL Sample_IsCTRLKeyDown(struct _FPDF_FORMFILLINFO* pThis) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
return pView->IsCTRLKeyDownImpl(); | |
} | |
return FALSE; | |
} | |
FPDF_BOOL Sample_IsALTKeyDown(struct _FPDF_FORMFILLINFO* pThis) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
return pView->IsALTKeyDownImpl(); | |
} | |
return FALSE; | |
} | |
FPDF_BOOL Sample_IsINSERTKeyDown(struct _FPDF_FORMFILLINFO* pThis) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
return pView->IsINSERTKeyDownImpl(); | |
} | |
return FALSE; | |
} | |
FPDF_PAGE Sample_GetPage(struct _FPDF_FORMFILLINFO* pThis,FPDF_DOCUMENT document, int nPageIndex) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
return pView->GetPageImpl(document,nPageIndex); | |
} | |
return NULL; | |
} | |
FPDF_PAGE Sample_GetCurrentPage(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
return pView->GetCurrentPageImpl(document); | |
} | |
return NULL; | |
} | |
int Sample_GetRotation(struct _FPDF_FORMFILLINFO* pThis, FPDF_PAGE page) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
return pView->GetRotationImpl(page); | |
} | |
return NULL; | |
} | |
FPDF_SYSTEMTIME Sample_GetLocalTime(struct _FPDF_FORMFILLINFO* pThis) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
return pView->GetLocalTimeImpl(); | |
} | |
return FPDF_SYSTEMTIME(); | |
} | |
void SampleRelease(struct _FPDF_SYSFONTINFO* pThis) | |
{ | |
((CSampleFontInfo*)pThis)->ReleaseImpl(); | |
} | |
void SampleEnumFonts(struct _FPDF_SYSFONTINFO* pThis, void* pMapper) | |
{ | |
((CSampleFontInfo*)pThis)->EnumFontsImpl(pMapper); | |
} | |
void* SampleMapFont(struct _FPDF_SYSFONTINFO* pThis, int weight, int bItalic, int charset, int pitch_family, | |
const char* face, int* bExact) | |
{ | |
return ((CSampleFontInfo*)pThis)->MapFontImpl(weight, bItalic, charset, pitch_family, face, bExact); | |
} | |
unsigned long SampleGetFontData(struct _FPDF_SYSFONTINFO* pThis, void* hFont, | |
unsigned int table, unsigned char* buffer, unsigned long buf_size) | |
{ | |
return ((CSampleFontInfo*)pThis)->GetFontDataImpl(hFont, table, buffer, buf_size); | |
} | |
unsigned long SampleGetFaceName(struct _FPDF_SYSFONTINFO* pThis, void* hFont, char* buffer, unsigned long buf_size) | |
{ | |
return ((CSampleFontInfo*)pThis)->GetFaceNameImpl(hFont, buffer, buf_size); | |
} | |
int SampleGetFontCharset(struct _FPDF_SYSFONTINFO* pThis, void* hFont) | |
{ | |
return ((CSampleFontInfo*)pThis)->GetFontCharsetImpl(hFont); | |
} | |
void SampleDeleteFont(struct _FPDF_SYSFONTINFO* pThis, void* hFont) | |
{ | |
((CSampleFontInfo*)pThis)->DeleteFontImpl(hFont); | |
} | |
void SetSampleFontInfo() | |
{ | |
CSampleFontInfo* pFontInfo = new CSampleFontInfo; | |
pFontInfo->version = 1; | |
pFontInfo->DeleteFont = SampleDeleteFont; | |
pFontInfo->EnumFonts = SampleEnumFonts; | |
pFontInfo->GetFaceName = SampleGetFaceName; | |
pFontInfo->GetFont = NULL; | |
pFontInfo->GetFontCharset = SampleGetFontCharset; | |
pFontInfo->GetFontData = SampleGetFontData; | |
pFontInfo->MapFont = SampleMapFont; | |
pFontInfo->Release = SampleRelease; | |
FPDF_SetSystemFontInfo(pFontInfo); | |
} | |
void Sample_ExecuteNamedAction(struct _FPDF_FORMFILLINFO* pThis, FPDF_BYTESTRING namedAction) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if ( pView ) | |
{ | |
pView->ExecuteNamedActionImpl(namedAction); | |
} | |
} | |
void CReaderVCView::ExecuteNamedActionImpl(FPDF_BYTESTRING namedaction) | |
{ | |
if(strcmp("Print", (LPCSTR)namedaction) == 0) | |
OnFilePrint(); | |
} | |
void CReaderVCView::OutputSelectedRectImpl(FPDF_PAGE page, double left, double top, double right, double bottom) | |
{ | |
if(page == m_pPage) | |
{ | |
int device_left, device_top, device_right, device_bottom; | |
int nActualRangeX = 0; | |
int nActualRangeY = 0; | |
if ( m_nRotateFlag % 2 == 0 ) | |
{ | |
nActualRangeX = m_nActualSizeX; | |
nActualRangeY = m_nActualSizeY; | |
}else{ | |
nActualRangeX = m_nActualSizeY; | |
nActualRangeY = m_nActualSizeX; | |
} | |
FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
(int)(nActualRangeY * m_dbScaleFactor), m_nRotateFlag, left, top, &device_left, &device_top); | |
FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
(int)(nActualRangeY * m_dbScaleFactor), m_nRotateFlag, right, bottom, &device_right, &device_bottom); | |
CRect rc(device_left,device_top, device_right, device_bottom); | |
m_SelectArray.Add(rc); | |
} | |
} | |
void Sample_Release(FPDF_LPVOID clientData) | |
{ | |
if (!clientData) return; | |
fclose(((FPDF_FILE*)clientData)->file); | |
delete ((FPDF_FILE*)clientData); | |
} | |
FPDF_DWORD Sample_GetSize(FPDF_LPVOID clientData) | |
{ | |
if (!clientData) return 0; | |
long curPos = ftell(((FPDF_FILE*)clientData)->file); | |
fseek(((FPDF_FILE*)clientData)->file, 0, SEEK_END); | |
long size = ftell(((FPDF_FILE*)clientData)->file); | |
fseek(((FPDF_FILE*)clientData)->file, curPos, SEEK_SET); | |
return (FPDF_DWORD)size; | |
} | |
FPDF_RESULT Sample_ReadBlock(FPDF_LPVOID clientData, FPDF_DWORD offset, FPDF_LPVOID buffer, FPDF_DWORD size) | |
{ | |
if (!clientData) return -1; | |
fseek(((FPDF_FILE*)clientData)->file, (long)offset, SEEK_SET); | |
size_t readSize = fread(buffer, 1, size, ((FPDF_FILE*)clientData)->file); | |
return readSize == size ? 0 : -1; | |
} | |
FPDF_RESULT Sample_WriteBlock(FPDF_LPVOID clientData, FPDF_DWORD offset, FPDF_LPCVOID buffer, FPDF_DWORD size) | |
{ | |
if (!clientData) return -1; | |
fseek(((FPDF_FILE*)clientData)->file, (long)offset, SEEK_SET); | |
//Write data | |
size_t writeSize = fwrite(buffer, 1, size, ((FPDF_FILE*)clientData)->file); | |
return writeSize == size ? 0 : -1; | |
} | |
FPDF_RESULT Sample_Flush(FPDF_LPVOID clientData) | |
{ | |
if (!clientData) return -1; | |
//Flush file | |
fflush(((FPDF_FILE*)clientData)->file); | |
return 0; | |
} | |
FPDF_RESULT Sample_Truncate(FPDF_LPVOID clientData, FPDF_DWORD size) | |
{ | |
return 0; | |
} | |
void Sample_DisplayCaret(struct _FPDF_FORMFILLINFO* pThis, FPDF_PAGE page, FPDF_BOOL bVisible, double left, double top, double right, double bottom) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if (!pView) return; | |
HWND hWnd = pView->m_hWnd; | |
if (bVisible) | |
{ | |
CPoint ltPt; | |
pView->PageToDevice(left, top, ltPt); | |
CPoint rbPt; | |
pView->PageToDevice(right, bottom, rbPt); | |
CRect rcCaret(ltPt, rbPt); | |
::DestroyCaret(); | |
::CreateCaret(hWnd, (HBITMAP)0, rcCaret.Width(), rcCaret.Height()); | |
::SetCaretPos (rcCaret.left, rcCaret.top); | |
::ShowCaret(hWnd); | |
} | |
else | |
{ | |
::DestroyCaret(); | |
::HideCaret(hWnd); | |
} | |
} | |
int Sample_GetCurrentPageIndex(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document) | |
{ | |
CReaderVCView* pView =(CReaderVCView*)pThis; | |
if (!pView) return -1; | |
return pView->GetCurrentPageIndex(); | |
} | |
void Sample_SetCurrentPage(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document, int iCurPage) | |
{ | |
CReaderVCView* pView = (CReaderVCView*)pThis; | |
if (!pView) return; | |
FPDF_DOCUMENT curDoc = pView->GetPDFDoc(); | |
if (curDoc != document) | |
return; | |
int nPageCount = FPDF_GetPageCount(curDoc); | |
if (nPageCount > iCurPage) | |
{ | |
int nCurPageInx = pView->GetCurrentPageIndex(); | |
if (nCurPageInx != iCurPage) | |
{ | |
pView->GotoPage(nCurPageInx); | |
} | |
} | |
} | |
void Sample_GotoURL(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document, FPDF_WIDESTRING wsURL) | |
{ | |
CReaderVCView* pView = (CReaderVCView*)pThis; | |
if (!pView) return; | |
wchar_t* pURL = (wchar_t*)wsURL; | |
MessageBoxW(NULL, pURL, NULL, MB_OK); | |
} | |
FPDF_WIDESTRING Sample_GetURL(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document) | |
{ | |
CReaderVCView* pView = (CReaderVCView*)pThis; | |
if (!pView) return NULL; | |
if (pView->GetPDFDoc() != document) | |
return NULL; | |
//not support in this demo | |
return NULL; | |
} | |
void Sample_AddDoRecord(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document, FPDF_WIDGET hWidget) | |
{ | |
//not support | |
} | |
void Sample_PageEvent(struct _FPDF_FORMFILLINFO* pThis, FPDF_PAGE page, FPDF_DWORD eventFlag) | |
{ | |
// | |
} | |
void Sample_GetPageViewRect(struct _FPDF_FORMFILLINFO* pThis, FPDF_PAGE page, double* left, double* top, double* right, double* bottom) | |
{ | |
CReaderVCView* pView = (CReaderVCView*)pThis; | |
if (!pView) return; | |
if (pView->GetPage() != page) | |
return; | |
CRect clientRect; | |
pView->GetClientRect(&clientRect); | |
*left = (double)clientRect.left; | |
*right = (double)clientRect.right; | |
*top = (double)clientRect.top; | |
*bottom = (double)clientRect.bottom; | |
} | |
#define WM_XFAMENU_COPY 10000 | |
FPDF_BOOL Sample_PopupMenu(struct _FPDF_FORMFILLINFO* pThis, FPDF_PAGE page, FPDF_WIDGET hWidget, int menuFlag, float x, float y) | |
{ | |
CReaderVCView* pView = (CReaderVCView*)pThis; | |
if (!pView) | |
return FALSE; | |
CMenu menu; | |
menu.CreatePopupMenu(); | |
int nMenuIndex = 0; | |
if (menuFlag & FXFA_MEMU_COPY) | |
menu.InsertMenu(nMenuIndex++, MF_BYPOSITION, WM_XFAMENU_COPY, "Copy"); | |
//... | |
CPoint pt; | |
pView->PageToDevice(x, y, pt); | |
UINT nID = menu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, pView); | |
switch(nID) | |
{ | |
case WM_XFAMENU_COPY: | |
{ | |
FPDF_DWORD length = 0; | |
FPDF_Widget_Copy(pView->GetPDFDoc(), hWidget, NULL, &length); | |
if (length > 0) | |
{ | |
unsigned short* buffer = (unsigned short*)malloc((length+1)*sizeof(unsigned short)); | |
memset(buffer, 0, (length+1)*sizeof(unsigned short)); | |
FPDF_Widget_Copy(pView->GetPDFDoc(), hWidget, buffer, &length); | |
free(buffer); | |
} | |
} | |
break; | |
} | |
menu.DestroyMenu(); | |
return TRUE; | |
} | |
FPDF_FILEHANDLER* Sample_OpenFile(struct _FPDF_FORMFILLINFO* pThis, int fileFlag, FPDF_WIDESTRING wsURL) | |
{ | |
char* pszURL; | |
CString strURL; | |
if (wsURL == NULL) { | |
if (fileFlag == FXFA_FILE_XDP) | |
strURL = "C://temp.xdp"; | |
else if(fileFlag == FXFA_FILE_XML) | |
strURL = "C://temp.xml"; | |
} | |
else { | |
int iSize; | |
iSize = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsURL, -1, NULL, 0, NULL, NULL); | |
pszURL = (char*)malloc((iSize+1)); | |
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsURL, -1, pszURL, iSize, NULL, NULL); | |
CString str(pszURL); | |
strURL = str; | |
} | |
FILE* file = fopen(strURL, "r"); | |
FPDF_FILE* pFileHander = new FPDF_FILE; | |
pFileHander->file = file; | |
pFileHander->fileHandler.clientData = pFileHander; | |
pFileHander->fileHandler.Flush = Sample_Flush; | |
pFileHander->fileHandler.GetSize = Sample_GetSize; | |
pFileHander->fileHandler.ReadBlock = Sample_ReadBlock; | |
pFileHander->fileHandler.Release = Sample_Release; | |
pFileHander->fileHandler.Truncate = Sample_Truncate; | |
pFileHander->fileHandler.WriteBlock = Sample_WriteBlock; | |
free(pszURL); | |
return &pFileHander->fileHandler; | |
} | |
FPDF_BOOL Sample_GetFilePath(struct _FPDF_FORMFILLINFO* pThis, FPDF_FILEHANDLER* pFileHandler, FPDF_BSTR* path) | |
{ | |
CReaderVCView* pView = (CReaderVCView*)pThis; | |
if (!pView) | |
return NULL; | |
CString filePath = pView->GetFilePath(); | |
FPDF_BStr_Set(path, filePath.GetBuffer(filePath.GetLength()), filePath.GetLength()); | |
return TRUE; | |
} | |
void Sample_EmailTo(struct _FPDF_FORMFILLINFO* pThis, FPDF_FILEHANDLER* fileHandler, FPDF_WIDESTRING emailTo) | |
{ | |
MessageBoxW(NULL, (wchar_t*)emailTo, L"Sample_email", MB_OK); | |
} | |
void Sample_UploadTo(struct _FPDF_FORMFILLINFO* pThis, FPDF_FILEHANDLER* fileHandler, FPDF_WIDESTRING uploadTo) | |
{ | |
int iSize; | |
char* pszURL; | |
iSize = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)uploadTo, -1, NULL, 0, NULL, NULL); | |
pszURL = (char*)malloc((iSize+1)); | |
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)uploadTo, -1, pszURL, iSize, NULL, NULL); | |
CString strPath(pszURL); | |
CString strUploadPath = "C://test"; | |
int pos = strPath.ReverseFind('.'); | |
if (pos != -1){ | |
CString suffix = strPath.Right(strPath.GetLength()-pos); | |
strUploadPath += suffix; | |
} | |
FILE* file = fopen(strUploadPath, "r"); | |
if (file) { | |
int size = fileHandler->GetSize(fileHandler->clientData); | |
BYTE* buffer = (BYTE*)malloc(size); | |
fileHandler->ReadBlock(fileHandler->clientData, 0, buffer, size); | |
fwrite(buffer, size, 1, file); | |
fflush(file); | |
fclose(file); | |
free(buffer); | |
} | |
free(pszURL); | |
} | |
int Sample_GetAppName(struct _FPDF_FORMFILLINFO* pThis, void* appName, int length) | |
{ | |
if(appName == NULL || length <= 0) | |
{ | |
CString name = AfxGetAppName(); | |
return name.GetLength(); | |
} | |
else | |
{ | |
CString name = AfxGetAppName(); | |
int len = name.GetLength(); | |
if(length > len) | |
length = len; | |
memcpy(appName, name.GetBuffer(name.GetLength()), length); | |
return length; | |
} | |
} | |
int Sample_GetPlatform(struct _FPDF_FORMFILLINFO* pThis, void* platform, int length) | |
{ | |
if(platform == NULL || length <= 0) | |
{ | |
return 3; | |
} | |
else | |
{ | |
if(length > 3) | |
length = 3; | |
memcpy(platform, "win", length); | |
return length; | |
} | |
} | |
int Sample_GetDocumentCount(struct _FPDF_FORMFILLINFO* pThis) | |
{ | |
return 1; | |
} | |
int Sample_GetCurDocumentIndex(struct _FPDF_FORMFILLINFO* pThis) | |
{ | |
return 0; | |
} | |
FPDF_LPFILEHANDLER Sample_DownloadFromURL(struct _FPDF_FORMFILLINFO* pThis, FPDF_WIDESTRING URL) | |
{ | |
int iSize; | |
char* pszURL; | |
iSize = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)URL, -1, NULL, 0, NULL, NULL); | |
pszURL = (char*)malloc((iSize+1)); | |
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)URL, -1, pszURL, iSize, NULL, NULL); | |
CString strURL(pszURL); | |
CString bsLocal = strURL; | |
CReaderVCView::CreateLocalPath(bsLocal); | |
if (strURL.Left(7) == "http://") | |
{ | |
CInternetSession sess; | |
CHttpFile *pFile = (CHttpFile*)sess.OpenURL(strURL); | |
int iLength = pFile->GetLength(); | |
if (pFile == NULL || iLength < 1) return NULL; | |
FILE *pImageFile = fopen(bsLocal, "wb"); | |
BYTE* pContent = new BYTE[iLength]; | |
memset(pContent, 0, iLength); | |
int iRead = pFile->Read(pContent, iLength); | |
fwrite(pContent, 1, iLength, pImageFile); | |
free(pContent); | |
fflush(pImageFile); | |
fclose(pImageFile); | |
pFile->Close(); | |
delete pFile; | |
sess.Close(); | |
} | |
else if (strURL.Left(6) == "ftp://") | |
{ | |
CInternetSession sess; | |
CFtpConnection* pConnect = sess.GetFtpConnection(bsLocal, "NULL", "NULL"); | |
CInternetFile* pFile = pConnect->OpenFile(bsLocal); | |
int iLength = pFile->GetLength(); | |
if (pFile == NULL || iLength < 1) return NULL; | |
FILE *pImageFile = fopen(bsLocal, "wb"); | |
BYTE* pContent = new BYTE[iLength]; | |
memset(pContent, 0, iLength); | |
int iRead = pFile->Read(pContent, iLength); | |
fwrite(pContent, 1, iLength, pImageFile); | |
free(pContent); | |
fflush(pImageFile); | |
fclose(pImageFile); | |
pFile->Close(); | |
delete pFile; | |
sess.Close(); | |
} | |
free(pszURL); | |
FPDF_FILE* fileWrap = new FPDF_FILE; | |
FILE* file = fopen(bsLocal, "r"); | |
fileWrap->file = file; | |
fileWrap->fileHandler.clientData = fileWrap; | |
fileWrap->fileHandler.ReadBlock = Sample_ReadBlock; | |
fileWrap->fileHandler.GetSize = Sample_GetSize; | |
fileWrap->fileHandler.Flush = Sample_Flush; | |
fileWrap->fileHandler.Release = Sample_Release; | |
fileWrap->fileHandler.Truncate = Sample_Truncate; | |
fileWrap->fileHandler.WriteBlock = Sample_WriteBlock; | |
return &fileWrap->fileHandler; | |
} | |
FPDF_BOOL Sample_PostRequestURL(struct _FPDF_FORMFILLINFO* pThis, FPDF_WIDESTRING wsURL, FPDF_WIDESTRING wsData, FPDF_WIDESTRING wsContentType, FPDF_WIDESTRING wsEncode, FPDF_WIDESTRING wsHeader, FPDF_BSTR* respone) | |
{ | |
int iSize; | |
char* pszURL; | |
iSize = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsURL, -1, NULL, 0, NULL, NULL); | |
pszURL = (char*)malloc((iSize+1)); | |
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsURL, -1, pszURL, iSize, NULL, NULL); | |
CString csURL(pszURL); | |
char* pszData; | |
iSize = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsData, -1, NULL, 0, NULL, NULL); | |
pszData = (char*)malloc(iSize+1); | |
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsData, -1, pszData, iSize, NULL, NULL); | |
CString csData(pszData); | |
char* pszContentType; | |
iSize = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsContentType, -1, NULL, 0, NULL, NULL); | |
pszContentType = (char*)malloc(iSize+1); | |
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsContentType, -1, pszContentType, iSize, NULL, NULL); | |
CString csContentType(pszContentType); | |
char* pszHeader; | |
iSize = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsHeader, -1, NULL, 0, NULL, NULL); | |
pszHeader = (char*)malloc(iSize+1); | |
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsHeader, -1, pszHeader, iSize, NULL, NULL); | |
CString csHeader(pszHeader); | |
CString csApp = AfxGetAppName(); | |
csApp += L"/1.0"; | |
BOOL bRet = FALSE; | |
DWORD dwServiceType = 0, dwFlags = ICU_NO_META; | |
CString csServer, sObject, csUserName, csPassword; | |
INTERNET_PORT nPort = 0; | |
bRet = AfxParseURLEx(csURL, dwServiceType, csServer, sObject, nPort, csUserName, csPassword, dwFlags); | |
if (!bRet) | |
return bRet; | |
if (dwServiceType != AFX_INET_SERVICE_HTTP && dwServiceType != AFX_INET_SERVICE_HTTPS) | |
return bRet; | |
CString csObject = sObject; | |
CString csResponse; | |
bRet = CReaderVCView::HttpDataPost(csData, csApp, csObject, csServer, csUserName, csPassword, nPort, | |
dwServiceType == AFX_INET_SERVICE_HTTPS, csContentType, csHeader, csResponse); | |
FPDF_BStr_Init(respone); | |
FPDF_BStr_Set(respone, (FPDF_LPCSTR)csResponse.GetBuffer(csResponse.GetLength()), csResponse.GetLength()); | |
free(pszURL); | |
free(pszData); | |
free(pszContentType); | |
free(pszHeader); | |
return true; | |
} | |
FPDF_BOOL Sample_PutRequestURL(struct _FPDF_FORMFILLINFO* pThis, FPDF_WIDESTRING wsURL, FPDF_WIDESTRING wsData, FPDF_WIDESTRING wsEncode) | |
{ | |
int iSize; | |
char* pszURL; | |
iSize = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsURL, -1, NULL, 0, NULL, NULL); | |
pszURL = (char*)malloc((iSize+1)); | |
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsURL, -1, pszURL, iSize, NULL, NULL); | |
CString csURL(pszURL); | |
char* pszData; | |
iSize = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsData, -1, NULL, 0, NULL, NULL); | |
pszData = (char*)malloc((iSize+1)); | |
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsData, -1, pszData, iSize, NULL, NULL); | |
CString csData(pszData); | |
CString csApp = AfxGetAppName(); | |
csApp += L"/1.0"; | |
BOOL bRet = FALSE; | |
DWORD dwServiceType = 0, dwFlags = ICU_NO_META; | |
CString csServer, sObject, csUserName, csPassword; | |
INTERNET_PORT nPort = 0; | |
bRet = AfxParseURLEx(csURL, dwServiceType, csServer, sObject, nPort, csUserName, csPassword, dwFlags); | |
if (!bRet) | |
return bRet; | |
if (dwServiceType != AFX_INET_SERVICE_HTTP && dwServiceType != AFX_INET_SERVICE_HTTPS) | |
return bRet; | |
CString csObject = sObject; | |
bRet = CReaderVCView::HttpDataPut(csData, csApp, csObject, csServer, csUserName, csPassword, nPort, dwServiceType == AFX_INET_SERVICE_HTTPS); | |
free(pszData); | |
free(pszURL); | |
return TRUE; | |
} | |
FPDF_BOOL Sample_ShowFileDialog(struct _FPDF_FORMFILLINFO* pThis, FPDF_WIDESTRING wsTitle, FPDF_WIDESTRING wsFilter, FPDF_BOOL isOpen, FPDF_STRINGHANDLE pathArr) | |
{ | |
int iSize; | |
char* pszFilter; | |
iSize = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsFilter, -1, NULL, 0, NULL, NULL); | |
pszFilter = (char*)malloc((iSize+1)); | |
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wsFilter, -1, pszFilter, iSize, NULL, NULL); | |
CFileDialog fileOpen(isOpen, NULL,NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST, pszFilter); | |
// fileOpen.m_ofn.Flags|=OFN_ENABLEHOOK|OFN_ALLOWMULTISELECT; | |
if(fileOpen.DoModal()==IDCANCEL) | |
{ | |
return FALSE; | |
} | |
POSITION pos; | |
pos=fileOpen.GetStartPosition(); | |
CString csFile; | |
while(pos!=NULL) | |
{ | |
csFile=fileOpen.GetNextPathName(pos); | |
FPDF_StringHandleAddString(pathArr, csFile.GetBuffer(csFile.GetLength()), csFile.GetLength()); | |
} | |
free(pszFilter); | |
return TRUE; | |
} | |
FPDF_SYSTEMTIME CReaderVCView::GetLocalTimeImpl() | |
{ | |
FPDF_SYSTEMTIME sys; | |
time_t curTime; | |
time(&curTime); | |
tm* pTm = localtime(&curTime); | |
if(pTm) | |
{ | |
sys.wDay = pTm->tm_mday; | |
sys.wDayOfWeek= pTm->tm_wday; | |
sys.wHour = pTm->tm_hour; | |
sys.wMilliseconds = 0; | |
sys.wMinute = pTm->tm_min; | |
sys.wMonth = pTm->tm_mon; | |
sys.wSecond = pTm->tm_sec; | |
sys.wYear = pTm->tm_year + 1900; | |
} | |
return sys; | |
} | |
int CReaderVCView::GetRotationImpl(FPDF_PAGE page) | |
{ | |
return m_nRotateFlag; | |
} | |
FPDF_PAGE CReaderVCView::GetPageImpl(FPDF_DOCUMENT document,int nPageIndex) | |
{ | |
FPDF_PAGE page = NULL; | |
m_pageMap.Lookup(nPageIndex, page); | |
if(page) | |
return page; | |
page = FPDF_LoadPage(document, nPageIndex); | |
FORM_OnAfterLoadPage(page, m_pApp); | |
m_pageMap.SetAt(nPageIndex, page); | |
return page; | |
} | |
FPDF_PAGE CReaderVCView::GetCurrentPageImpl(FPDF_DOCUMENT document) | |
{ | |
return m_pPage; | |
} | |
bool CReaderVCView::IsALTKeyDownImpl() | |
{ | |
return GetKeyState(VK_MENU) < 0; | |
} | |
bool CReaderVCView::IsINSERTKeyDownImpl() | |
{ | |
return GetKeyState(VK_INSERT) & 0x01; | |
} | |
bool CReaderVCView::IsSHIFTKeyDownImpl() | |
{ | |
return !((GetKeyState(VK_SHIFT)&0x8000) == 0); | |
} | |
bool CReaderVCView::IsCTRLKeyDownImpl() | |
{ | |
return GetKeyState(VK_CONTROL) < 0; | |
} | |
void CReaderVCView::OnChangeImpl() | |
{ | |
} | |
CString CReaderVCView::GetFilePath() | |
{ | |
CReaderVCDoc* pDoc = GetDocument(); | |
if(pDoc) | |
{ | |
return pDoc->m_strPDFName; | |
} | |
return ""; | |
} | |
BOOL CReaderVCView::SubmitFormImpl(void* pBuffer, int nLength, CString strURL) | |
{ | |
CString tempFDFFile = "D://1.fdf"; | |
if (pBuffer == NULL || nLength <= 0) | |
{ | |
return FALSE; | |
} | |
CFile file; | |
if (file.Open(tempFDFFile, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary)) | |
{ | |
file.Write(pBuffer, nLength); | |
file.Close(); | |
} | |
return TRUE; | |
} | |
int Sample_appResponse(struct _IPDF_JsPlatform* pThis, FPDF_WIDESTRING Question, FPDF_WIDESTRING Title, | |
FPDF_WIDESTRING Default, FPDF_WIDESTRING cLabel, FPDF_BOOL bPassword, void* response, int length) | |
{ | |
CReaderVCView* pView = (CReaderVCView*)pThis->m_pFormfillinfo; | |
FPDF_WIDESTRING wsResponse; | |
if (pView->m_pwsResponse && response != NULL) | |
{ | |
wsResponse = (FPDF_WIDESTRING)pView->m_pwsResponse; | |
length = wcslen((const wchar_t*)wsResponse); | |
memcpy(response, wsResponse, length*sizeof(wchar_t)); | |
pView->m_pwsResponse = NULL; | |
} | |
else | |
{ | |
CJS_ResponseDlg dlg; | |
dlg.SetTitle(Title); | |
dlg.SetDefault(Default); | |
dlg.SetLabel(cLabel); | |
dlg.SetQuestion(Question); | |
dlg.SetIsVisible(bPassword); | |
int iRet = dlg.DoModal(); | |
if (iRet == 1) | |
{ | |
wsResponse = dlg.GetResponse(); | |
length = wcslen((const wchar_t*)wsResponse); | |
pView->m_pwsResponse = new wchar_t[length+1]; | |
memset(pView->m_pwsResponse, 0, length*sizeof(wchar_t)); | |
memcpy(pView->m_pwsResponse, wsResponse, length*sizeof(wchar_t)); | |
pView->m_pwsResponse[length] = L'\0'; | |
} | |
} | |
return length*sizeof(wchar_t); | |
} | |
int Sample_appalert(struct _IPDF_JsPlatform* pThis, FPDF_WIDESTRING Msg, FPDF_WIDESTRING Title, int Type, int Icon) | |
{ | |
int nRet = 0; | |
if(pThis && pThis->m_pFormfillinfo) | |
{ | |
CReaderVCView* pView = (CReaderVCView*)pThis->m_pFormfillinfo; | |
int msgType = MB_OK; | |
switch(Type) | |
{ | |
case 1: | |
msgType = MB_OKCANCEL; | |
break; | |
case 2: | |
msgType = MB_YESNO; | |
break; | |
case 3: | |
msgType = MB_YESNOCANCEL; | |
break; | |
case 0: | |
default: | |
break; | |
} | |
nRet = MessageBoxW(pView->m_hWnd, (const wchar_t*)Msg, (const wchar_t*)Title, msgType); | |
switch(nRet) | |
{ | |
case IDOK: | |
return 1; | |
case IDCANCEL: | |
return 2; | |
case IDNO: | |
return 3; | |
case IDYES: | |
return 4; | |
} | |
return nRet; | |
} | |
return nRet; | |
} | |
void Sample_appbeep(struct _IPDF_JsPlatform* pThis, int nType) | |
{ | |
MessageBeep(nType); | |
//AfxMessageBox("aaaa"); | |
} | |
CString userSelFilePath; | |
int Sample_fieldBrowse(struct _IPDF_JsPlatform* pThis,void* filePath, int length) | |
{ | |
if(userSelFilePath.IsEmpty()) | |
{ | |
CFileDialog fd(FALSE, "fdf"); | |
if(fd.DoModal() == IDOK) | |
{ | |
userSelFilePath = fd.GetPathName(); | |
if(filePath == NULL || length == 0) | |
return userSelFilePath.GetLength() + 1; | |
else | |
return 0; | |
} | |
else | |
return 0; | |
} | |
else | |
{ | |
int nLen = userSelFilePath.GetLength()+1; | |
if(length > nLen) | |
length = nLen; | |
memcpy(filePath, userSelFilePath.GetBuffer(length), length); | |
userSelFilePath.ReleaseBuffer(); | |
userSelFilePath = ""; | |
return length; | |
} | |
} | |
int Sample_docGetFilePath(struct _IPDF_JsPlatform* pThis, void* filePath, int length) | |
{ | |
if(pThis && pThis->m_pFormfillinfo) | |
{ | |
CReaderVCView* pView = (CReaderVCView*)pThis->m_pFormfillinfo; | |
CString csFilePath = pView->GetFilePath(); | |
int nbufflen = csFilePath.GetLength() + 1; | |
if(filePath == NULL || length == 0) | |
return nbufflen; | |
if(length > nbufflen) | |
length = nbufflen; | |
memcpy(filePath, csFilePath.GetBuffer(length), length); | |
csFilePath.ReleaseBuffer(); | |
return length; | |
} | |
return 0; | |
} | |
void Sample_docSubmitForm(struct _IPDF_JsPlatform* pThis,void* formData, int length, FPDF_WIDESTRING URL) | |
{ | |
if(pThis && pThis->m_pFormfillinfo) | |
{ | |
CReaderVCView *pView = (CReaderVCView*)pThis->m_pFormfillinfo; | |
if (pView) | |
{ | |
pView->SubmitFormImpl(formData, length, ""); | |
} | |
} | |
} | |
void Sample_gotoPage(struct _IPDF_JsPlatform* pThis, int nPageNum) | |
{ | |
if(pThis && pThis->m_pFormfillinfo) | |
{ | |
CReaderVCView *pView = (CReaderVCView*)pThis->m_pFormfillinfo; | |
if (pView) | |
{ | |
pView->GotoPage(nPageNum); | |
} | |
} | |
} | |
CReaderVCView::CReaderVCView() | |
{ | |
// TODO: add construction code here | |
m_pFram = NULL; | |
m_pExportPageDlg = NULL; | |
m_pDoc = NULL; | |
m_pPage = NULL; | |
m_nTotalPage = 0; | |
m_nRotateFlag = 0; | |
m_dbScaleFactor = 1.0f; | |
m_nPageIndex = -1; | |
m_dbPageWidth = 0.0f; | |
m_dbPageHeight = 0.0f; | |
m_nStartX = 0; | |
m_nStartY = 0; | |
m_nActualSizeX = 0; | |
m_nActualSizeY = 0; | |
//for search text | |
m_pTextPage = NULL; | |
m_FindInfo.m_strFind = _T(""); | |
m_FindInfo.m_nFlag = -1; | |
m_FindInfo.m_nDirection = -1; | |
m_FindInfo.m_nStartPageIndex = -1; | |
m_FindInfo.m_nStartCharIndex = -1; | |
m_FindInfo.m_bFirst = TRUE; | |
m_FindInfo.m_pCurFindBuf = NULL; | |
m_pSCHHandle = NULL; | |
m_rtFind = NULL; | |
m_nRectNum = 0; | |
//for select text | |
m_bSelect = FALSE; | |
m_bHand = TRUE; | |
m_bSnap = FALSE; | |
m_bHasChar = FALSE; | |
m_ptLBDown.x = m_ptLBDown.y = 0; | |
m_ptLBUp.x = m_ptLBUp.y = 0; | |
m_ptOld.x = m_ptOld.y = 0; | |
m_nStartIndex = m_nEndIndex = m_nOldIndex = -1; | |
m_rtArray.RemoveAll(); | |
m_rtOld.left = m_rtOld.right = m_rtOld.bottom = m_rtOld.top = 0; | |
m_nPosH = m_nPosV = -1; | |
// for links | |
m_pLink = NULL; | |
m_bBookmark = FALSE; | |
m_bmp = NULL; | |
m_pwsResponse = NULL; | |
this->FFI_Invalidate = Sample_Invalidate; | |
this->Release= Sample_Release; | |
this->FFI_SetTimer = Sample_SetTimer; | |
this->FFI_KillTimer = Sample_KillTimer; | |
this->FFI_GetLocalTime = Sample_GetLocalTime; | |
this->FFI_SetCursor = Sample_SetCursor; | |
this->FFI_OnChange = Sample_OnChange; | |
this->FFI_GetPage = Sample_GetPage; | |
this->FFI_GetCurrentPage = Sample_GetCurrentPage; | |
this->FFI_GetRotation = Sample_GetRotation; | |
this->FFI_OutputSelectedRect = Sample_OutputSelectedRect; | |
this->FFI_ExecuteNamedAction = Sample_ExecuteNamedAction; | |
this->FFI_OutputSelectedRect = NULL; | |
this->FFI_SetTextFieldFocus = NULL; | |
this->FFI_DoGoToAction = NULL; | |
this->FFI_DoURIAction = NULL; | |
this->FFI_DisplayCaret = Sample_DisplayCaret; | |
this->FFI_GetCurrentPageIndex = Sample_GetCurrentPageIndex; | |
this->FFI_SetCurrentPage = Sample_SetCurrentPage; | |
this->FFI_GotoURL = Sample_GotoURL; | |
this->FFI_GetPageViewRect = Sample_GetPageViewRect; | |
this->FFI_PopupMenu = Sample_PopupMenu; | |
this->FFI_OpenFile = Sample_OpenFile; | |
this->FFI_GetFilePath = Sample_GetFilePath; | |
this->FFI_EmailTo = Sample_EmailTo; | |
this->FFI_UploadTo = Sample_UploadTo; | |
this->FFI_GetPlatform = Sample_GetPlatform; | |
this->FFI_GetDocumentCount = Sample_GetDocumentCount; | |
this->FFI_GetCurDocumentIndex = Sample_GetCurDocumentIndex; | |
this->FFI_DownloadFromURL = Sample_DownloadFromURL; | |
this->FFI_PostRequestURL = Sample_PostRequestURL; | |
this->FFI_PutRequestURL = Sample_PutRequestURL; | |
this->FFI_ShowFileDialog = Sample_ShowFileDialog; | |
this->version = 1; | |
this->m_pJsPlatform = NULL; | |
this->m_pJsPlatform = new IPDF_JSPLATFORM; | |
memset(m_pJsPlatform, 0, sizeof(IPDF_JSPLATFORM)); | |
this->m_pJsPlatform->app_alert = Sample_appalert; | |
this->m_pJsPlatform->app_response = Sample_appResponse; | |
this->m_pJsPlatform->app_beep = Sample_appbeep; | |
this->m_pJsPlatform->Field_browse =Sample_fieldBrowse; | |
this->m_pJsPlatform->Doc_getFilePath = Sample_docGetFilePath; | |
this->m_pJsPlatform->Doc_submitForm = Sample_docSubmitForm; | |
this->m_pJsPlatform->Doc_gotoPage = Sample_gotoPage; | |
this->m_pJsPlatform->m_pFormfillinfo = this; | |
m_pApp = NULL; | |
} | |
CReaderVCView::~CReaderVCView() | |
{ | |
// FPDF_DestroyApp(m_App); | |
if(m_pTextPage != NULL) | |
{ | |
FPDFText_ClosePage(m_pTextPage); | |
m_pTextPage = NULL; | |
} | |
if (m_pLink != NULL) | |
{ | |
FPDFLink_CloseWebLinks(m_pLink); | |
m_pLink = NULL; | |
} | |
POSITION pos = m_pageMap.GetStartPosition(); | |
while(pos) | |
{ | |
int nIndex = 0; | |
FPDF_PAGE page = NULL; | |
m_pageMap.GetNextAssoc(pos, nIndex, page); | |
if (page) | |
{ | |
FORM_OnBeforeClosePage(page, m_pApp); | |
FPDF_ClosePage(page); | |
} | |
} | |
m_pPage = NULL; | |
if (m_pDoc != NULL) | |
{ | |
//Should strictly follow the reverse order of initialization . | |
FORM_DoDocumentAAction(m_pApp, FPDFDOC_AACTION_WC); | |
if(m_pApp) | |
FPDFDOC_ExitFormFillEnviroument(m_pApp); | |
FPDF_CloseDocument(m_pDoc); | |
m_pDoc = NULL; | |
} | |
if (m_FindInfo.m_pCurFindBuf != NULL) | |
{ | |
delete []m_FindInfo.m_pCurFindBuf; | |
m_FindInfo.m_pCurFindBuf = NULL; | |
} | |
if (m_rtFind != NULL) | |
{ | |
delete m_rtFind; | |
m_rtFind = NULL; | |
} | |
if(m_bmp != NULL) | |
{ | |
FPDFBitmap_Destroy(m_bmp); | |
} | |
if (m_pwsResponse) | |
{ | |
delete m_pwsResponse; | |
m_pwsResponse = NULL; | |
} | |
if(this->m_pJsPlatform) | |
delete m_pJsPlatform; | |
m_mapTimerFuns.RemoveAll(); | |
// m_formFiledInfo.Release(); | |
// } | |
// m_rtArray.RemoveAll(); | |
} | |
BOOL CReaderVCView::PreCreateWindow(CREATESTRUCT& cs) | |
{ | |
// TODO: Modify the Window class or styles here by modifying | |
// the CREATESTRUCT cs | |
cs.style |= WS_MAXIMIZE | WS_VISIBLE | WS_VSCROLL |WS_HSCROLL; | |
return CView::PreCreateWindow(cs); | |
} | |
///////////////////////////////////////////////////////////////////////////// | |
// CReaderVCView drawing | |
void CReaderVCView::OnDraw(CDC* pDC) | |
{ | |
CReaderVCDoc* pDoc = GetDocument(); | |
ASSERT_VALID(pDoc); | |
// TODO: add draw code for native data here | |
DrawPage(m_nRotateFlag, pDC); | |
DrawAllRect(pDC); | |
} | |
///////////////////////////////////////////////////////////////////////////// | |
// CReaderVCView printing | |
BOOL CReaderVCView::OnPreparePrinting(CPrintInfo* pInfo) | |
{ | |
// default preparation | |
return DoPreparePrinting(pInfo); | |
} | |
void CReaderVCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) | |
{ | |
// TODO: add extra initialization before printing | |
} | |
void CReaderVCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) | |
{ | |
// TODO: add cleanup after printing | |
} | |
///////////////////////////////////////////////////////////////////////////// | |
// CReaderVCView diagnostics | |
#ifdef _DEBUG | |
void CReaderVCView::AssertValid() const | |
{ | |
CView::AssertValid(); | |
} | |
void CReaderVCView::Dump(CDumpContext& dc) const | |
{ | |
CView::Dump(dc); | |
} | |
CReaderVCDoc* CReaderVCView::GetDocument() // non-debug version is inline | |
{ | |
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CReaderVCDoc))); | |
return (CReaderVCDoc*)m_pDocument; | |
} | |
#endif //_DEBUG | |
///////////////////////////////////////////////////////////////////////////// | |
// CReaderVCView message handlers | |
BOOL CReaderVCView::LoadPDFPage(FPDF_DOCUMENT doc, int nIndex, CPoint pos) | |
{ | |
if(NULL == doc) return FALSE; | |
if(nIndex < 0) nIndex = 0; | |
if(nIndex > m_nTotalPage) nIndex = m_nTotalPage; | |
FORM_DoPageAAction(m_pPage, m_pApp, FPDFPAGE_AACTION_CLOSE); | |
m_pPage = NULL; | |
m_pageMap.Lookup(nIndex, m_pPage); | |
if(!m_pPage) | |
{ | |
m_pPage = FPDF_LoadPage(doc, nIndex); | |
FORM_OnAfterLoadPage(m_pPage, m_pApp); | |
m_pageMap.SetAt(nIndex, m_pPage); | |
} | |
if(NULL == m_pPage) return FALSE; | |
FORM_DoPageAAction(m_pPage, m_pApp, FPDFPAGE_AACTION_OPEN); | |
m_nPageIndex = nIndex; | |
SetPageMetrics(m_pPage); | |
if (m_pTextPage != NULL) | |
{ | |
FPDFText_ClosePage(m_pTextPage); | |
m_pTextPage = NULL; | |
} | |
m_pTextPage = FPDFText_LoadPage(m_pPage); | |
CChildFrame *pParent = (CChildFrame *)this->GetParentFrame(); | |
if (pParent != NULL) | |
{ | |
pParent->SetActiveView(this); | |
SyncScroll(); | |
} | |
if(pos.x !=0 && pos.y != 0) | |
{ | |
FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, (int)(m_nActualSizeX * m_dbScaleFactor), | |
(int)(m_nActualSizeY * m_dbScaleFactor), m_nRotateFlag, pos.x, pos.y, &m_nStartX, &m_nStartY); | |
m_nStartX = -m_nStartX + 20; | |
m_nStartY = -m_nStartY + 20; | |
int nSizeX = 0; | |
int nSizeY = 0; | |
if (1 == m_nRotateFlag || 3 == m_nRotateFlag) | |
{ | |
nSizeX = m_nActualSizeY; | |
nSizeY = m_nActualSizeX; | |
} | |
else | |
{ | |
nSizeX = m_nActualSizeX; | |
nSizeY = m_nActualSizeY; | |
} | |
SCROLLINFO scrinfo; | |
GetScrollInfo(SB_VERT, &scrinfo); | |
scrinfo.nMin = 0; | |
scrinfo.nMax =(int) (nSizeY * m_dbScaleFactor + abs(m_nStartY)); | |
SetScrollInfo(SB_VERT, &scrinfo); | |
SetScrollPos(SB_VERT, abs(m_nStartY), TRUE); | |
GetScrollInfo(SB_HORZ, &scrinfo); | |
scrinfo.nMin = 0; | |
scrinfo.nMax = (int)(nSizeX * m_dbScaleFactor + abs(m_nStartX)); | |
SetScrollInfo(SB_HORZ, &scrinfo); | |
SetScrollPos(SB_HORZ, abs(m_nStartX), TRUE); | |
} | |
this->Invalidate(TRUE); | |
// FPDFApp_SetPage(m_App, m_pPage); | |
return TRUE; | |
} | |
void CReaderVCView::InvalidateImpl(FPDF_PAGE page, double left, double top, double right, double bottom) | |
{ | |
int device_left, device_top, device_right, device_bottom; | |
int nActualRangeX = 0; | |
int nActualRangeY = 0; | |
if ( m_nRotateFlag % 2 == 0 ) | |
{ | |
nActualRangeX = m_nActualSizeX; | |
nActualRangeY = m_nActualSizeY; | |
}else{ | |
nActualRangeX = m_nActualSizeY; | |
nActualRangeY = m_nActualSizeX; | |
} | |
FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
(int)(nActualRangeY * m_dbScaleFactor), m_nRotateFlag, left, top, &device_left, &device_top); | |
FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
(int)(nActualRangeY * m_dbScaleFactor), m_nRotateFlag, right, bottom, &device_right, &device_bottom); | |
CRect rc(device_left,device_top, device_right, device_bottom); | |
// TRACE("left = %d\r\n", device_left); | |
// TRACE("top = %d\r\n", device_top); | |
// TRACE("right = %d\r\n", device_right); | |
// TRACE("bottom = %d\r\n", device_bottom); | |
if(device_right-device_left>5) | |
TRACE("left=%d,top=%d,right=%d,bottom=%d\r\n",device_left,device_top,device_right,device_bottom); | |
::InvalidateRect(m_hWnd, rc, FALSE); | |
} | |
void CReaderVCView::SetCaretImpl(FPDF_PAGE page,double page_x, double page_y, int nWidth, int nHeight) | |
{ | |
} | |
void CReaderVCView::ReleaseImpl() | |
{ | |
} | |
CMap<int, int,TimerCallback, TimerCallback> CReaderVCView::m_mapTimerFuns; | |
int CReaderVCView::SetTimerImpl(int uElapse, TimerCallback lpTimerFunc) | |
{ | |
int nTimeID = ::SetTimer(NULL, 0, uElapse, TimerProc); | |
m_mapTimerFuns.SetAt(nTimeID, lpTimerFunc); | |
return nTimeID; | |
} | |
void CReaderVCView::KillTimerImpl(int nID) | |
{ | |
::KillTimer(NULL, nID); | |
m_mapTimerFuns.RemoveKey(nID); | |
} | |
void CReaderVCView::SetCurorImpl(int nCursorType) | |
{ | |
HCURSOR hcur = LoadCursor(NULL, IDC_UPARROW); | |
switch(nCursorType) | |
{ | |
case FXCT_ARROW: | |
case FXCT_NESW: | |
case FXCT_NWSE: | |
case FXCT_VBEAM: | |
case FXCT_HBEAM: | |
case FXCT_HAND: | |
// ::SetCursor(hcur); | |
break; | |
} | |
} | |
void CReaderVCView::PageToDeviceImpl(FPDF_PAGE page,double page_x,double page_y, int* device_x, int* device_y) | |
{ | |
int nActualRangeX = 0; | |
int nActualRangeY = 0; | |
if ( m_nRotateFlag % 2 == 0 ) | |
{ | |
nActualRangeX = m_nActualSizeX; | |
nActualRangeY = m_nActualSizeY; | |
}else{ | |
nActualRangeX = m_nActualSizeY; | |
nActualRangeY = m_nActualSizeX; | |
} | |
FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
(int)(nActualRangeY * m_dbScaleFactor), m_nRotateFlag, page_x, page_y,device_x, device_y); | |
} | |
void CReaderVCView::DeviceToPageImpl(FPDF_PAGE page,int device_x, int device_y, double* page_x, double* page_y) | |
{ | |
int nActualRangeX = 0; | |
int nActualRangeY = 0; | |
if ( m_nRotateFlag % 2 == 0 ) | |
{ | |
nActualRangeX = m_nActualSizeX; | |
nActualRangeY = m_nActualSizeY; | |
}else{ | |
nActualRangeX = m_nActualSizeY; | |
nActualRangeY = m_nActualSizeX; | |
} | |
FPDF_DeviceToPage(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
(int)(nActualRangeY * m_dbScaleFactor), m_nRotateFlag, device_x, device_y, page_x, page_y); | |
} | |
void CReaderVCView::SetPageMetrics(FPDF_PAGE pPage) | |
{ | |
m_nStartX = 10; | |
m_nStartY = 10; | |
if(NULL==pPage) return; | |
//get pdf page width an height; | |
m_dbPageWidth = FPDF_GetPageWidth(pPage); | |
m_dbPageHeight = FPDF_GetPageHeight(pPage); | |
CDC *pDC = GetDC(); | |
int ix, iy; | |
ix = pDC->GetDeviceCaps(LOGPIXELSX); | |
iy = pDC->GetDeviceCaps(LOGPIXELSY); | |
m_nActualSizeX = (int)(m_dbPageWidth / 72 * ix + 0.5f);//convert pdf coordinates to device | |
m_nActualSizeY = (int)(m_dbPageHeight / 72 * iy + 0.5f);//convert pdf coordinates to device | |
ReleaseDC(pDC); | |
} | |
void CReaderVCView::SetScalFactor(double dbScal) | |
{ | |
if(dbScal > 64 ) m_dbScaleFactor = 64; | |
if( dbScal < 0) m_dbScaleFactor = 0.08f; | |
m_dbScaleFactor = dbScal; | |
} | |
void CReaderVCView::DrawPage(int nRotate, CDC *pDC) | |
{ | |
int nSizeX = m_nActualSizeX; | |
int nSizeY = m_nActualSizeY; | |
if (1 == nRotate || 3 == nRotate) | |
{ | |
int temp = nSizeX; | |
nSizeX = nSizeY; | |
nSizeY = temp; | |
} | |
int nShowSizeX = (int)(nSizeX * m_dbScaleFactor + m_nStartX); | |
int nShowSizeY = (int)(nSizeY * m_dbScaleFactor + m_nStartY); | |
CRect rc; | |
pDC->GetClipBox(&rc); | |
FPDF_BITMAP bmptemp = FPDFBitmap_Create(rc.Width(), rc.Height(), 0); | |
int nClientWidth = FPDFBitmap_GetWidth(bmptemp); | |
int nClientHeight = FPDFBitmap_GetHeight(bmptemp); | |
FPDFBitmap_FillRect(bmptemp, 0, 0, nClientWidth, nClientHeight, 255,255,255, 0); | |
FPDF_RenderPageBitmap(bmptemp, m_pPage, m_nStartX-rc.left, m_nStartY-rc.top, (int)(nSizeX * m_dbScaleFactor), (int)(nSizeY * m_dbScaleFactor), nRotate, | |
FPDF_LCD_TEXT | FPDF_NO_NATIVETEXT); | |
FPDF_FFLDraw(m_pApp, bmptemp, m_pPage, m_nStartX-rc.left, m_nStartY-rc.top, (int)(nSizeX * m_dbScaleFactor), (int)(nSizeY * m_dbScaleFactor), nRotate, | |
FPDF_ANNOT | FPDF_LCD_TEXT | FPDF_NO_NATIVETEXT); | |
// m_pPage2 = FPDF_LoadPage(m_pDoc, 2); | |
// FPDF_RenderPageBitmap(m_bmp, m_pPage2, m_nStartX+500, m_nStartY, (int)(nSizeX * m_dbScaleFactor), (int)(nSizeY * m_dbScaleFactor), nRotate, | |
// FPDF_LCD_TEXT | FPDF_NO_NATIVETEXT); | |
// FPDF_FFLDraw(m_pApp, m_bmp, m_pPage2, m_nStartX+500, m_nStartY, (int)(nSizeX * m_dbScaleFactor), (int)(nSizeY * m_dbScaleFactor), nRotate, | |
// FPDF_ANNOT | FPDF_LCD_TEXT | FPDF_NO_NATIVETEXT); | |
int t = FPDFBitmap_GetStride(bmptemp); | |
int bufsize=FPDFBitmap_GetStride(bmptemp)*nClientHeight; | |
void* bmpbuf=FPDFBitmap_GetBuffer(bmptemp); | |
CDC MemDC; | |
CBitmap winbmp; | |
MemDC.CreateCompatibleDC(pDC); | |
if((HBITMAP)winbmp != NULL) | |
winbmp.DeleteObject(); | |
if(HBITMAP(winbmp) == NULL) | |
{ | |
winbmp.CreateCompatibleBitmap(pDC,nClientWidth,nClientHeight); | |
winbmp.SetBitmapBits(bufsize,bmpbuf); | |
} | |
MemDC.SelectObject(&winbmp); | |
pDC->BitBlt(rc.left , rc.top , nClientWidth, nClientHeight, &MemDC,0,0,SRCCOPY); | |
MemDC.DeleteDC(); | |
FPDFBitmap_Destroy(bmptemp); | |
int size = m_SelectArray.GetSize(); | |
for(int i=0; i<size; i++) | |
{ | |
CRect rc = m_SelectArray.GetAt(i); | |
CDC memdc; | |
CBitmap bmp,*pOldBitmap; | |
memdc.CreateCompatibleDC(pDC); | |
bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height()); | |
pOldBitmap = memdc.SelectObject(&bmp); | |
memdc.FillSolidRect(0,0,rc.Width(),rc.Height(),RGB(0,100,160)); | |
BLENDFUNCTION bf; | |
bf.BlendOp = AC_SRC_OVER; | |
bf.BlendFlags = 0; | |
bf.SourceConstantAlpha = 0x4f; | |
bf.AlphaFormat = 0; | |
BOOL ret=AlphaBlend(pDC->GetSafeHdc(),rc.left,rc.top,rc.Width(),rc.Height(),memdc.GetSafeHdc(),0,0,rc.Width(),rc.Height(),bf); | |
memdc.SelectObject(pOldBitmap); | |
memdc.DeleteDC(); | |
bmp.DeleteObject(); | |
} | |
m_SelectArray.RemoveAll(); | |
} | |
void CReaderVCView::GetNewPageSize(int &nsizeX, int &nsizeY) | |
{ | |
int nSizeX = m_nActualSizeX; | |
int nSizeY = m_nActualSizeY; | |
if (1 == m_nRotateFlag || 3 == m_nRotateFlag) | |
{ | |
int temp = nSizeX; | |
nSizeX = nSizeY; | |
nSizeY = temp; | |
} | |
nsizeX = (int)(nSizeX*m_dbScaleFactor); | |
nsizeY = (int)(nSizeY*m_dbScaleFactor); | |
} | |
void CReaderVCView::OnDocFirstpage() | |
{ | |
if(m_nPageIndex == 0) return; | |
this->m_nPageIndex = 0; | |
this->LoadPDFPage(m_pDoc, 0); | |
DeleteAllRect(); | |
} | |
void CReaderVCView::OnDocGotopage() | |
{ | |
CGotoPageDlg dlg; | |
dlg.DoModal(); | |
} | |
void CReaderVCView::OnDocLastpage() | |
{ | |
// FPDF_DOCUMENT doc = FPDF_LoadDocument("d:\\a1.pdf", ""); | |
// FPDF_PAGE page = FPDF_LoadPage(doc, 0); | |
// FPDF_IMAGEOBJECT imgObject = FPDFPageObj_NewImgeObj(doc); | |
// long ret = FPDFImageObj_LoadFromFileEx(&page, 1 , | |
// imgObject, "E:\\temp\\temp\\k.gif",TRUE | |
// ); | |
// FPDFImageObj_SetMatrix(imgObject, 240, 0, 0, 160, 1*50, 0 ); | |
// FPDFPage_InsertObject(page, imgObject); | |
// FPDFPage_GenerateContent(page); | |
// FPDF_SaveAsFile(doc, "D:\\out.pdf", 0, NULL, 0, NULL, 0); | |
// FPDF_ClosePage(page); | |
// FPDF_CloseDocument(doc); | |
// return; | |
if(m_nPageIndex == m_nTotalPage -1) return; | |
this->m_nPageIndex = m_nTotalPage -1; | |
LoadPDFPage(m_pDoc, m_nPageIndex); | |
DeleteAllRect(); | |
} | |
void CReaderVCView::OnDocNextpage() | |
{ | |
m_nPageIndex ++ ; | |
m_nPageIndex %= m_nTotalPage; | |
LoadPDFPage(m_pDoc, m_nPageIndex); | |
DeleteAllRect(); | |
} | |
void CReaderVCView::OnDocPrepage() | |
{ | |
m_nPageIndex --; | |
if(m_nPageIndex < 0) m_nPageIndex = m_nTotalPage-1; | |
LoadPDFPage(m_pDoc, m_nPageIndex); | |
DeleteAllRect(); | |
} | |
void CReaderVCView::OnClockwise() | |
{ | |
m_nRotateFlag ++; | |
m_nRotateFlag %= 4; | |
LoadPDFPage(m_pDoc, m_nPageIndex); | |
} | |
void CReaderVCView::OnCounterclockwise() | |
{ | |
m_nRotateFlag --; | |
if (m_nRotateFlag < 0) m_nRotateFlag = 3; | |
LoadPDFPage(m_pDoc, m_nPageIndex); | |
} | |
BOOL CReaderVCView::SetPDFDocument(FPDF_DOCUMENT pDoc, int nPageNum) | |
{ | |
if(pDoc == NULL) return FALSE; | |
m_pApp = FPDFDOC_InitFormFillEnviroument(pDoc,this); | |
FPDF_LoadXFA(pDoc); | |
FORM_DoDocumentJSAction(m_pApp); | |
FORM_DoDocumentOpenAction(m_pApp); | |
// FORM_OnAfterLoadDocument(m_pApp); | |
FPDF_SetFormFieldHighlightColor(m_pApp, 0, RGB(0,255, 0)); | |
FPDF_SetFormFieldHighlightAlpha(m_pApp, 128); | |
m_pDoc = pDoc; | |
m_nTotalPage = nPageNum; | |
if(!LoadPDFPage(m_pDoc, 0)) return FALSE; | |
return TRUE; | |
} | |
void CReaderVCView::GotoPage(int index) | |
{ | |
if(index < 0 || index >= m_nTotalPage){MessageBoxA("Invalidate index");} | |
if(index == m_nPageIndex) return; | |
if(!LoadPDFPage(m_pDoc, index)) return; | |
DeleteAllRect(); | |
} | |
void CReaderVCView::OnViewActualSize() | |
{ | |
m_nStartX = m_nStartY = 10; | |
ScalPage(1.0f); | |
} | |
void CReaderVCView::OnViewFitPage() | |
{ | |
m_nStartX = m_nStartY = 10; | |
CRect rect; | |
GetClientRect(rect); | |
double dbHeight = rect.Height(); | |
double dbScal = dbHeight / m_nActualSizeY; | |
ScalPage(dbScal); | |
} | |
void CReaderVCView::OnViewFitWidth() | |
{ | |
m_nStartX = m_nStartY = 10; | |
CRect rect; | |
GetClientRect(rect); | |
double dbWidth= rect.Width(); | |
double dbScal = dbWidth / m_nActualSizeX; | |
ScalPage(dbScal); | |
} | |
void CReaderVCView::OnViewZoomIn() | |
{ | |
double dbScal = m_dbScaleFactor; | |
dbScal += 0.25f; | |
if(dbScal > 6400.0f) return; | |
ScalPage(dbScal); | |
} | |
void CReaderVCView::OnViewZoomOut() | |
{ | |
double dbScal = m_dbScaleFactor; | |
dbScal -= 0.25f; | |
if(dbScal < 0.25f) return; | |
ScalPage(dbScal); | |
} | |
void CReaderVCView::OnViewZoomTo() | |
{ | |
CZoomDlg dlg; | |
dlg.DoModal(); | |
} | |
void CReaderVCView::ScalPage(double dbScal) | |
{ | |
SetScalFactor(dbScal); | |
CChildFrame *pParent = (CChildFrame *)this->GetParentFrame(); | |
if (pParent != NULL) | |
{ | |
pParent->SetActiveView(this); | |
SyncScroll(); | |
} | |
Invalidate(TRUE); | |
} | |
void CReaderVCView::OnEditFind() | |
{ | |
if(m_pTextPage == NULL) | |
{ | |
AfxMessageBox("Sorry, the fpdftext.dll may has expired. For keeping on using the dll, please contact sales@foxitsoftware.com."); | |
return; | |
} | |
CFindDlg dlg; | |
dlg.DoModal(); | |
} | |
void CReaderVCView::FindText(CString strFind, BOOL bCase, BOOL bWholeword, int Direction) | |
{ | |
CString str; | |
str = m_FindInfo.m_strFind; | |
int nFlag = 0; | |
if(bCase) { nFlag |= FPDF_MATCHCASE; } | |
if(bWholeword) { nFlag |= FPDF_MATCHWHOLEWORD; } | |
if(NULL == m_pTextPage) return; | |
if (strFind.Compare(str) != 0 || nFlag != m_FindInfo.m_nFlag)//new search | |
{ | |
if (NULL == m_pTextPage) return; | |
if (NULL != m_pSCHHandle) | |
{ | |
FPDFText_FindClose(m_pSCHHandle); | |
m_pSCHHandle = NULL; | |
} | |
int len = MultiByteToWideChar(CP_ACP, 0, strFind.GetBuffer(0), -1, NULL, NULL); | |
wchar_t *pBuf = new wchar_t[len]; | |
memset(pBuf, 0, len*sizeof(wchar_t)); | |
MultiByteToWideChar(CP_ACP, 0, strFind.GetBuffer(0), strFind.GetLength(), pBuf, len); | |
pBuf[len-1] = L'\0'; | |
m_pSCHHandle = FPDFText_FindStart(m_pTextPage, (FPDF_WIDESTRING)pBuf, nFlag, 0); | |
if(NULL == m_pSCHHandle) return; | |
if (m_FindInfo.m_pCurFindBuf != NULL) | |
{ | |
delete []m_FindInfo.m_pCurFindBuf; | |
m_FindInfo.m_pCurFindBuf = NULL; | |
} | |
m_FindInfo.m_pCurFindBuf = new wchar_t[len]; | |
memset(m_FindInfo.m_pCurFindBuf, 0, len*sizeof(wchar_t)); | |
memcpy(m_FindInfo.m_pCurFindBuf, pBuf, len*sizeof(wchar_t)); | |
delete []pBuf; | |
//save the find info | |
m_FindInfo.m_strFind = strFind; | |
m_FindInfo.m_nFlag = nFlag; | |
m_FindInfo.m_nDirection = Direction; | |
m_FindInfo.m_nStartPageIndex = m_nPageIndex; | |
m_FindInfo.m_bFirst = TRUE; | |
} | |
FindNext(Direction); | |
} | |
void CReaderVCView::FindNext(int nDirection) | |
{ | |
if(NULL == m_pSCHHandle) return; | |
BOOL bResult = FALSE; | |
if (nDirection != m_FindInfo.m_nDirection) | |
{ | |
m_FindInfo.m_nDirection = nDirection; | |
m_FindInfo.m_bFirst = TRUE; | |
} | |
if (0 == nDirection)// find down | |
{ | |
bResult = FPDFText_FindNext(m_pSCHHandle); | |
} | |
if (1 == nDirection) | |
{ | |
bResult = FPDFText_FindPrev(m_pSCHHandle); | |
} | |
while(!bResult){ | |
if (m_rtFind != NULL) | |
{ | |
delete [] m_rtFind; | |
m_rtFind = NULL; | |
} | |
if (0 == nDirection) | |
{ | |
m_nPageIndex ++; | |
m_nPageIndex %= m_nTotalPage; | |
if(!LoadPDFPage(m_pDoc, m_nPageIndex)) return; | |
if (NULL == m_pTextPage) return; | |
if (NULL != m_pSCHHandle) | |
{ | |
FPDFText_FindClose(m_pSCHHandle); | |
m_pSCHHandle = NULL; | |
} | |
m_pSCHHandle = FPDFText_FindStart(m_pTextPage, (FPDF_WIDESTRING)m_FindInfo.m_pCurFindBuf, m_FindInfo.m_nFlag, 0); | |
if(NULL == m_pSCHHandle) break; | |
bResult = FPDFText_FindNext(m_pSCHHandle); | |
if(!bResult && m_nPageIndex == m_FindInfo.m_nStartPageIndex) break; | |
} | |
else | |
{ | |
m_nPageIndex --; | |
if (m_nPageIndex < 0) {m_nPageIndex = m_nTotalPage - 1;} | |
if(!LoadPDFPage(m_pDoc, m_nPageIndex)) return; | |
if (NULL == m_pTextPage) return; | |
if (NULL != m_pSCHHandle) | |
{ | |
FPDFText_FindClose(m_pSCHHandle); | |
m_pSCHHandle = NULL; | |
} | |
m_pSCHHandle = FPDFText_FindStart(m_pTextPage, (FPDF_WIDESTRING)m_FindInfo.m_pCurFindBuf, m_FindInfo.m_nFlag, 0); | |
if(NULL == m_pSCHHandle) break; | |
bResult = FPDFText_FindPrev(m_pSCHHandle); | |
if(!bResult && m_nPageIndex == m_FindInfo.m_nStartPageIndex) break; | |
} | |
}//end while | |
if(!bResult)//find over | |
{ | |
FPDFText_FindClose(m_pSCHHandle); | |
m_pSCHHandle = NULL; | |
if (m_rtFind != NULL) | |
{ | |
delete [] m_rtFind; | |
m_rtFind = NULL; | |
} | |
m_FindInfo.m_bFirst = TRUE; | |
m_FindInfo.m_nDirection = -1; | |
m_FindInfo.m_nFlag = -1; | |
m_FindInfo.m_nStartCharIndex = -1; | |
m_FindInfo.m_nStartPageIndex = -1; | |
m_FindInfo.m_pCurFindBuf = NULL; | |
m_FindInfo.m_strFind = _T(""); | |
MessageBox("Find complete!", "Find Infomation", MB_OK | MB_ICONINFORMATION); | |
return; | |
} | |
int index = FPDFText_GetSchResultIndex(m_pSCHHandle); | |
if (m_nPageIndex == m_FindInfo.m_nStartPageIndex && index == m_FindInfo.m_nStartCharIndex && !m_FindInfo.m_bFirst ) | |
{ | |
if (NULL != m_pSCHHandle) | |
{ | |
FPDFText_FindClose(m_pSCHHandle); | |
m_pSCHHandle = NULL; | |
} | |
MessageBox("Find complete!", "Find Infomation", MB_OK | MB_ICONINFORMATION); | |
return; | |
}else{ | |
CDC *pDC = GetDC(); | |
DrawAllRect(pDC);//update | |
int nCount = FPDFText_GetSchCount(m_pSCHHandle); | |
int nRects = FPDFText_CountRects(m_pTextPage, index, nCount); | |
if (m_rtFind != NULL) | |
{ | |
delete [] m_rtFind; | |
m_rtFind = NULL; | |
} | |
m_rtFind = new PDFRect[nRects]; | |
m_nRectNum = nRects; | |
for (int i=0; i<nRects; i++) | |
{ | |
double left, top, right, bottom; | |
FPDFText_GetRect(m_pTextPage, i, &left, &top, &right, &bottom); | |
m_rtFind[i].m_dbLeft = left; | |
m_rtFind[i].m_dbTop = top; | |
m_rtFind[i].m_dbRight = right; | |
m_rtFind[i].m_dbBottom = bottom; | |
} | |
DrawAllRect(pDC);//draw new rect | |
ReleaseDC(pDC); | |
} | |
if (m_FindInfo.m_bFirst) | |
{//find first string, store info; | |
m_FindInfo.m_bFirst = FALSE; | |
m_FindInfo.m_nStartCharIndex = index; | |
m_FindInfo.m_nStartPageIndex = m_nPageIndex; | |
} | |
} | |
void CReaderVCView::DrawReverse(CDC *pDC, CRect rect) | |
{ | |
CRect rt = rect; | |
rect.left = __min(rt.left, rt.right); | |
rect.right = __max(rt.left, rt.right); | |
rect.top = __min(rt.top, rt.bottom); | |
rect.bottom = __max(rt.top, rt.bottom); | |
ASSERT(pDC); | |
int bmp_width=abs(rect.Width()); | |
int bmp_height=abs(rect.Height()); | |
HBITMAP hbmp = CreateCompatibleBitmap(pDC->m_hDC, bmp_width, bmp_height); | |
CDC MemDC; | |
MemDC.CreateCompatibleDC(pDC); | |
HBITMAP holdbmp = (HBITMAP)MemDC.SelectObject(hbmp); | |
// copy screen DC to memory DC | |
BitBlt(MemDC, 0, 0, bmp_width, bmp_height, pDC->m_hDC, rect.left,rect.top, SRCCOPY); | |
MemDC.SelectObject(holdbmp); | |
BITMAPINFO bmi; | |
memset(&bmi, 0, sizeof bmi); | |
bmi.bmiHeader.biSize = sizeof bmi.bmiHeader; | |
bmi.bmiHeader.biBitCount = 24; | |
bmi.bmiHeader.biClrImportant = 0; | |
bmi.bmiHeader.biClrUsed = 0; | |
bmi.bmiHeader.biCompression = BI_RGB; | |
bmi.bmiHeader.biHeight = bmp_height; | |
bmi.bmiHeader.biPlanes = 1; | |
bmi.bmiHeader.biSizeImage = 0; | |
bmi.bmiHeader.biWidth = bmp_width; | |
bmi.bmiHeader.biXPelsPerMeter = 0; | |
bmi.bmiHeader.biYPelsPerMeter = 0; | |
// get bitmap stream | |
int ret = GetDIBits(MemDC, hbmp, 0,bmp_height, NULL, &bmi, DIB_RGB_COLORS); | |
int size = bmi.bmiHeader.biSizeImage; | |
BYTE* pBits = new BYTE[size]; | |
memset(pBits, 0, size); | |
ret = GetDIBits(MemDC, hbmp, 0,bmp_height, pBits, &bmi, DIB_RGB_COLORS); | |
ret = GetLastError(); | |
DeleteObject(hbmp); | |
MemDC.DeleteDC(); | |
for (int row = 0; row < bmp_height; row ++) { | |
int pitch = (bmp_width * 3 + 3) / 4 * 4; | |
int rowpos = row * pitch; | |
for(int col = 0; col < bmp_width; col ++){ | |
int i = rowpos + col * 3; | |
pBits[i] = 255-pBits[i] ; | |
pBits[i + 1] = 255-pBits[i + 1]; | |
pBits[i + 2] = 255-pBits[i + 2]; | |
} | |
} | |
ret = SetDIBitsToDevice(pDC->m_hDC,rect.left,rect.top,bmp_width, bmp_height,0, 0, 0, bmp_height, pBits, &bmi, DIB_RGB_COLORS); | |
delete []pBits; | |
} | |
void CReaderVCView::DrawAllRect(CDC *pDC) | |
{ | |
int i; | |
int left, top, right, bottom; | |
int nSizeX = 0; | |
int nSizeY = 0; | |
// int temp = 0; | |
if (1 == m_nRotateFlag || 3 == m_nRotateFlag) | |
{ | |
nSizeX = m_nActualSizeY; | |
nSizeY = m_nActualSizeX; | |
} | |
else | |
{ | |
nSizeX = m_nActualSizeX; | |
nSizeY = m_nActualSizeY; | |
} | |
ASSERT(pDC); | |
if (m_rtFind != NULL) | |
{ | |
for (i=0; i<m_nRectNum; i++) | |
{ | |
PDFRect rect = m_rtFind[i]; | |
FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, (int)(nSizeX * m_dbScaleFactor), | |
(int)(nSizeY * m_dbScaleFactor), m_nRotateFlag, rect.m_dbLeft, rect.m_dbTop, &left, &top); | |
FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, (int)(nSizeX * m_dbScaleFactor), | |
(int)(nSizeY * m_dbScaleFactor), m_nRotateFlag, rect.m_dbRight, rect.m_dbBottom, &right, &bottom); | |
CRect rt(left, top, right, bottom); | |
DrawReverse(pDC, rt); | |
} | |
} | |
if (m_rtArray.GetSize() != 0) | |
{ | |
for (i=0; i<m_rtArray.GetSize(); i++) | |
{ | |
PDFRect rect = m_rtArray.GetAt(i); | |
FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, (int)(nSizeX * m_dbScaleFactor), | |
(int)(nSizeY * m_dbScaleFactor), m_nRotateFlag, rect.m_dbLeft, rect.m_dbTop, &left, &top); | |
FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, (int)(nSizeX * m_dbScaleFactor), | |
(int)(nSizeY * m_dbScaleFactor), m_nRotateFlag, rect.m_dbRight, rect.m_dbBottom, &right, &bottom); | |
CRect rt(left, top, right, bottom); | |
DrawReverse(pDC, rt); | |
} | |
} | |
} | |
void CReaderVCView::DeleteAllRect() | |
{ | |
CDC *pDC = GetDC(); | |
DrawAllRect(pDC); | |
ReleaseDC(pDC); | |
if (m_rtFind != NULL) | |
{ | |
delete []m_rtFind; | |
m_rtFind = NULL; | |
} | |
if (m_rtArray.GetSize() != 0) | |
{ | |
m_rtArray.RemoveAll(); | |
} | |
} | |
void CReaderVCView::OnFilePrint() | |
{ | |
CString strDoc = GetDocument()->GetTitle(); | |
CPrintDialog dlg(FALSE, PD_PAGENUMS | PD_USEDEVMODECOPIES); | |
dlg.m_pd.nMinPage = dlg.m_pd.nFromPage =1; | |
dlg.m_pd.nMaxPage = dlg.m_pd.nToPage = m_nTotalPage; | |
if (dlg.DoModal() == IDOK) | |
{ | |
int from_page, to_page; | |
if (dlg.PrintAll()) | |
{ | |
from_page = dlg.m_pd.nMinPage; | |
to_page = dlg.m_pd.nMaxPage; | |
} | |
else if (dlg.PrintRange()) | |
{ | |
from_page = dlg.GetFromPage(); | |
to_page = dlg.GetToPage(); | |
} | |
else if (dlg.PrintSelection()) | |
{ | |
from_page = to_page = m_nPageIndex + 1; | |
} | |
HDC printDC; | |
DOCINFO docInfo; | |
printDC = dlg.CreatePrinterDC(); | |
if(NULL == printDC) return; | |
docInfo.cbSize = sizeof(DOCINFO); | |
docInfo.fwType = 0; | |
docInfo.lpszDatatype = NULL; | |
docInfo.lpszOutput = NULL; | |
docInfo.lpszDocName = strDoc; | |
if(StartDoc(printDC, &docInfo) <= 0) return; | |
//FPDF_DOCUMENT pDoc = NULL; | |
FPDF_PAGE pPage = NULL; | |
CString str; | |
for (int i=from_page-1; i<to_page; i++) | |
{ | |
if(pPage != NULL) | |
{ | |
FPDF_ClosePage(pPage); | |
pPage = NULL; | |
} | |
pPage = FPDF_LoadPage(m_pDoc, i); | |
double npagewidth = FPDF_GetPageWidth(m_pPage); | |
double npageheight = FPDF_GetPageHeight(m_pPage); | |
int logpixelsx,logpixelsy; | |
//calculate the page size | |
logpixelsx = GetDeviceCaps(printDC,LOGPIXELSX); | |
logpixelsy = GetDeviceCaps(printDC,LOGPIXELSY); | |
int nsizeX = (int)(npagewidth / 72 *logpixelsx + 0.5f); | |
int nsizeY = (int)(npageheight / 72 *logpixelsy + 0.5f); | |
if(StartPage(printDC) <= 0) | |
{ | |
str.Format("one error occured when start the page %d", i); | |
MessageBox(str); | |
return; | |
} | |
//render to print device | |
FPDF_RenderPage(printDC, pPage, m_nStartX, m_nStartY, nsizeX, nsizeY, m_nRotateFlag, 0); | |
if(EndPage(printDC) <= 0) | |
{ | |
str.Format("one error occured when close the page %d", i); | |
MessageBox(str); | |
return; | |
} | |
}//end for | |
EndDoc(printDC); | |
if(!DeleteDC(printDC))// delete printDC | |
MessageBox("can not delete the printer"); | |
} | |
} | |
void CReaderVCView::OnLButtonDown(UINT nFlags, CPoint point) | |
{ | |
// TODO: Add your message handler code here and/or call default | |
double page_x = 0; | |
double page_y = 0; | |
DeviceToPage(point, page_x, page_y); | |
if(m_pApp) | |
{ | |
FPDF_BOOL b= FORM_OnLButtonDown(m_pApp, m_pPage,ComposeFlag(),page_x, page_y); | |
if(b) | |
return; | |
} | |
DeleteAllRect(); | |
LoadMyCursor(1); | |
m_ptLBDown = point; | |
if (m_bSelect) | |
{ | |
m_bHasChar = GetCharIndexByPoint(point, m_nStartIndex); | |
CreateCaret(point); | |
} | |
if (m_bHand) | |
{ | |
m_nPosH = GetScrollPos(SB_HORZ);//SetScrollPos(SB_VERT, point.y, TRUE); | |
m_nPosV = GetScrollPos(SB_VERT); | |
} | |
CView::OnLButtonDown(nFlags, point); | |
} | |
void CReaderVCView::OnLButtonUp(UINT nFlags, CPoint point) | |
{ | |
// TODO: Add your message handler code here and/or call default | |
double page_x = 0; | |
double page_y = 0; | |
DeviceToPage(point, page_x, page_y); | |
if(m_pApp) | |
{ | |
if(FORM_OnLButtonUp(m_pApp, m_pPage,ComposeFlag(), page_x, page_y)) | |
return; | |
} | |
LoadMyCursor(); | |
m_ptLBUp = point; | |
if (m_bSelect || m_bSnap) | |
{ | |
CDC *pDC = GetDC(); | |
CPen *pOldPen; | |
CPen pen; | |
CBrush *pOldBr; | |
CRect rect; | |
pen.CreatePen(PS_DASH, 2, RGB(255,0,0)); | |
pOldPen = pDC->SelectObject(&pen); | |
pOldBr = (CBrush*) (pDC->SelectStockObject(NULL_BRUSH)); | |
int nOldRop = pDC->SetROP2(R2_XORPEN); | |
pDC->Rectangle(m_rtOld); | |
pDC->SetROP2(nOldRop); | |
m_rtOld.left = m_rtOld.top = m_rtOld.right = m_rtOld.bottom = 0; | |
ReleaseDC(pDC); | |
} | |
if (m_bSnap) | |
{ | |
BOOL open = OpenClipboard(); | |
if (open) | |
{ | |
::EmptyClipboard(); | |
int bmpWidth = abs(point.x - m_ptLBDown.x); | |
int bmpHeight = abs(point.y - m_ptLBDown.y); | |
if (bmpHeight == 0 || bmpWidth == 0)return; | |
CRect bmpRect(m_ptLBDown, point); | |
CClientDC dc(this); | |
CBitmap *pBitmap = new CBitmap(); | |
pBitmap->CreateCompatibleBitmap(&dc,bmpWidth,bmpHeight); | |
CDC memDC; | |
memDC.CreateCompatibleDC(&dc); | |
memDC.SelectObject(pBitmap); | |
CBrush whiteBrush(RGB(255,255,255)); | |
//memDC.FillRect(bmpRect,&whiteBrush); | |
memDC.BitBlt(0, 0, bmpRect.Width(), bmpRect.Height(),&dc, bmpRect.left, bmpRect.top,SRCCOPY); | |
HBITMAP hBitmap = (HBITMAP) *pBitmap; | |
:: SetClipboardData(CF_BITMAP, hBitmap); | |
::CloseClipboard(); | |
MessageBox("The selected area has been copied to clipboard!"); | |
delete pBitmap; | |
} | |
} | |
FPDF_LINK hlink=NULL; | |
double pdfx,pdfy; | |
int nActualRangeX = 0; | |
int nActualRangeY = 0; | |
if ( m_nRotateFlag % 2 == 0 ) | |
{ | |
nActualRangeX = m_nActualSizeX; | |
nActualRangeY = m_nActualSizeY; | |
}else{ | |
nActualRangeX = m_nActualSizeY; | |
nActualRangeY = m_nActualSizeX; | |
} | |
FPDF_DeviceToPage(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
(int)(nActualRangeY * m_dbScaleFactor),m_nRotateFlag,point.x,point.y,&pdfx,&pdfy); | |
hlink=FPDFLink_GetLinkAtPoint(m_pPage,pdfx,pdfy); | |
if (hlink) | |
{ | |
FPDF_ACTION haction=NULL; | |
FPDF_DEST hLinkDest=NULL; | |
haction=FPDFLink_GetAction(hlink); | |
hLinkDest=FPDFLink_GetDest(m_pDoc,hlink); | |
if (haction) | |
{ | |
int nActionType=FPDFAction_GetType(haction); | |
switch(nActionType) | |
{ | |
case PDFACTION_UNSUPPORTED: // Unsupported action type | |
break; | |
case PDFACTION_GOTO: // Go to a destination within current document | |
{ | |
FPDF_LINK hActLinkDest = FPDFAction_GetDest(m_pDoc,haction); | |
if (hActLinkDest) | |
{ | |
int nPageIndex=FPDFDest_GetPageIndex(m_pDoc,hActLinkDest); | |
GotoPage(nPageIndex); | |
} | |
} | |
break; | |
case PDFACTION_REMOTEGOTO: // Go to a destination within another document | |
// FPDFAction_GetFilePath(...); | |
// ..... | |
break; | |
case PDFACTION_URI: // Universal Resource Identifier, including web pages and | |
// other Internet based resources | |
// int nsize= FPDFAction_GetURIPath(m_pDoc,haction); | |
// ... | |
break; | |
case PDFACTION_LAUNCH: // Launch an application or open a file | |
// FPDFAction_GetFilePath(...) | |
break; | |
default : | |
break; | |
} | |
} | |
else if (hLinkDest) | |
{ | |
int nPageIndex=FPDFDest_GetPageIndex(m_pDoc,hLinkDest); | |
GotoPage(nPageIndex); | |
} | |
} | |
CView::OnLButtonUp(nFlags, point); | |
} | |
void CReaderVCView::OnMouseMove(UINT nFlags, CPoint point) | |
{ | |
// TODO: Add your message handler code here and/or call default | |
double page_x = 0; | |
double page_y = 0; | |
DeviceToPage(point, page_x, page_y); | |
if(m_pApp) | |
{ | |
if(FORM_OnMouseMove(m_pApp, m_pPage,ComposeFlag(), page_x, page_y)) | |
return; | |
} | |
if (nFlags == MK_LBUTTON) | |
{ | |
LoadMyCursor(1); | |
}else{LoadMyCursor();} | |
CDC *pDC = GetDC(); | |
if (m_bSelect && nFlags == MK_LBUTTON) | |
{ | |
if (m_bHasChar) | |
{ | |
if (m_ptOld.x == 0 && m_ptOld.y == 0){m_ptOld = m_ptLBDown;} | |
int nIndex = 0; | |
if (!GetCharIndexByPoint(point, nIndex)) return; | |
if(nIndex == m_nEndIndex) return; | |
DrawAllRect(pDC);//update all rect | |
m_nEndIndex = nIndex; | |
GetRects(m_nStartIndex, m_nEndIndex); //get the rect and store into m_rtArray | |
DrawAllRect(pDC);//draw new rect | |
} | |
else | |
{ | |
CPen *pOldPen; | |
CPen pen; | |
CBrush *pOldBr; | |
CRect rect; | |
pen.CreatePen(PS_DASH, 2, RGB(255,0,0)); | |
pOldPen = pDC->SelectObject(&pen); | |
pOldBr = (CBrush*) (pDC->SelectStockObject(NULL_BRUSH)); | |
int nOldRop = pDC->SetROP2(R2_XORPEN); | |
int nModle = pDC->Rectangle(m_rtOld); | |
DrawAllRect(pDC);//update all rect | |
rect = SelectSegment(m_ptLBDown, point); | |
DrawAllRect(pDC); | |
pDC->Rectangle(rect); | |
pDC->SelectObject(pOldBr); | |
pDC->SelectObject(pOldPen); | |
pDC->SetROP2(nModle); | |
m_rtOld = rect; | |
} | |
} | |
if (m_bHand && nFlags == MK_LBUTTON) | |
{ | |
int curPos, prevPos; | |
//CChildFrame *pFrame = (CChildFrame *) GetParentFrame(); | |
int dy = m_ptLBDown.y - point.y; | |
prevPos = m_nPosV; | |
curPos = prevPos + dy; | |
prevPos = SetScrollPos(SB_VERT, curPos, TRUE); | |
curPos = GetScrollPos(SB_VERT); | |
int distance; | |
distance = prevPos - curPos; | |
m_nStartY += distance; | |
ScrollWindow(0, distance); | |
dy = m_ptLBDown.x - point.x; | |
prevPos = m_nPosH; | |
curPos = prevPos + dy; | |
prevPos = SetScrollPos(SB_HORZ, curPos, TRUE); | |
curPos = GetScrollPos(SB_HORZ); | |
distance = prevPos - curPos; | |
m_nStartX += distance; | |
ScrollWindow(distance, 0); | |
} | |
if (m_bSnap && nFlags == MK_LBUTTON) | |
{ | |
CPen *pOldPen; | |
CPen pen; | |
CBrush *pOldBr; | |
CRect rect(m_ptLBDown, point); | |
pen.CreatePen(PS_DASH, 2, RGB(255,0,0)); | |
pOldPen = pDC->SelectObject(&pen); | |
pOldBr = (CBrush*) (pDC->SelectStockObject(NULL_BRUSH)); | |
int nOldRop = pDC->SetROP2(R2_XORPEN); | |
int nModle = pDC->Rectangle(m_rtOld); | |
pDC->Rectangle(rect); | |
pDC->SelectObject(pOldBr); | |
pDC->SelectObject(pOldPen); | |
pDC->SetROP2(nModle); | |
m_rtOld = rect; | |
} | |
FPDF_LINK hlink=NULL; | |
double pdfx,pdfy; | |
int nActualRangeX = 0; | |
int nActualRangeY = 0; | |
if ( m_nRotateFlag % 2 == 0 ) | |
{ | |
nActualRangeX = m_nActualSizeX; | |
nActualRangeY = m_nActualSizeY; | |
}else{ | |
nActualRangeX = m_nActualSizeY; | |
nActualRangeY = m_nActualSizeX; | |
} | |
FPDF_DeviceToPage(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
(int)(nActualRangeY * m_dbScaleFactor),m_nRotateFlag,point.x,point.y,&pdfx,&pdfy); | |
hlink=FPDFLink_GetLinkAtPoint(m_pPage,pdfx,pdfy); | |
if (hlink) | |
{ | |
HCURSOR hCur = AfxGetApp()->LoadCursor(IDC_CURSOR4); | |
::SetCursor(hCur); | |
} | |
ReleaseDC(pDC); | |
// | |
CView::OnMouseMove(nFlags, point); | |
} | |
void CReaderVCView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) | |
{ | |
// TODO: Add your message handler code here and/or call default | |
// double page_x = 0; | |
// double page_y = 0; | |
// DeviceToPage(point, page_x, page_y); | |
if(m_pApp) | |
{ | |
if(FORM_OnKeyDown(m_pApp, m_pPage, nChar, ComposeFlag())) | |
return; | |
} | |
switch(nChar) | |
{ | |
case 35: | |
OnDocLastpage(); | |
break; | |
case 36: | |
OnDocFirstpage(); | |
break; | |
case 37: | |
this->OnDocPrepage(); | |
break; | |
case 39: | |
this->OnDocNextpage(); | |
break; | |
case 38: | |
break; | |
case 40: | |
break; | |
default: | |
break; | |
} | |
CView::OnKeyDown(nChar, nRepCnt, nFlags); | |
} | |
void CReaderVCView::OnToolSnapshot() | |
{ | |
m_bSnap = TRUE; | |
m_bHand = FALSE; | |
m_bSelect = FALSE; | |
this->HideCaret(); | |
} | |
void CReaderVCView::OnToolSelect() | |
{ | |
if(m_pTextPage == NULL) | |
{ | |
AfxMessageBox("Sorry, the fpdftext.dll may has expired. For keeping on using the dll, please contact sales@foxitsoftware.com."); | |
return; | |
} | |
m_bSnap = FALSE; | |
m_bHand = FALSE; | |
m_bSelect = TRUE; | |
} | |
void CReaderVCView::OnToolHand() | |
{ | |
m_bSnap = FALSE; | |
m_bHand = TRUE; | |
m_bSelect = FALSE; | |
this->HideCaret(); | |
} | |
void CReaderVCView::LoadMyCursor(int nflag) | |
{ | |
HCURSOR hCur; | |
if (nflag == 1) | |
{ | |
if (m_bSelect) | |
{ | |
hCur = AfxGetApp()->LoadCursor(IDC_CURSOR3); | |
} | |
else if (m_bSnap) | |
{ | |
hCur = AfxGetApp()->LoadStandardCursor(IDC_CROSS); | |
} | |
else | |
{ | |
hCur = AfxGetApp()->LoadCursor(IDC_CURSOR1); | |
} | |
} | |
else if (m_bHand) | |
{ | |
hCur = AfxGetApp()->LoadCursor(IDC_CURSOR2); | |
} | |
else if (m_bSelect) | |
{ | |
hCur = AfxGetApp()->LoadCursor(IDC_CURSOR3); | |
} | |
else if (m_bSnap) | |
{ | |
hCur = AfxGetApp()->LoadStandardCursor(IDC_CROSS); | |
}else | |
{ | |
hCur = AfxGetApp()->LoadStandardCursor(IDC_ARROW); | |
} | |
::SetCursor(hCur); | |
} | |
BOOL CReaderVCView::DeviceToPage(CPoint pt, double& page_x, double& page_y) | |
{ | |
// if(NULL == m_pTextPage) return FALSE; | |
int nActualRangeX = 0; | |
int nActualRangeY = 0; | |
if ( m_nRotateFlag % 2 == 0 ) | |
{ | |
nActualRangeX = m_nActualSizeX; | |
nActualRangeY = m_nActualSizeY; | |
}else{ | |
nActualRangeX = m_nActualSizeY; | |
nActualRangeY = m_nActualSizeX; | |
} | |
// switch ( m_nRotateFlag % 4 ) | |
// { | |
// case 0: | |
// case 2: | |
// { | |
// FPDF_DeviceToPage(m_pPage, m_nStartX, m_nStartY, m_nActualSizeX * m_dbScaleFactor, | |
// m_nActualSizeY * m_dbScaleFactor, m_nRotateFlag, pt.x, pt.y, &page_x, &page_y); | |
// break; | |
// } | |
// case 1: | |
// case 3: | |
// { | |
// FPDF_DeviceToPage(m_pPage, m_nStartX, m_nStartY, m_nActualSizeY * m_dbScaleFactor, | |
// m_nActualSizeX * m_dbScaleFactor, m_nRotateFlag, pt.x, pt.y, &page_x, &page_y); | |
// break; | |
// } | |
// } | |
FPDF_DeviceToPage(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
(int)(nActualRangeY * m_dbScaleFactor), m_nRotateFlag, pt.x, pt.y, &page_x, &page_y); | |
return TRUE; | |
} | |
BOOL CReaderVCView::PageToDevice(double page_x, double page_y, CPoint& pt) | |
{ | |
int nActualRangeX = 0; | |
int nActualRangeY = 0; | |
if ( m_nRotateFlag % 2 == 0 ) | |
{ | |
nActualRangeX = m_nActualSizeX; | |
nActualRangeY = m_nActualSizeY; | |
}else{ | |
nActualRangeX = m_nActualSizeY; | |
nActualRangeY = m_nActualSizeX; | |
} | |
FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
(int)(nActualRangeY * m_dbScaleFactor), m_nRotateFlag, page_x, page_y, (int*)&pt.x, (int*)&pt.y); | |
return TRUE; | |
} | |
BOOL CReaderVCView::GetCharIndexByPoint(CPoint pt, int &nIndex) | |
{ | |
double page_x = 0.0f; | |
double page_y = 0.0f; | |
if(NULL == m_pTextPage) return FALSE; | |
int nActualRangeX = 0; | |
int nActualRangeY = 0; | |
if ( m_nRotateFlag % 2 == 0 ) | |
{ | |
nActualRangeX = m_nActualSizeX; | |
nActualRangeY = m_nActualSizeY; | |
}else{ | |
nActualRangeX = m_nActualSizeY; | |
nActualRangeY = m_nActualSizeX; | |
} | |
FPDF_DeviceToPage(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
(int)(nActualRangeY * m_dbScaleFactor), m_nRotateFlag, pt.x, pt.y, &page_x, &page_y); | |
// FPDF_DeviceToPage(m_pPage, m_nStartX, m_nStartY, m_nActualSizeX * m_dbScaleFactor, | |
// m_nActualSizeY * m_dbScaleFactor, m_nRotateFlag, pt.x, pt.y, &page_x, &page_y); | |
nIndex = FPDFText_GetCharIndexAtPos(m_pTextPage, page_x, page_y, 10, 10); | |
if (-3 == nIndex || -1 == nIndex) return FALSE; | |
return TRUE; | |
} | |
void CReaderVCView::CreateCaret(CPoint pt) | |
{ | |
double a, b, c, d; | |
int nIndex = 0; | |
int nAcent = 0, nDecent = 0; | |
double orgx = 0.0f, orgy = 0.0f; | |
double fontsize = 0.0f; | |
int left = 0, right = 0; | |
int top = 0, bottom = 0; | |
//double left_char, right_char, top_char, bottom_char;//char bounding box | |
FPDF_FONT pfont = NULL; | |
if(!GetCharIndexByPoint(pt, nIndex)) return; | |
fontsize = FPDFText_GetFontSize(m_pTextPage, nIndex); | |
// FPDFText_GetOrigin(m_pTextPage, nIndex, &orgx, &orgy); | |
// pfont = FPDFText_GetFont(m_pTextPage, nIndex); | |
// if(NULL == pfont) return; | |
// nAcent = FPDFFont_GetAscent(pfont); | |
// nDecent = FPDFFont_GetDescent(pfont); | |
// FPDFText_GetMatrix(m_pTextPage, nIndex, &a, &b, &c, &d); | |
// nAcent =(int)((nAcent * fontsize / 1000.0f) * d + orgy + 0.5f); | |
// nDecent = (int)((nDecent * fontsize / 1000.0f) * d + orgy + 0.5f); | |
// | |
// int nActualRangeX = 0; | |
// int nActualRangeY = 0; | |
// if ( m_nRotateFlag % 2 == 0 ) | |
// { | |
// nActualRangeX = m_nActualSizeX; | |
// nActualRangeY = m_nActualSizeY; | |
// }else{ | |
// nActualRangeX = m_nActualSizeY; | |
// nActualRangeY = m_nActualSizeX; | |
// } | |
// FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
// (int)(nActualRangeY * m_dbScaleFactor), m_nRotateFlag, orgx, nAcent, &left, &top); | |
// | |
// FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
// (int)(nActualRangeY * m_dbScaleFactor), m_nRotateFlag, orgx, nDecent, &right, &bottom); | |
// | |
// // FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, m_nActualSizeX * m_dbScaleFactor, | |
// // m_nActualSizeY * m_dbScaleFactor, m_nRotateFlag, orgx, nAcent, &left, &top); | |
// // | |
// // FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, m_nActualSizeX * m_dbScaleFactor, | |
// // m_nActualSizeY * m_dbScaleFactor, m_nRotateFlag, orgx, nDecent, &right, &bottom); | |
// | |
// this->CreateSolidCaret(2, abs(top - bottom)); | |
// | |
// /* FPDFText_GetCharBox(m_pTextPage, nIndex, &left_char, &right_char, &bottom_char, &top_char); | |
// | |
// FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, m_nActualSizeX * m_dbScaleFactor, | |
// m_nActualSizeY * m_dbScaleFactor, m_nRotateFlag, left_char, top_char, &left, &top); | |
// FPDF_PageToDevice(m_pPage, m_nStartX, m_nStartY, m_nActualSizeX * m_dbScaleFactor, | |
// m_nActualSizeY * m_dbScaleFactor, m_nRotateFlag, right_char, bottom_char, &right, &bottom);*/ | |
// this->SetCaretPos(CPoint(left, top-2)); | |
// this->ShowCaret(); | |
} | |
void CReaderVCView::GetRects(int nStart, int nEnd) | |
{ | |
int temp, nCount; | |
nCount = nEnd - nStart; | |
if (nCount < 0) | |
{ | |
temp = nEnd; | |
nEnd = nStart; | |
nStart = temp; | |
nCount = abs(nCount); | |
} | |
nCount ++; | |
int num = FPDFText_CountRects(m_pTextPage, nStart, nCount); | |
if(num == 0) return; | |
if (m_rtArray.GetSize() > 0) | |
{ | |
m_rtArray.RemoveAll(); | |
} | |
PDFRect rect; | |
for (int i=0; i<num; i++) | |
{ | |
FPDFText_GetRect(m_pTextPage, i, &rect.m_dbLeft, &rect.m_dbTop, &rect.m_dbRight, &rect.m_dbBottom); | |
m_rtArray.Add(rect); | |
} | |
return; | |
} | |
CRect CReaderVCView::SelectSegment(CPoint pt_lt, CPoint pt_rb) | |
{ | |
CRect rect(pt_lt, pt_rb); | |
// double left, top, right, bottom; | |
// int start_index = 0, nCount = 0; | |
// int nRect = 0; | |
// | |
// int nActualRangeX = 0; | |
// int nActualRangeY = 0; | |
// if ( m_nRotateFlag % 2 == 0 ) | |
// { | |
// nActualRangeX = m_nActualSizeX; | |
// nActualRangeY = m_nActualSizeY; | |
// }else{ | |
// nActualRangeX = m_nActualSizeY; | |
// nActualRangeY = m_nActualSizeX; | |
// } | |
// FPDF_DeviceToPage(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
// (int)(nActualRangeY * m_dbScaleFactor), m_nRotateFlag, rect.left, rect.top, &left, &top); | |
// FPDF_DeviceToPage(m_pPage, m_nStartX, m_nStartY, (int)(nActualRangeX * m_dbScaleFactor), | |
// (int)(nActualRangeY * m_dbScaleFactor), m_nRotateFlag, rect.right, rect.bottom, &right, &bottom); | |
// | |
// // FPDF_DeviceToPage(m_pPage, m_nStartX, m_nStartY, m_nActualSizeX * m_dbScaleFactor, | |
// // m_nActualSizeY * m_dbScaleFactor, m_nRotateFlag, rect.left, rect.top, &left, &top); | |
// // FPDF_DeviceToPage(m_pPage, m_nStartX, m_nStartY, m_nActualSizeX * m_dbScaleFactor, | |
// // m_nActualSizeY * m_dbScaleFactor, m_nRotateFlag, rect.right, rect.bottom, &right, &bottom); | |
// | |
// int num = FPDFText_CountBoundedSegments(m_pTextPage, left, top, right, bottom); | |
// | |
// if (m_rtArray.GetSize() > 0) | |
// { | |
// m_rtArray.RemoveAll(); | |
// } | |
// | |
// CDC *pDC = GetDC(); | |
// for (int i=0; i<num; i++) | |
// { | |
// FPDFText_GetBoundedSegment(m_pTextPage, i, &start_index, &nCount); | |
// nRect = FPDFText_CountRects(m_pTextPage, start_index, nCount); | |
// | |
// PDFRect rect_select; | |
// for (int j=0; j<num; j++) | |
// { | |
// FPDFText_GetRect(m_pTextPage, j, &rect_select.m_dbLeft, &rect_select.m_dbTop, &rect_select.m_dbRight, &rect_select.m_dbBottom); | |
// m_rtArray.Add(rect_select); | |
// } | |
// } | |
// ReleaseDC(pDC); | |
return rect; | |
} | |
void CReaderVCView::OnToolPdf2txt() | |
{ | |
// TODO: Add your command handler code here | |
if(m_pTextPage == NULL) | |
{ | |
AfxMessageBox("Sorry, the fpdftext.dll may has expired. For keeping on using the dll, please contact sales@foxitsoftware.com."); | |
return; | |
} | |
CConvertDlg condlg; | |
if(condlg.DoModal() == IDOK) | |
{ | |
int nFlag=condlg.m_nFlag; | |
CReaderVCDoc *pDoc = this->GetDocument(); | |
CString pdfname=pDoc->m_strPDFName; | |
CString strname=pdfname,stem; | |
if (strname.Find(".pdf") != -1 || strname.Find(".PDF") != -1) | |
{ | |
int startatr=strname.ReverseFind('\\'); | |
stem=strname.Mid(startatr+1,strname.GetLength()-startatr-5); | |
} | |
CString defaultname=stem+".txt"; | |
char szFilter[] = "Text File(*.txt)|*.txt"; | |
CFileDialog dlg(FALSE, ".txt", defaultname, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, NULL); | |
if (dlg.DoModal() == IDOK) | |
{ | |
// CString txtname=dlg.GetPathName(); | |
// BOOL bFlag=FPDFText_PDFToText(pdfname,txtname,nFlag,NULL); | |
// if(! bFlag) | |
// MessageBox("Convert Failure!"); | |
} | |
} | |
} | |
void CReaderVCView::SyncScroll() | |
{ | |
CRect rect; | |
GetClientRect(rect); | |
int nSizeX = 0; | |
int nSizeY = 0; | |
//int temp = 0; | |
if (1 == m_nRotateFlag || 3 == m_nRotateFlag) | |
{ | |
nSizeX = m_nActualSizeY; | |
nSizeY = m_nActualSizeX; | |
} | |
else | |
{ | |
nSizeX = m_nActualSizeX; | |
nSizeY = m_nActualSizeY; | |
} | |
SCROLLINFO scrinfo; | |
scrinfo.cbSize = sizeof(SCROLLINFO); | |
GetScrollInfo(SB_HORZ, &scrinfo); | |
scrinfo.nMin =0; | |
scrinfo.nMax = (int)(nSizeX * m_dbScaleFactor); | |
scrinfo.nPage = (unsigned int)(__min(nSizeX * m_dbScaleFactor, rect.Width())); | |
if (nSizeX * m_dbScaleFactor < rect.Width()){scrinfo.fMask |= SIF_DISABLENOSCROLL;} | |
SetScrollInfo(SB_HORZ, &scrinfo); | |
SetScrollPos(SB_HORZ, 0); | |
//m_nPosH = nPosH; | |
GetScrollInfo(SB_VERT, &scrinfo); | |
scrinfo.nMin = 0; | |
scrinfo.nMax = (int)(nSizeY * m_dbScaleFactor); | |
scrinfo.nPage =(unsigned int)( __min(nSizeY * m_dbScaleFactor, rect.Height())); | |
if (nSizeY * m_dbScaleFactor < rect.Height()){scrinfo.fMask |= SIF_DISABLENOSCROLL;} | |
SetScrollInfo(SB_VERT, &scrinfo); | |
SetScrollPos(SB_VERT, 0); | |
} | |
void CReaderVCView::OnSize(UINT nType, int cx, int cy) | |
{ | |
CView::OnSize(nType, cx, cy); | |
SyncScroll(); | |
if(m_bmp) | |
{ | |
FPDFBitmap_Destroy(m_bmp); | |
m_bmp = NULL; | |
} | |
m_bmp = FPDFBitmap_Create(cx, cy, 0); | |
// TODO: Add your message handler code here | |
} | |
void CReaderVCView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) | |
{ | |
// TODO: Add your message handler code here and/or call default | |
int prevPos = GetScrollPos(SB_HORZ); | |
int curPos = prevPos; | |
int nMin, nMax, nPage; | |
GetScrollRange(SB_HORZ, &nMin, &nMax); | |
SCROLLINFO si; | |
GetScrollInfo(SB_HORZ, &si); | |
nPage = si.nPage; | |
switch(nSBCode) | |
{ | |
case SB_TOP: | |
curPos = nMin; | |
break; | |
case SB_BOTTOM: | |
curPos = nMax; | |
break; | |
case SB_LINEUP: | |
curPos --; | |
break; | |
case SB_LINEDOWN: | |
curPos ++; | |
break; | |
case SB_ENDSCROLL: | |
return; | |
case SB_PAGEDOWN: | |
curPos += nPage; | |
break; | |
case SB_PAGEUP: | |
curPos -= nPage; | |
break; | |
case SB_THUMBPOSITION: | |
curPos = si.nTrackPos; | |
break; | |
case SB_THUMBTRACK: | |
curPos = si.nTrackPos; | |
break; | |
} | |
if (curPos < nMin) { curPos = nMin;} | |
if(curPos > nMax){ curPos = nMax;} | |
SetScrollPos(SB_HORZ, curPos); | |
int distance; | |
distance = prevPos - curPos; | |
m_nStartX += distance; | |
ScrollWindow(distance, 0); | |
CRect rect; | |
GetClientRect(rect); | |
CRect rtnew(rect.left, rect.top, rect.left+distance, rect.bottom); | |
InvalidateRect(&rtnew); | |
CView::OnHScroll(nSBCode, nPos, pScrollBar); | |
} | |
void CReaderVCView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) | |
{ | |
// TODO: Add your message handler code here and/or call default | |
int prevPos = GetScrollPos(SB_VERT); | |
int curPos = prevPos; | |
int nMin, nMax, nPage; | |
GetScrollRange(SB_VERT, &nMin, &nMax); | |
SCROLLINFO si; | |
GetScrollInfo(SB_VERT, &si); | |
nPage = si.nPage; | |
switch(nSBCode) | |
{ | |
case SB_TOP: | |
curPos = nMin; | |
break; | |
case SB_BOTTOM: | |
curPos = nMax; | |
break; | |
case SB_LINEUP: | |
curPos --; | |
break; | |
case SB_LINEDOWN: | |
curPos ++; | |
break; | |
case SB_ENDSCROLL: | |
return; | |
case SB_PAGEDOWN: | |
curPos += nPage; | |
break; | |
case SB_PAGEUP: | |
curPos -= nPage; | |
break; | |
case SB_THUMBPOSITION: | |
curPos = si.nTrackPos; | |
break; | |
case SB_THUMBTRACK: | |
curPos = si.nTrackPos; | |
break; | |
} | |
if (curPos < nMin) { curPos = nMin;} | |
if(curPos > nMax){ curPos = nMax;} | |
SetScrollPos(SB_VERT, curPos); | |
int distance; | |
distance = prevPos - curPos; | |
m_nStartY += distance; | |
ScrollWindow(0, distance); | |
CRect rect; | |
GetClientRect(rect); | |
CRect rtnew(rect.left, rect.bottom + distance, rect.right, rect.bottom); | |
CRect rtnew2(rect.left, rect.top, rect.right, rect.top + distance); | |
InvalidateRect(&rtnew); | |
InvalidateRect(&rtnew2); | |
CView::OnVScroll(nSBCode, nPos, pScrollBar); | |
} | |
void CReaderVCView::OnToolExtractlinks() | |
{ | |
if(m_pTextPage == NULL) | |
{ | |
AfxMessageBox("Sorry, the fpdftext.dll may has expired. For keeping on using the dll, please contact sales@foxitsoftware.com."); | |
return; | |
} | |
CString strLink = _T(""); | |
wchar_t *pBuf = NULL; | |
if(m_pLink != NULL) | |
{ | |
FPDFLink_CloseWebLinks(m_pLink); | |
m_pLink = NULL; | |
} | |
m_pLink = FPDFLink_LoadWebLinks(m_pTextPage); | |
if(m_pLink == NULL) return; | |
int nCount = FPDFLink_CountWebLinks(m_pLink); | |
if (nCount == 0) return; | |
if (m_rtArray.GetSize()!=0) | |
{ | |
m_rtArray.RemoveAll(); | |
} | |
for (int i=0; i<nCount; i++) | |
{ | |
int nlen = FPDFLink_GetURL(m_pLink, i, NULL, 0)+1; | |
pBuf = new wchar_t[nlen]; | |
memset(pBuf, 0, nlen*sizeof(wchar_t)); | |
FPDFLink_GetURL(m_pLink, i, (unsigned short*)pBuf, nlen); | |
pBuf[nlen-1] = L'\0'; | |
int n = WideCharToMultiByte(CP_ACP, 0, pBuf, -1, NULL, NULL, NULL, NULL); | |
char *p = new char[n]; | |
memset(p, 0, n); | |
WideCharToMultiByte(CP_ACP, 0, pBuf, nlen, p, n, NULL, NULL); | |
p[n-1] = '\0'; | |
strLink += p; | |
strLink += "\r\n"; | |
delete []pBuf; | |
delete []p; | |
int nRects = FPDFLink_CountRects(m_pLink, i); | |
for (int j=0; j<nRects; j++) | |
{ | |
PDFRect rect; | |
FPDFLink_GetRect(m_pLink, i, j, | |
&rect.m_dbLeft, &rect.m_dbTop, &rect.m_dbRight, &rect.m_dbBottom); | |
m_rtArray.Add(rect); | |
} | |
} | |
CDC *pDC = GetDC(); | |
DrawAllRect(pDC); | |
ReleaseDC(pDC); | |
MessageBox(strLink, "Web Links in this page"); | |
} | |
void CReaderVCView::OnInitialUpdate() | |
{ | |
CView::OnInitialUpdate(); | |
// TODO: Add your specialized code here and/or call the base class | |
} | |
void CReaderVCView::OnDestroy() | |
{ | |
CView::OnDestroy(); | |
// TODO: Add your message handler code here | |
} | |
void CReaderVCView::OnUpdateDocFirstpage(CCmdUI* pCmdUI) | |
{ | |
if (0 == m_nPageIndex) | |
{ | |
pCmdUI->Enable(FALSE); | |
} | |
else | |
{ | |
pCmdUI->Enable(TRUE); | |
} | |
} | |
void CReaderVCView::OnUpdateDocLastpage(CCmdUI* pCmdUI) | |
{ | |
if (m_nPageIndex == m_nTotalPage - 1) | |
{ | |
pCmdUI->Enable(FALSE); | |
} | |
else | |
{ | |
pCmdUI->Enable(TRUE); | |
} | |
} | |
void CReaderVCView::OnUpdateDocNextpage(CCmdUI* pCmdUI) | |
{ | |
if (m_nPageIndex == m_nTotalPage - 1) | |
{ | |
pCmdUI->Enable(FALSE); | |
} | |
else | |
{ | |
pCmdUI->Enable(TRUE); | |
} | |
} | |
void CReaderVCView::OnUpdateDocPrepage(CCmdUI* pCmdUI) | |
{ | |
if (0 == m_nPageIndex) | |
{ | |
pCmdUI->Enable(FALSE); | |
} | |
else | |
{ | |
pCmdUI->Enable(TRUE); | |
} | |
} | |
void CReaderVCView::OnUpdateToolHand(CCmdUI* pCmdUI) | |
{ | |
// TODO: Add your command update UI handler code here | |
if (m_bHand) | |
{ | |
pCmdUI->SetCheck(1); | |
} | |
else | |
{ | |
pCmdUI->SetCheck(0); | |
} | |
} | |
void CReaderVCView::OnUpdateToolSnapshot(CCmdUI* pCmdUI) | |
{ | |
if (m_bSnap) | |
{ | |
pCmdUI->SetCheck(1); | |
} | |
else | |
{ | |
pCmdUI->SetCheck(0); | |
} | |
} | |
void CReaderVCView::OnUpdateToolSelect(CCmdUI* pCmdUI) | |
{ | |
if (m_bSelect) | |
{ | |
pCmdUI->SetCheck(1); | |
} | |
else | |
{ | |
pCmdUI->SetCheck(0); | |
} | |
} | |
void CReaderVCView::OnViewBookmark() | |
{ | |
// TODO: Add your command handler code here | |
CChildFrame* pParent = (CChildFrame*)GetParentFrame(); | |
if(pParent == NULL) return; | |
if (m_bBookmark) { | |
pParent->m_wndSplitter.ShowColumn(); | |
}else{ | |
pParent->m_wndSplitter.HideColumn(0); | |
} | |
m_bBookmark = !m_bBookmark; | |
} | |
BOOL CReaderVCView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) | |
{ | |
ScreenToClient(&pt); | |
// TODO: Add your message handler code here and/or call default | |
double page_x = 0; | |
double page_y = 0; | |
DeviceToPage(pt, page_x, page_y); | |
if(m_pApp) | |
{ | |
// FPDF_BOOL b= FORM_OnMouseWheel(m_pApp, m_pPage,ComposeFlag(),0,zDelta,page_x, page_y); | |
// if(b) | |
// return TRUE; | |
} | |
int curPosY = 0; | |
int prevPosY = 0; | |
int distanceY = 25; | |
if(zDelta > 0) | |
{ | |
curPosY = GetScrollPos(SB_VERT); | |
prevPosY = SetScrollPos(SB_VERT, curPosY - distanceY, TRUE); | |
curPosY = GetScrollPos(SB_VERT); | |
distanceY = prevPosY - curPosY; | |
m_nStartY = m_nStartY + distanceY; | |
ScrollWindow(0, distanceY); | |
} | |
else | |
{ | |
curPosY = GetScrollPos(SB_VERT); | |
prevPosY = SetScrollPos(SB_VERT, curPosY + distanceY, TRUE); | |
curPosY = GetScrollPos(SB_VERT); | |
distanceY = curPosY - prevPosY; | |
m_nStartY = m_nStartY - distanceY; | |
ScrollWindow(0, -distanceY); | |
} | |
return CView::OnMouseWheel(nFlags, zDelta, pt); | |
} | |
void CReaderVCView::OnContextMenu(CWnd* pWnd, CPoint point) | |
{ | |
} | |
void CReaderVCView::OnEditCopy() | |
{ | |
if(m_pTextPage == NULL) | |
{ | |
AfxMessageBox("Sorry, the fpdftext.dll may has expired. For keeping on using the dll, please contact sales@foxitsoftware.com."); | |
return; | |
} | |
long left = 0; | |
long top = 0; | |
long right = 0; | |
long bottom = 0; | |
LPWSTR pBuff = NULL; | |
int buflen = 0; | |
CString csCopyText; | |
if(m_rtArray.GetSize() != 0) | |
{ | |
for (int i=0; i<m_rtArray.GetSize(); i++) | |
{ | |
PDFRect rect = m_rtArray.GetAt(i); | |
buflen = FPDFText_GetBoundedText(m_pTextPage, rect.m_dbLeft, rect.m_dbTop, rect.m_dbRight, | |
rect.m_dbBottom, (unsigned short*)pBuff, 0) + 1; | |
if(buflen == 0) | |
return; | |
pBuff = new wchar_t[2*buflen]; | |
memset(pBuff, 0, 2*buflen); | |
FPDFText_GetBoundedText(m_pTextPage, rect.m_dbLeft, rect.m_dbTop, rect.m_dbRight, | |
rect.m_dbBottom, (unsigned short*)pBuff, buflen); | |
int n = WideCharToMultiByte(CP_ACP, 0, pBuff, -1, NULL, NULL, NULL, NULL); | |
char *p = new char[n]; | |
memset(p, 0, n); | |
WideCharToMultiByte(CP_ACP, 0, pBuff, buflen, p, n, NULL, NULL); | |
csCopyText = csCopyText + CString(p); | |
delete[] p; | |
} | |
::OpenClipboard(NULL); | |
::EmptyClipboard(); | |
HANDLE hClip=GlobalAlloc(GMEM_MOVEABLE,csCopyText.GetLength()+1); | |
char* pBuf=(char*)GlobalLock(hClip); | |
strcpy(pBuf,csCopyText); | |
GlobalUnlock(hClip); | |
HANDLE hSuccess = SetClipboardData(CF_TEXT, hClip); | |
if(NULL != hSuccess) | |
AfxMessageBox("copy success!"); | |
::CloseClipboard(); | |
} | |
} | |
void CReaderVCView::OnRenderbitmap() | |
{ | |
} | |
void CReaderVCView::OnExportPdfToBitmap() | |
{ | |
if (!m_pExportPageDlg) | |
{ | |
m_pExportPageDlg=new CExportPage; | |
m_pExportPageDlg->Create(IDD_EXPORT_PAGE,this); | |
m_pExportPageDlg->InitDialogInfo(this); | |
m_pExportPageDlg->ShowWindow(SW_SHOW); | |
} | |
else | |
m_pExportPageDlg->ShowWindow(SW_SHOW); | |
} | |
BOOL CReaderVCView::PreTranslateMessage(MSG* pMsg) | |
{ | |
// TODO: Add your specialized code here and/or call the base class | |
// PP_Event event; | |
// if(pMsg->message == WM_LBUTTONDOWN) | |
// { | |
// event.type = PP_Event_Type_MouseDown; | |
// | |
// int xPos = (int)(WORD)(pMsg->lParam); | |
// int yPos = (int)(WORD)((pMsg->lParam >> 16) & 0xFFFF); | |
// | |
// event.u.mouse.x = xPos; | |
// event.u.mouse.y = yPos; | |
// FPDF_FormFillEventMsg(m_pPage, event); | |
// } | |
// if(pMsg->message == WM_LBUTTONUP) | |
// { | |
// event.type = PP_Event_Type_MouseUp; | |
// | |
// int xPos = (int)(WORD)(pMsg->lParam); | |
// int yPos = (int)(WORD)((pMsg->lParam >> 16) & 0xFFFF); | |
// | |
// event.u.mouse.x = xPos; | |
// event.u.mouse.y = yPos; | |
// FPDF_FormFillEventMsg(m_pPage, event); | |
// } | |
return CView::PreTranslateMessage(pMsg); | |
} | |
void CReaderVCView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) | |
{ | |
// TODO: Add your message handler code here and/or call default | |
if(m_pApp) | |
{ | |
if(FORM_OnChar(m_pApp, m_pPage, nChar, ComposeFlag())) | |
return ; | |
} | |
CView::OnChar(nChar, nRepCnt, nFlags); | |
} | |
void CReaderVCView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) | |
{ | |
// TODO: Add your specialized code here and/or call the base class | |
((CReaderVCApp*)AfxGetApp())->m_pActiveView = (CReaderVCView*)pActivateView; | |
CView::OnActivateView(bActivate, pActivateView, pDeactiveView); | |
} | |
void CReaderVCView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) | |
{ | |
// TODO: Add your message handler code here and/or call default | |
if(m_pApp) | |
FORM_OnKeyUp(m_pApp, m_pPage, nChar, ComposeFlag()); | |
CView::OnKeyUp(nChar, nRepCnt, nFlags); | |
} | |
int G_WriteBlock( FPDF_FILEWRITE* pThis, const void* pData, unsigned long size); | |
class CSDK_FileWrite:public FPDF_FILEWRITE | |
{ | |
public: | |
CSDK_FileWrite() | |
{ | |
m_fp = NULL; | |
version = 0; | |
WriteBlock = G_WriteBlock; | |
} | |
public: | |
FILE* m_fp; | |
}; | |
int G_WriteBlock( FPDF_FILEWRITE* pThis, const void* pData, unsigned long size) | |
{ | |
CSDK_FileWrite* pFW = (CSDK_FileWrite*)pThis; | |
return fwrite(pData, sizeof(char), size, pFW->m_fp); | |
} | |
void CReaderVCView::OnFileSave() | |
{ | |
// TODO: Add your command handler code here | |
if(m_pDoc != NULL) | |
{ | |
CFileDialog dlg(FALSE,"",NULL,NULL,"PDF(*.PDF)|*.PDF||All Files(*.*)|*.*"); | |
if (dlg.DoModal() == IDOK) | |
{ | |
CString strPDFName = dlg.GetPathName(); | |
CSDK_FileWrite fw; | |
fw.m_fp = fopen(dlg.GetPathName(), "wb"); | |
FPDF_SaveAsCopy(m_pDoc, &fw, 0); | |
fclose(fw.m_fp); | |
// FPDF_SaveAsFile(m_pDoc, strPDFName.GetBuffer(strPDFName.GetLength()), 0, NULL, 0, NULL, 0); | |
} | |
} | |
} | |
void CReaderVCView::OnTestJS() | |
{ | |
// TODO: Add your command handler code here | |
//FPDF_WIDESTRING js = L"run=app.setInterval(\"app.alert(\\\"ok\\\")\");app.setTimeOut(\"app.clearInterval(run)\", 6000);"; | |
// FPDF_WIDESTRING js = L"app.alert(AFNumber_Keystroke(\'aaaaaaaaa\'))"; | |
// FPDF_WIDESTRING js = L"app.mailMsg(1)"; | |
//FPDF_WIDESTRING js = L"app.setTimeOut(\"app.clearInterval(1)\", 6000);"; | |
//FPDF_WIDESTRING js = L"t.1"; | |
// RunJS(m_pApp, js); | |
CTestJsDlg dlg; | |
dlg.init(m_pApp); | |
dlg.DoModal(); | |
} | |
//This function is to simulate the pp event. | |
#define PP_EVENT_MODIFIER_SHIFTKEY 1<<0 | |
#define PP_EVENT_MODIFIER_CONTROLKEY 1<<1 | |
#define PP_EVENT_MODIFIER_ALTKEY 1<<2 | |
unsigned int CReaderVCView::ComposeFlag() | |
{ | |
unsigned int nFlag = 0; | |
if(IsALTpressed()) | |
nFlag = nFlag|PP_EVENT_MODIFIER_ALTKEY; | |
if(IsCTRLpressed()) | |
nFlag = nFlag|PP_EVENT_MODIFIER_CONTROLKEY; | |
if(IsSHIFTpressed()) | |
nFlag = nFlag|PP_EVENT_MODIFIER_SHIFTKEY; | |
return nFlag; | |
} | |
void CReaderVCView::OnPrintMetalfile() | |
{ | |
FPDF_PAGE page = FPDF_LoadPage(m_pDoc, 0); | |
if (!page) { | |
return; | |
} | |
HDC printer_dc = CreateDC("WINSPOOL", "Microsoft XPS Document Writer", NULL, | |
NULL); | |
if (!printer_dc) { | |
printf("Could not create printer DC\n"); | |
return; | |
} | |
DOCINFO di = {0}; | |
di.cbSize = sizeof(DOCINFO); | |
di.lpszDocName = "Foxit print test"; | |
int job_id = StartDoc(printer_dc, &di); | |
StartPage(printer_dc); | |
SetGraphicsMode(printer_dc, GM_ADVANCED); | |
XFORM xform = {0, 0, 0, 0, 0, 0}; | |
xform.eM11 = xform.eM22 = 2; | |
ModifyWorldTransform(printer_dc, &xform, MWT_LEFTMULTIPLY); | |
int dc_width = GetDeviceCaps(printer_dc, PHYSICALWIDTH); | |
int dc_height = GetDeviceCaps(printer_dc, PHYSICALHEIGHT); | |
HDC metafile_dc = CreateEnhMetaFile(printer_dc, NULL, NULL, NULL); | |
XFORM xform1 = {0, 0, 0, 0, 0, 0}; | |
xform1.eM11 = xform1.eM22 = 0.5; | |
ModifyWorldTransform(metafile_dc, &xform1, MWT_LEFTMULTIPLY); | |
FPDF_RenderPage(metafile_dc, page, 0, 0, dc_width, dc_height, 0, 0); | |
HENHMETAFILE emf = CloseEnhMetaFile(metafile_dc); | |
ENHMETAHEADER header = {0}; | |
GetEnhMetaFileHeader(emf, sizeof(header), &header); | |
PlayEnhMetaFile(printer_dc, emf, (RECT *)&header.rclBounds); | |
EndPage(printer_dc); | |
EndDoc(printer_dc); | |
DeleteEnhMetaFile(emf); | |
DeleteDC(printer_dc); | |
} | |
void CReaderVCView::CreateLocalPath(CString &csPath) | |
{ | |
csPath = "c://test.pdf"; | |
} | |
BOOL CReaderVCView::HttpDataPost(CString csData, CString csAppName, CString csObject, CString csServer, CString csUserName, CString csPassword, INTERNET_PORT nPort , BOOL IsHTTPS, CString csContentType, CString csAddHeader, CString &csResponse) | |
{ | |
DWORD retCode = 0; | |
BOOL bRet = FALSE; | |
TRY | |
{ | |
CInternetSession sess(csAppName); | |
CHttpConnection* pConnect = sess.GetHttpConnection(csServer, nPort, csUserName, csPassword); | |
if (pConnect == NULL) | |
return FALSE; | |
DWORD dwRequestFlags = INTERNET_FLAG_EXISTING_CONNECT; | |
if ( IsHTTPS == TRUE) | |
dwRequestFlags |= INTERNET_FLAG_SECURE; | |
CHttpFile* pHttpFile = pConnect->OpenRequest(CHttpConnection::HTTP_VERB_POST, csObject, NULL, 1, NULL, NULL, dwRequestFlags); | |
if (pHttpFile != NULL) | |
{ | |
CString strData = csData; | |
DWORD dwLength = strData.GetLength(); | |
CString strHeaders; | |
strHeaders.Format("Content-Type: %s\r\nContent-Length: %d\r\n", csContentType, dwLength); | |
strHeaders += csAddHeader; | |
pHttpFile->AddRequestHeaders(strHeaders); | |
DWORD dwTotalLength = dwLength + strHeaders.GetLength(); | |
resend: | |
bRet = pHttpFile->SendRequestEx(dwTotalLength); | |
pHttpFile->Write(csData, dwLength); | |
pHttpFile->QueryInfoStatusCode( retCode ); | |
if (HTTP_STATUS_OK == retCode) //succ | |
{ | |
char buf[4096] = {0}; | |
UINT bytesRead = 0; | |
while( ( bytesRead = pHttpFile->Read( buf, 4095 ) ) > 0 ) | |
{ | |
buf[bytesRead] = '\0'; | |
size_t aLen = strlen( buf ) + 1; | |
int wLen = MultiByteToWideChar( 936, 0, buf, aLen, NULL, 0 ); | |
LPOLESTR lpw = new WCHAR [wLen]; | |
MultiByteToWideChar( 936, 0, buf, aLen, lpw, wLen ); | |
csResponse += lpw; | |
delete [] lpw; | |
memset( buf, 0, 4096 ); | |
} | |
} | |
bRet = pHttpFile->EndRequest(); | |
if (bRet) | |
{ | |
// Handle any authentication dialogs. | |
if (NeedAuth(pHttpFile)) | |
{ | |
DWORD dwErr; | |
dwErr = pHttpFile->ErrorDlg(GetDesktopWindow(), | |
bRet ? ERROR_SUCCESS : GetLastError(), | |
FLAGS_ERROR_UI_FILTER_FOR_ERRORS | | |
FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS | | |
FLAGS_ERROR_UI_FLAGS_GENERATE_DATA, | |
NULL); | |
if (dwErr == ERROR_INTERNET_FORCE_RETRY) | |
{ | |
goto resend; | |
} | |
else if(dwErr == 0) | |
{ | |
bRet = FALSE; | |
} | |
} | |
} | |
pHttpFile->Close(); | |
delete pHttpFile; | |
} | |
pConnect->Close(); | |
delete pConnect; | |
sess.Close(); | |
} | |
CATCH_ALL(e) | |
{ | |
return FALSE; | |
} | |
END_CATCH_ALL | |
return bRet; | |
} | |
BOOL CReaderVCView::HttpDataPut(CString csData, CString csAppName, CString csObject, CString csServer, CString csUserName, CString csPassword, INTERNET_PORT nPort, BOOL IsHTTPS) | |
{ | |
DWORD retCode = 0; | |
BOOL bRet = FALSE; | |
TRY | |
{ | |
CInternetSession sess(csAppName); | |
CHttpConnection* pConnect = sess.GetHttpConnection(csServer, nPort, csUserName, csPassword); | |
if (pConnect == NULL) | |
return FALSE; | |
DWORD dwRequestFlags=INTERNET_FLAG_EXISTING_CONNECT; | |
if ( IsHTTPS== TRUE) | |
dwRequestFlags |= INTERNET_FLAG_SECURE; | |
CHttpFile* pHttpFile = pConnect->OpenRequest(CHttpConnection::HTTP_VERB_PUT, csObject,NULL,1,NULL,NULL,dwRequestFlags); | |
if (pHttpFile != NULL) | |
{ | |
resend: | |
CString strData = csData; | |
DWORD dwTotalLength = strData.GetLength(); | |
bRet = pHttpFile->SendRequestEx(dwTotalLength); | |
pHttpFile->Write(csData, dwTotalLength); | |
bRet = pHttpFile->EndRequest(); | |
if (bRet) | |
{ | |
// Handle any authentication dialogs. | |
if (NeedAuth(pHttpFile)) | |
{ | |
DWORD dwErr; | |
dwErr = pHttpFile->ErrorDlg(GetDesktopWindow(), | |
bRet ? ERROR_SUCCESS : GetLastError(), | |
FLAGS_ERROR_UI_FILTER_FOR_ERRORS | | |
FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS | | |
FLAGS_ERROR_UI_FLAGS_GENERATE_DATA, | |
NULL | |
); | |
if (dwErr == ERROR_INTERNET_FORCE_RETRY) | |
{ | |
goto resend; | |
} | |
else if(dwErr == 0) | |
{ | |
bRet = FALSE; | |
} | |
} | |
} | |
pHttpFile->QueryInfoStatusCode( retCode ); | |
if (retCode != HTTP_STATUS_OK) | |
{ | |
bRet = FALSE; | |
} | |
else | |
bRet = TRUE; | |
pHttpFile->Close(); | |
delete pHttpFile; | |
} | |
pConnect->Close(); | |
delete pConnect; | |
sess.Close(); | |
} | |
CATCH_ALL(e) | |
{ | |
return FALSE; | |
} | |
END_CATCH_ALL | |
return bRet; | |
} | |
BOOL CReaderVCView::NeedAuth(CHttpFile *pHttpFile) | |
{ | |
// Get status code. | |
DWORD dwStatus; | |
DWORD cbStatus = sizeof(dwStatus); | |
pHttpFile->QueryInfo | |
( | |
HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_STATUS_CODE, | |
&dwStatus, | |
&cbStatus, | |
NULL | |
); | |
// fprintf (stderr, "Status: %d\n", dwStatus); | |
// Look for 401 or 407. | |
DWORD dwFlags; | |
switch (dwStatus) | |
{ | |
case HTTP_STATUS_DENIED: | |
dwFlags = HTTP_QUERY_WWW_AUTHENTICATE; | |
break; | |
case HTTP_STATUS_PROXY_AUTH_REQ: | |
dwFlags = HTTP_QUERY_PROXY_AUTHENTICATE; | |
break; | |
default: | |
return FALSE; | |
} | |
// Enumerate the authentication types. | |
BOOL fRet; | |
char szScheme[64]; | |
DWORD dwIndex = 0; | |
do | |
{ | |
DWORD cbScheme = sizeof(szScheme); | |
fRet = pHttpFile->QueryInfo | |
(dwFlags, szScheme, &cbScheme, &dwIndex); | |
//if (fRet) | |
//fprintf (stderr, "Found auth scheme: %s\n", szScheme); | |
} | |
while (fRet); | |
return TRUE; | |
} |