⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bookmarkview.cpp

📁 Foxit Reader DLL开发的示例软件。可以很方便地实现自己的pdf viewer.
💻 CPP
字号:
// BookMarkView.cpp : implementation file
//

#include "stdafx.h"
#include "ReaderVC.h"
#include "ChildFrm.h"
#include "BookMarkView.h"
#include "ReaderVCDoc.h"
#include "ReaderVCView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBookMarkView

IMPLEMENT_DYNCREATE(CBookMarkView, CTreeView)

CBookMarkView::CBookMarkView()
{
	m_pFram = NULL;
	m_pDoc = NULL;
}

CBookMarkView::~CBookMarkView()
{
}


BEGIN_MESSAGE_MAP(CBookMarkView, CTreeView)
	//{{AFX_MSG_MAP(CBookMarkView)
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBookMarkView drawing

void CBookMarkView::OnDraw(CDC* pDC)
{
	CReaderVCDoc* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CBookMarkView diagnostics

#ifdef _DEBUG
void CBookMarkView::AssertValid() const
{
	CTreeView::AssertValid();
}

void CBookMarkView::Dump(CDumpContext& dc) const
{
	CTreeView::Dump(dc);
}

CReaderVCDoc* CBookMarkView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CReaderVCDoc)));
	return (CReaderVCDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CBookMarkView message handlers

void CBookMarkView::OnInitialUpdate() 
{
	CTreeView::OnInitialUpdate();
	CReaderVCDoc* pDoc = GetDocument();
	m_pDoc = m_pFram->m_pView->GetPDFDoc();
	if(m_pDoc == NULL) return;
	int num = m_pFram->m_pView->GetTotalPages();
    CString strName = pDoc->GetTitle();
	FPDF_BOOKMARK bookmark1 = NULL;

	//////////////////////////////////////////////////////////////////////////
	//insert items
	
	CTreeCtrl &treeCtrl = this->GetTreeCtrl();
	m_hItemRoot = treeCtrl.InsertItem(strName,0,0,TVI_ROOT,TVI_FIRST);
	treeCtrl.SetItemData(m_hItemRoot,0);
	bookmark1 = FPDFBookmark_GetFirstChild(m_pDoc, NULL);
	if (bookmark1 == NULL)//insert the page index to tree  
	{
		for (int i=0; i<num; i++)
		{
			CString str;
			str.Format("Page%d", i+1);
			HTREEITEM hItem = treeCtrl.InsertItem(str);
			treeCtrl.SetItemData(hItem, i);
		}
	}else{
		while(bookmark1 != NULL) {
			this->InsertChildItem(bookmark1, m_hItemRoot, treeCtrl);
			bookmark1 = FPDFBookmark_GetNextSibling(m_pDoc,bookmark1);
		} 
	}
	treeCtrl.Expand(m_hItemRoot,TVE_EXPAND);
	
	LONG nStyle = ::GetWindowLong(this->m_hWnd, GWL_STYLE);
	nStyle |= TVS_LINESATROOT;
	nStyle |= TVS_HASLINES;
	nStyle |= TVS_HASBUTTONS;
	::SetWindowLong(this->m_hWnd, GWL_STYLE, nStyle);
	
}

void CBookMarkView::InsertChildItem(FPDF_BOOKMARK bookmark, HTREEITEM hItem, CTreeCtrl &treectrl)
{

	CString strTitle;
	DWORD dwItemData = 0;
//	WCHAR buffer[1024];
	CString str;
	int strlenth = 0;
	unsigned long pdf_actType = 0;
	//FPDF_BOOKMARK 
	FPDF_DEST dest = NULL;
	FPDF_ACTION action = NULL;
	strlenth = FPDFBookmark_GetTitle(bookmark, NULL, 0);
	if(strlenth<0)
	return;
	//strlenth = strlenth/2;
	wchar_t* buffer = new wchar_t[strlenth];
	memset(buffer,0,strlenth);
	FPDFBookmark_GetTitle(bookmark, buffer, 0);
	int nlen = WideCharToMultiByte(CP_ACP,0,buffer,-1,NULL,NULL,NULL,NULL);
	char *buffer1 = new char[nlen];
	memset(buffer1,0,nlen);
	WideCharToMultiByte(CP_ACP,0,buffer,strlenth,buffer1,nlen,NULL,NULL);
	buffer1[nlen -1] = L'\0';
 	hItem = treectrl.InsertItem(buffer1, 0, 0, hItem, TVI_LAST);
	action = FPDFBookmark_GetAction(bookmark);
	if (action != NULL)
	{
		pdf_actType = FPDFAction_GetType(action);
		if (pdf_actType == 1)
		{
			dest = FPDFAction_GetDest(m_pDoc, action);
			dwItemData = FPDFDest_GetPageIndex(m_pDoc, dest);
			treectrl.SetItemData(hItem, dwItemData);
			
		}else{
			dwItemData = 0;
			treectrl.SetItemData(hItem, dwItemData);
		}
		
	}else{
		dest = FPDFBookmark_GetDest(m_pDoc, bookmark);
		dwItemData = FPDFDest_GetPageIndex(m_pDoc, dest);
		treectrl.SetItemData(hItem, dwItemData);
	}
	
	bookmark = FPDFBookmark_GetFirstChild(m_pDoc, bookmark);
	while(bookmark != NULL)
	{
		this->InsertChildItem(bookmark, hItem, treectrl);
		bookmark = FPDFBookmark_GetNextSibling(m_pDoc, bookmark);
	} 
	delete[] buffer;
	delete[] buffer1;
}

void CBookMarkView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	HTREEITEM hItem;
	DWORD dwPageIdex= 0;
	if(m_pDoc == NULL) return;
	hItem = GetTreeCtrl().GetSelectedItem();
	dwPageIdex = GetTreeCtrl().GetItemData(hItem);
	m_pFram->m_pView->LoadPDFPage(m_pDoc, dwPageIdex);
	m_pFram->m_pView->Invalidate();
	*pResult = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -