お世話になります。
ダイアログベースでRichEditを使用し、そこにCFileDialogでファイルを読み込むプログラム
作成しました。
しかし、WORDで作成したデータを読み込ませたのですが、読み込めませんでした。
WORDデータをテキストにおとして、読み込ませるとうまくいったのですが・・・
WORDデータを読み込ませる方法はないのでしょうか?
ご存知でしたらすみませんがご教授願えないでしょうか?
お願いします。
<環境>
winNT VC++6.0 MFC (ダイアログベース作成中)
<対象>
VC++ラウンジ
思いつきで発言します。
WORDで保存するときの形式を *.doc ではなく
*.rtf(リッチテキスト形式)でやってみたら、どうでしょう?
ん さんご返信どうもありがとうございました。
言われたとおりやってみたのですが文字化けして読み込めませんでした。
また、なにか方法があったらご教授もらえたら幸いです。
自分でもまたさがしてみます。
CRichEditCtrl::StreamIn を使えば読めます。
補足です。
> CRichEditCtrl::StreamIn を使えば読めます。
RTF形式のファイルが読めるということです。
kazumaさんご返答ありがとうございました。返事が遅くなってしまって申し訳ないです。
さっそくヘルプで調べてやってみましたところなにぶん初心者のためか、
CRichEditCtrl::StreamIn の引数である、入力ストリームを指定するEDITSTREAM構造体の意
味がわかりませんでした。詳細をみたのですがすべて英語でわかりませんでした。
なにかこの関数を使った例があればお教えもらえないでしょうか?
よろしくお願いします。
自分でもさがしてみます。
検索エンジン Google で EDITSTREAM CRichEditCtrl StreamIn で
検索したら、サンプルでてくるみたいです。
んさん たびたびご返信してくださって本当に助かります。
サンプルを見て取り組んでいるところです。
理解するのにがんばっています。まだ完成してないので解決はしていないのですが
返信のお礼を述べたかったので書き込みました。
もうちょっと時間がかかりそうです。すいません。
んさん kazumaさんありがとうございました。
おかげで作成することができました。親切に教えていただいて本当に助かりました。ありがとう
ございました。
ところで、*.doc 形式のWORDファイルを形式を変えずに読み込む方法をご存知でしたら
教えていただけないでしょうか?
VC++では不可能なのでしょうか?
> ところで、*.doc 形式のWORDファイルを形式を変えずに読み込む方法をご存知でしたら
クラスウィザードの[クラスの追加]-[タイプライブラリから]を選び、
Officeをインストールしたディレクトリから、「MSWORD9.OLB」というのを探して、
選択します。すると、クラスの一覧が表示されます。これがWORDを扱うための
クラス一覧になります。使うものだけ追加します。
このクラス群のリファレンスは、MSDN Onlineの「Office開発環境」にあります。
書式情報を読み込んでRichEditの形式に変換しようとすると、
かなり難解になりそうです。
DocumentのSaveAsを使ってRTF形式で保存するのが簡単かもしれません。
1) クラスウィザードで、[_Application],[Documents],[_Document]を追加
2) InitInstance() で AfxOleInit() を呼び出す。
3) コード
#include <comdef.h>
void foo() {
_Application word;
word.CreateDispatch(Word.Application);
// word.SetVisible(TRUE); // WORDを表示
Documents docs = word.GetDocuments();
_Document doc = docs.Open(
&_variant_t(C:\\ドキュメント.doc),
&_variant_t(false),
&_variant_t(false),
&_variant_t(false),
&_variant_t("),
&_variant_t("),
&_variant_t(false),
&_variant_t("),
&_variant_t("),
&_variant_t((long)0),
&_variant_t("),
&_variant_t(true));
doc.SaveAs(
&_variant_t(C:\\ドキュメント.rtf),
&_variant_t((long)6), // wdFormatRTF = 6
&_variant_t(false),
&_variant_t("),
&_variant_t(false),
&_variant_t("),
&_variant_t(false),
&_variant_t(false),
&_variant_t(false),
&_variant_t(false),
&_variant_t(false));
word.Quit(
&_variant_t(false),
&_variant_t(false),
&_variant_t((long)0));
}
dairygoods さん返信ありがとうございます。コードまで親切に記載していただいてとても助
かります。
早速なのですが、
>2) InitInstance() で AfxOleInit() を呼び出す。
で呼び出すのは一番最後(参照 ****)
でよろしいのでしょうか?
>3) コード
またこのコードはどこで付け加えたりするのでしょうか?
すいません。なにぶんVC++をはじめたばかりの初心者なもので
自分なりに調べたり考えているのですが、わかりませんでした。
よろしかったらご教授ねがえないでしょうか?
==========================================================================
BOOL CWordcApp::InitInstance()
{
// OLE ライブラリの初期化
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer();
// 標準的な初期化処理
// もしこれらの機能を使用せず、実行ファイルのサイズを小さく
// したければ以下の特定の初期化ルーチンの中から不必要なもの
// を削除してください。
#ifdef _AFXDLL
Enable3dControls(); // 共有 DLL の中で MFC を使用する場
合にはここを呼び出してください。
#else
Enable3dControlsStatic(); // MFC と静的にリンクしている場合にはここを呼
び出してください。
#endif
// 設定が保存される下のレジストリ キーを変更します。
// TODO: この文字列を、会社名または所属など適切なものに
// 変更してください。
SetRegistryKey(_T(Local AppWizard-Generated Applications));
LoadStdProfileSettings(); // 標準の INI ファイルのオプションをロードしま
す (MRU を含む)
// アプリケーション用のドキュメント テンプレートを登録します。ドキュメント
テンプレート
// はドキュメント、フレーム ウィンドウとビューを結合するために機能します。
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CWordcDoc),
RUNTIME_CLASS(CMainFrame), // メイン SDI フレーム ウィン
ドウ
RUNTIME_CLASS(CWordcView));
AddDocTemplate(pDocTemplate);
// ドキュメント テンプレートに COleTemplateServer を接続します。
// COleTemplateServer はドキュメント テンプレートで指定された
// 情報を使って OLE コンテナに要求する代わりに新規ドキュメント
// を作成します。
m_server.ConnectTemplate(clsid, pDocTemplate, TRUE);
// メモ: SDI アプリケーションはコマンドラインで /Embedding
か /Automation
// が指定されている時だけサーバー オブジェクトを登録しま
す。
// DDE、file open など標準のシェル コマンドのコマンドラインを解析します。
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// OLE サーバーとして起動されているか確認します。
if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated)
{
// 実行するとすべての OLE サーバー ファクトリを登録します。
// 他のアプリケーションからオブジェクトを作るために OLE ライブラ
リを使用可能にします。
COleTemplateServer::RegisterAll();
// アプリケーションが /Embedding か /Automation で実行されている
時には
// メイン ウィンドウ は表示できません。
return TRUE;
}
// システム レジストリが壊れていてサーバー アプリケーションがスタンド アロ
ンで
// 起動された時には、システム レジストリを更新してください。
m_server.UpdateRegistry(OAT_DISPATCH_OBJECT);
COleObjectFactory::UpdateRegistryAll();
// コマンドラインでディスパッチ コマンドを指定します。
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// メイン ウィンドウが初期化されたので、表示と更新を行います。
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
***************************************
***************************************
AfxOleInit();
***************************************
***************************************
}
> で呼び出すのは一番最後(参照 ****)
> でよろしいのでしょうか?
どこでもいいですが、
returnより後ろでは無意味なのは分かりますよね…?
> またこのコードはどこで付け加えたりするのでしょうか?
RTFファイルを読み込む前ならどこでも。
引数については、リファレンスを参照して
適切なものを指定してください。
dairygoodsさん遅くなって申し訳ないです。
>どこでもいいですが、
>returnより後ろでは無意味なのは分かりますよね…?
確かにそうですね。すいません
>RTFファイルを読み込む前ならどこでも。
コードを付け加えるソースファイルはいったいどのファイルに追加すればいいのでしょうか?
InitInstance()のあるソースファイルなのでしょうか?
void foo() の定義はいったいどこですればいいのかもわかりません
なんかかなりおばかな質問ですいません。
いろいろ調べたのですがあまりよくわからなくて・・・
よかったら教えていただけませんか?
お願いします。
> コードを付け加えるソースファイルはいったいどのファイルに
> 追加すればいいのでしょうか?
かずよさんは何処かのソースファイルにStreamInを使った処理を
書いているわけですよね?
その手前に書けばよいです。
void foo() という関数は単なる例であり、何の意味もありません。
なんらかの関数(...)
{
ここに*.docファイルを*.rtfに変換する処理を記述する。
// 読み込み処理
...
m_richEdit.StreamIn(...);
...
}
dairygoods さんお返事ありがとうございます。
説明不足でしたね。
*.rtf(リッチテキスト形式)作成したファイルを読み込むことには成功したので
そのさいに私は、新規でソースをつくっていてRichEditにこだわらずに作成しています。
できることなら方法はRichEditをつかって作成できれば一番いいのですが・・・
dairygoodsさんのおっしゃっていることは*.rtf(リッチテキスト形式)に変換する処理が入っ
てますがWORD文書の形式は*.docのまま読み込むことができると受け取っていいのですか?