はじめまして、PDFの表示をするプログラムの作成に関して質問させてください。
OSはXP、開発環境はVC++2005です。
PDFに関する知識がほとんどない状態からとりあえず色々調べ、
なんとかDDE通信を用いて自作プログラムからAdobeReaderを起動、
指定のPDFファイルの指定ページを開く、ということを実現することができました。
そこまでは良かったのですが、DDEではなく、ActiveXを使ってほしいと言われ…
Adobe社のサポートなどから、AcroPDF.dllというものがあると知り、また、
http://www.codeproject.com/miscctrl/acroview.asp?df=100&forumid=151712&exp=0&fr=26&select=1035856#xx1035856xx
このようなかなりいい情報にもめぐり合えたのですが、
なにぶんMFCでの開発経験がなく、見よう見まねで↑のコードを参考に
自分で作ってみるも、PDFファイルは一向に開かれず…。
長々と前置きをしてしまいましたが、上記の自作プログラムの状況を打開するにはどうしたらいいのか、どうかご教授ください。
リンク先に置いてあったプログラムでは、複数のPDFファイルを開くような作りになっていました。
しかし私の作成したいプログラムの仕様では、
ひとつのウィンドウのみで、ひとつだけのPDFファイルを開く、別のPDFファイルを開く場合は自動的に先のPDFファイルを閉じる、
ということが求められています。
現行の自作プログラムは、以下のように作成しました。
・プロジェクトはSDIを選択、ドキュメントビュー構造で作成のチェックを外す。
→Appクラス、MainFrm、ChildViewが作成されました
・メニューの[プロジェクト][クラスの追加][ActiveXコントロールのMFCクラス][追加]で、
"Adobe PDF Reade<1.0>"を選択、インターフェイス"IAcroAXDocShim"を選んで、"CAcroAXDocShim"というクラスを生成、プロジェクトに追加。
・作成されたプロジェクトの、CXXXXAppクラスに「ファイルを開く」が選ばれたときの動作を記述する関数を作成。
void CPDFviewerSimpleApp::OnPdfOpen()
{
CPDFInfo pdfInfo;//PDFファイル名と開くページの情報をもつクラス
CMyFile openFile;
openFile.SelectFile();//「ファイルを開く」ダイアログでPDFファイルを指定
pdfInfo.setPDFfilePath(openFile.getFilePath());
CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, m_pMainWnd);
pFrame->m_wndView.Open(pdfInfo.getPDFfilePath());
}
・ChildViewに"CAcroAXDocShim.h"をインクルードし、CAcroAXDocShimクラスのオブジェクトを持たせる。
・ChildViewに以下を記述
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_ctrl.Create(_T("AdobeReader"),WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, 1000))
return -1;
return 0;
}
・ChildViewにOpenという関数(CPDFviewerSimpleApp::OnPdfOpenで呼んでいるもの)を作成
void CChildView::Open(CString filePath)
{
m_ctrl.LoadFile(filePath);
}
これを実行すると、エラーは出ないのですが、PDFファイルも出ません…。
PDFがどう、というより、何だか根本的にMFCのプログラム構造が分かってないのがそもそも…という気が自分ではしています。それで質問をしに来るというのも図々しいのですが;
どなたか、うまくいかない原因が分かる方がいらっしゃいましたらよろしくお願いします。
すいません、自己解決してしまいました。
Create時にCRect(0,0,0,0)で作っているのにその後そのサイズを直したりしていない…そりゃ表示されないよというオチでした。
お騒がせしました。
ツイート | ![]() |