WORD98以上で作成したデータをRichEditで表示したいのですが・・・ – プログラミング – Home

WORD98以上で作成したデータをRi...
 
通知
すべてクリア

[解決済] WORD98以上で作成したデータをRichEditで表示したいのですが・・・

固定ページ 1 / 2

かずよ
 かずよ
(@かずよ)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

お世話になります。

ダイアログベースでRichEditを使用し、そこにCFileDialogでファイルを読み込むプログラム
作成しました。
しかし、WORDで作成したデータを読み込ませたのですが、読み込めませんでした。
WORDデータをテキストにおとして、読み込ませるとうまくいったのですが・・・
WORDデータを読み込ませる方法はないのでしょうか?
ご存知でしたらすみませんがご教授願えないでしょうか?
お願いします。

<環境>
winNT VC++6.0 MFC (ダイアログベース作成中)
<対象>
VC++ラウンジ


引用未解決
トピックタグ
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 81
 

思いつきで発言します。

WORDで保存するときの形式を *.doc ではなく
*.rtf(リッチテキスト形式)でやってみたら、どうでしょう?


返信引用
かずよ
 かずよ
(@かずよ)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

ん さんご返信どうもありがとうございました。
言われたとおりやってみたのですが文字化けして読み込めませんでした。
また、なにか方法があったらご教授もらえたら幸いです。
自分でもまたさがしてみます。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 23年前
投稿: 217
 

CRichEditCtrl::StreamIn を使えば読めます。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 23年前
投稿: 217
 

補足です。

> CRichEditCtrl::StreamIn を使えば読めます。

RTF形式のファイルが読めるということです。


返信引用
かずよ
 かずよ
(@かずよ)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

kazumaさんご返答ありがとうございました。返事が遅くなってしまって申し訳ないです。
さっそくヘルプで調べてやってみましたところなにぶん初心者のためか、
CRichEditCtrl::StreamIn の引数である、入力ストリームを指定するEDITSTREAM構造体の意
味がわかりませんでした。詳細をみたのですがすべて英語でわかりませんでした。
なにかこの関数を使った例があればお教えもらえないでしょうか?
よろしくお願いします。
自分でもさがしてみます。


返信引用
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 81
 

検索エンジン Google で EDITSTREAM CRichEditCtrl StreamIn で
検索したら、サンプルでてくるみたいです。


返信引用
かずよ
 かずよ
(@かずよ)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

んさん たびたびご返信してくださって本当に助かります。
サンプルを見て取り組んでいるところです。
理解するのにがんばっています。まだ完成してないので解決はしていないのですが
返信のお礼を述べたかったので書き込みました。
もうちょっと時間がかかりそうです。すいません。


返信引用
かずよ
 かずよ
(@かずよ)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

んさん kazumaさんありがとうございました。
おかげで作成することができました。親切に教えていただいて本当に助かりました。ありがとう
ございました。
ところで、*.doc 形式のWORDファイルを形式を変えずに読み込む方法をご存知でしたら
教えていただけないでしょうか?
VC++では不可能なのでしょうか?


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> ところで、*.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));
}


返信引用
かずよ
 かずよ
(@かずよ)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

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();
***************************************
***************************************
}


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> で呼び出すのは一番最後(参照 ****)
> でよろしいのでしょうか?

どこでもいいですが、
returnより後ろでは無意味なのは分かりますよね…?

> またこのコードはどこで付け加えたりするのでしょうか?

RTFファイルを読み込む前ならどこでも。

引数については、リファレンスを参照して
適切なものを指定してください。


返信引用
かずよ
 かずよ
(@かずよ)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

dairygoodsさん遅くなって申し訳ないです。

>どこでもいいですが、
>returnより後ろでは無意味なのは分かりますよね…?

確かにそうですね。すいません

>RTFファイルを読み込む前ならどこでも。

コードを付け加えるソースファイルはいったいどのファイルに追加すればいいのでしょうか?
InitInstance()のあるソースファイルなのでしょうか?

void foo() の定義はいったいどこですればいいのかもわかりません
なんかかなりおばかな質問ですいません。
いろいろ調べたのですがあまりよくわからなくて・・・
よかったら教えていただけませんか?
お願いします。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> コードを付け加えるソースファイルはいったいどのファイルに
> 追加すればいいのでしょうか?

かずよさんは何処かのソースファイルにStreamInを使った処理を
書いているわけですよね?
その手前に書けばよいです。
void foo() という関数は単なる例であり、何の意味もありません。

なんらかの関数(...)
{
ここに*.docファイルを*.rtfに変換する処理を記述する。

// 読み込み処理
...
m_richEdit.StreamIn(...);
...
}


返信引用
かずよ
 かずよ
(@かずよ)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

dairygoods さんお返事ありがとうございます。
説明不足でしたね。
*.rtf(リッチテキスト形式)作成したファイルを読み込むことには成功したので
そのさいに私は、新規でソースをつくっていてRichEditにこだわらずに作成しています。
できることなら方法はRichEditをつかって作成できれば一番いいのですが・・・
dairygoodsさんのおっしゃっていることは*.rtf(リッチテキスト形式)に変換する処理が入っ
てますがWORD文書の形式は*.docのまま読み込むことができると受け取っていいのですか?


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました