📄 bookmarkview.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 + -