程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 制作PDF格式電子圖書浏覽器

制作PDF格式電子圖書浏覽器

編輯:關於VC++

首先聲明,做這個PDF格式電子圖書浏覽器,其目的並不僅僅是教你如何做這個浏覽器,而是教你如何正確使用控件進行編程。要提醒你的是,如果你想進行這個實驗,那麼你的機器上面必須安裝有 Adobe Acrobat 4.0(或者更低版本),經筆者實驗,Adobe Acrobat 5.0 和 Adobe Acrobat 6.0 所提供的控件都是無法添加到我們的工程中去的。

要新建一個基於對話框的工程。需要注意的是,一定要在第二步中選中ActiveX Controls,否則在以後的步驟中還需要手動添加一些代碼,挺麻煩的。下面的步驟按其默認既可。

圖1

在下面出現的對話框中,可以把附加的控件刪除。

下面,我們要往項目裡面加入PDF控件。Project- >Add To Project- >Components and Controls- >Registerded ActiveX Controls,雙擊,在下面的控件窗口中找到"Acrobat Control 用於ActiveX",選擇下面的按鈕"Insert",下面點擊確定,正確插入後,我們可以在下面的框架裡看到"Acrobat Control for ActiveX"然後"Close"。

圖2

為了能夠利用這個剛剛加入的控件,我們還需要在"ResourceView"加入一個Menu(菜單),具體做法為"PdfReader resource"右健選擇"Insert",下面的就是新建一個"Menu"。但是,我們只是插入了這麼個菜單,在程序中還是沒有法調用的。這時返回到主對話框中,右健單擊,選擇"Properties"(屬性),在"Menu"中選擇剛才加入的Menu的ID。

現在,為了使我們的這個PdfReader工作,我們要在菜單中加入"打開",其ID可為ID_OPEN_PDFFILE,我們選擇把"Pop-up"前的鉤去除(注:如無說明,在菜單內加入其它選項,都是按照把"Pop-up"前鉤去掉處理)。

圖3

下面要用到ClassWizard(類向導)為剛剛加入的ID映射函數OnOpenPdffile()。

圖4

此時需要在CPdfReaderDlg加入:

public:CPdf m_PdfFile;響應ID_OPEN_PDFFILE"打開"代碼:void CPdfReaderDlg::OnOpenPdffile()
{
   char szFileFilter[]="PDF File(*.pdf)|*.pdf|All File(*.*)|*.*||";
   CFileDialog FileDialog(true,"","",OFN_EXPLORER,szFileFilter,this);
    if(FileDialog.DoModal()==IDOK)
    {
      CString  FilePath=FileDialog.GetPathName();
      m_PdfFile.LoadFile(FilePath);
    }
}

因為在上面的代碼中我們直接引用PDF控件所產生類的函數的LoadFile(),很顯然我們需要在"PdfReaderDlg.h"中加入"#include "pdf.h"."也許心情迫切的你想編譯現在的程序,行啊。運行一下,沒有什麼錯誤。選擇"打開",找到具有".pdf"格式的文件,可是會出現系統的警告錯誤。是什麼原因呢,請想一想啊。對,我們還沒有給控件在對話框內分配其存在空間呢。下面就是我們要做的。 利用Classwizard(類向導),為WM_CREATE消息映射個函數OnCtreate().其代碼如下:int CPdfReaderDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  if (CDialog::OnCreate(lpCreateStruct) == -1)
    return -1;
  CRect rect;
  GetWindowRect(&rect);
  m_PdfFile.Create(NULL,WS_VISIBLE,rect,this,0);
  return 0;
}

這時候你再編譯,是不是可以觀看PDF格式電子圖書了?但是,細心的你,是不是發現,我們的窗口既沒有最大化、最小化按鈕,也不能在對話框邊角位置拖動其大小。不用急,下面我們就准備做這些工作。

返回到主對話框,右鍵單擊,選擇"Properties"(屬性),在"Styles"裡"Border:"選擇"Resizing",在"Minimize box"和"Maximize box"前選擇打鉤。那麼我們的問題就算解決了。

圖5

在下面的拖拉對話框大小的時候,你也許會發現,我們的閱讀pdf電子圖書那部分窗口卻沒有發生什麼變化,是不是感到美中不足呢。對於這個問題,用一個函數就可以完美解決。我們需要用WM_SIZE映射一個函數OnSize()。

void CPdfReaderDlg::OnSize(UINT nType, int cx, int cy)
{
  CDialog::OnSize(nType, cx, cy);
  m_PdfFile.MoveWindow(0,0,cx,cy); //我們就需要加入這麼一行就行了。
}

在我們的菜單裡就"打開"這麼一個選擇未免太單調,我們可以自己手動加入一些東西。比如,"上頁""下頁""首頁""末頁""退出",其對應ID分別為:ID_PREVIOUS_PAGE,ID_NEXT_PAGE,ID_FIRST_PAGE,ID_LAST_PAGE,IDCANCEL(這裡要說的是,在其菜單屬性裡把"Pop-up"前鉤去掉),其對應函數分別為:void CPdfReaderDlg::OnFirstPage()
{
   m_PdfFile.gotoFirstPage();
}
void CPdfReaderDlg::OnLastPage()
{
  m_PdfFile.gotoLastPage();

}
void CPdfReaderDlg::OnNextPage()
{
  m_PdfFile.gotoNextPage();
}
void CPdfReaderDlg::OnPreviousPage()
{
  m_PdfFile.gotoPreviousPage();

}
void CPdfReaderDlg::OnCancel()
{
  CDialog::OnCancel();
}

我們能不能控制PDF格式電子圖書顯示的大小呢,答案是肯定的。在菜單中加入"視圖",其子項為"放大","縮小",對應ID為ID_CHANG_BIG,ID_CHANG_SMALL。相應函數可為:void CPdfReaderDlg::OnChangBig()
{
   i=i+50; //設定i的變化范圍。你可以改變一下i每次變化的大小。
  m_PdfFile.setZoom(i);

}
void CPdfReaderDlg::OnChangSmall()
{
  i=i-50;
  m_PdfFile.setZoom(i);

}

注意:要在PdfReaderDlg.cpp前面加上 int i=100;    //初始化i的大小

當然,你也可以添加一個新的對話框 ,用來設定PDF格式電子圖書顯示的大小。新加一個對話框後,生成相應的類,如CFind。在新生成的對話框內添加"Static"和 "Edit"控件。見下表和圖8:Static Text 控件  自定義大小:
Edit Box 控件  IDC_FIND

圖6

聲明後,打開Classwizard(類向導),選擇"Member Variables",選擇"Add Variable",為IDC_FIND映射float類型變量m_find。

圖7

現在往菜單視圖裡加入"自定義大小",ID為ID_SET_SIZE,相應函數極其代碼如下:void CPdfReaderDlg::OnSetSize()
{
  CFind getsize;
  getsize.DoModal();
  m_PdfFile.setZoom(getsize.m_find);
}

僅僅加入這些代碼,還不行,在OSetSize()直接使用CFind,這個類還沒有聲明,因此我們需要在"PdfReaderDlg.h"裡加入"Find.h". 如果考慮到"打印"的話,在菜單裡加入"打印",ID為ID_PRINT_PDFFILE,映射對應函數:void CPdfReaderDlg::OnPrintPdffile()
{
   m_PdfFile.Print();
}

到此時,我們的這個PDF電子圖書浏覽器算是初具規模了。下面我們要添加一些小的功能。 比如在窗口欄內顯示閱讀PDF電子圖書的名稱。這項功能可在下面函數裡添加:void CPdfReaderDlg::OnOpenPdffile()
{  CString m_Caption;  //新添加的一個變量,用於顯示窗口標題
  CString m_Word=" 現在正在觀看:";//也是新添加的
  char szFileFilter[]="PDF File(*.pdf)|*.pdf|All File(*.*)|*.*||";
  CFileDialog FileDialog(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
  if(FileDialog.DoModal()==IDOK)
  {  CString FileName=FileDialog.GetFileTitle();
    m_Caption=m_Word+FileName;//CString類型的重載操作。
    SetWindowText(m_Caption);//設置在窗口顯示
    CString PathName=FileDialog.GetPathName();
    m_PdfFile.LoadFile(PathName);
  }
}

我們要對這個浏覽器整容,我們要給對話框添加紅色背景。 SetDialogBkColor(RGB(255,0,0) ); 把上面這句添加到InitInstance()裡既可。我們運行出來的對話框左上角的那個系統默認圖標,實在沒有個性。好辦,我們要換成我們喜歡的小圖標。首先用鼠標選中,按"Delete"鍵刪除系統默認ICO圖標,然後在Menu上右鍵單擊,選擇"Insert",在下面的出現的對話框中選中"Icon",單擊"Import"按鈕選擇你要插入的Icon圖標。在新插入的Icon圖標上單擊右鍵,選擇"Properties",把其ID修改為"IDR_MAINFRAME",現在運行一下,看看效果。

圖8

我們的程序到此算是告一段落了。下面我們要總結一下。我們從加入的"Acrobat Control 用於ActiveX"控件所產生的類"CPdf"引用的函數有:

BOOL CPdf::LoadFile(LPCTSTR fileName)
void CPdf::Print()   //用於打印文件
void CPdf::setZoom(float percent)//設置頁面的大小
void CPdf::gotoFirstPage()//到第一頁
void CPdf::gotoLastPage()//到最後一頁
void CPdf::gotoNextPage()//到下一頁
void CPdf::gotoPreviousPage()//到上一頁

這些函數相對於類"CPdf"來說,只是很少的一部分,下面就要看各位的努力去豐富我們的"PdfReader"浏覽器了。因為,本文的目的,不僅僅是教會您如何做一個PDF浏覽器,而是通過做這麼個簡易的浏覽器,觸類旁通。如果您仔細的閱讀了本文,那麼首先慶祝您現在利用FLASH控件"Shockwave Flash Object ",Windows Media Player提供的"ActiveMovieObject Control"控件,還有RealOne Player播放器提供的控件"RealPlayer G2 Control"(前提是你的電腦上面安裝有RealOne)等一類控件可以自己制作完全屬於自己的FLASH播放器,Windows Media播放器,以及RealOne 播放器等。最後需要說明的是,關於添加控件,也可以在對話框內右鍵單擊,選擇"Insert ActiveX Control",在下面出現的控件選擇對話框裡選擇我們需要用到的控件既可。下面的步驟和我們在前面所介紹的步驟類似,在此不再介紹。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved