CViewで拡張子を追加したい


まっきー  2004-09-01 10:13:35  No: 54356

CViewで作成したプログラムに
標準で開くや保存といった機能がついていますが、開けるファイルの拡張子
をどのようにすれば追加できるのでしょうか?


シャノン  2004-09-02 07:58:38  No: 54357

---------------------------------------------------------------------
1.
*.htm と *.html のような、ファイルの種類は同じだけど拡張子が違う場合

まず、CWinApp 派生クラスの InitInstance の中で
CDocTemplate 派生クラス(CSingleDocTemplate / CMultiDocTemplate )の
インスタンスを作っているところに着目してください。
コンストラクタの第一引数を覚えておきます。

次に、String Table リソースを見て、さっきの第一引数と同じ ID を持つ
文字列を探します。
\n で区切られた文字列になっているはずですが、それを \n ごとに分解
すると、その4番目がファイルダイアログに表示するフィルタ名、
5番目が実際のフィルタ文字列になっています。

ここに、セミコロンで区切って複数の拡張子を書いてやれば実現できます。

---------------------------------------------------------------------
2.
*.html と *.exe など、複数のファイルの種類に対応したい場合

まず、CWinApp 派生クラスの InitInstance の中で
CDocTemplate 派生クラス(CSingleDocTemplate / CMultiDocTemplate )の
インスタンスを作っているところに着目してください。

これを真似して、ファイルの種類の数だけ CDocTemplate 派生クラスの
インスタンスを作ります。
その際、コンストラクタの第一引数に注意してください。
ファイルの拡張子、ドキュメントの名前などは、この第一引数と同じ ID を
持つ StringTable リソースから取得されるため、ファイルの種類の数だけ
StringTable に文字列を追加してやる必要があります。

作成したすべての CDocTemplate インスタンスを AddDocTemplate で追加
してやれば、複数の拡張子に対応できます。


まっきー  2004-09-02 11:11:58  No: 54358

返信ありがとうございます。

書かれたとおりにやってみたのですが、
私が思っていたものと少しだけ違っていました。

開くを選択したときに表示されるリストボックスに
複数の形式を追加したいのです。
たとえばこんな感じです。
---
テキスト形式(*.txt)
画像形式(*.bmp;*.jpg)
すべての形式(*.*)
---

テンプレートを追加するやり方では

はじめにどのタイプにするかを聞かれて、
開くときは、そのタイプの形式しか表示されませんでした。


シャノン  2004-09-02 12:12:55  No: 54359

そうですか?
今試してみたら、「ファイルを開く」ダイアログのフィルタには
そのように表示されますけど。

タイプの選択ダイアログが出るのは「新規作成」の時じゃないですか?


シャノン  2004-09-02 12:17:25  No: 54360

追記
後者の方法では、String Table 以外にも
アクセラレータ、アイコン、メニュー他、
CDocTemplate のコンストラクタの第一引数と同じ ID を持つリソースを
作ってやらないと失敗します。


まっきー  2004-09-03 12:12:39  No: 54361

すみません、私の勘違いのようです。
再度確認してみたら、表示されていました。

確かに、アイコンやメニューなどのIDも作成しないと
起動時に「空のドキュメントが・・・」
っていうメッセージが表示されてしまい
エラーになってしまいますね。

「開く」を実行し、ファイルを選択したあとに落ちてしまう
のは、どこか設定を間違っているからなのでしょうか?


シャノン  2004-09-03 13:59:18  No: 54362

うーん…今試してみたところ、ウチでは落ちなかったです。
MFC のソースコードの中にある、CDocManager::OnFileOpen あたりを
ステップ実行してみると、問題の箇所が特定できるかもしれません。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加