blob: ef0b58bfbbe87df61e931b1a6ac41c812eb37712 [file] [log] [blame]
// 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;
}