• 締切済み

VC++2003SDIでMFCアプリ作成中です。

最近使ったファイルからファイルを選んだ際、自動的にタイトルバーが更新されるようですが、これはどのクラスのどのメソッドで行われているのでしょうか? ある条件のときのみタイトルバーを更新したいので、処理を変更する為オーバーライドしたいと考えております。 どなたか教えていただけませんでしょうか?

みんなの回答

回答No.7

リソースのStringTableにあるIDR_MAINFRAMEの文字列を編集します。 1個目の\nと2個目の\nの間にhogeと入れておけば、新規ドキュメントのタイトルとして使われるはずです。

gsfgsgshh
質問者

お礼

できました! ほんとに何度もありがとうございました。

gsfgsgshh
質問者

補足

ちなみにですが、タイトルバーが文字化けすることがあるようです。 しかし、ファイルは正しい書式のときはうまく読み込めています。 つまり、タイトルバーの更新部分でおかしなことになっているようなのです。 しかも、なぜかドラッグ&ドロップでファイルを読み込んだ際はファイルも正しく表示されるし、タイトルバーも正しく表示されます。 ちなみに、おかしくなるのは全角の文字がファイル名に入っているときです。 原因がわかる方いらっしゃいますでしょうか?

回答No.6

> この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されています。 という記述があります。MFC内部でも、この制限を超えないものとしてコーディングされていると推測できます。ファイル名を格納する領域の文字数としてMAX_PATHが指定されていて、その文字数を超えないように文字列操作をしているために、ファイル名が途中で切れているのではないでしょうか。 この制限にかからないようにするには、 ・OSとしてWindows95/98/Meを対象外とする ・ファイル名を取得する部分で文字数がMAX_PATHに制限されないように書き直す ・ファイルをオープンする時にCreateFileのUNICODE版(CreateFileW)を使用し、ファイル名の先頭に"\\?\"を付加する といった処理が必要になります。 かなり大がかりな作業になると思いますよ。

gsfgsgshh
質問者

補足

難ししいですね・・ いろいろありがとうございます。 最後に伺いたいのですが、タイトルバーのデフォルト名は「無題」だと思いますが、 「hoge」のような名前にしたい場合はどうすればいいでしょうか? デフォルト時のみ変更したいのですが・・・

回答No.5

MFC内部ではWindowsAPIが使用されていますから、WindowsAPIと同様の制限を受けます。 ファイルオープンにはCreateFileが使用されるので、CreateFileの制限を確認してください。 CreateFile http://msdn.microsoft.com/ja-jp/library/cc429198.aspx 特定の状況で、ある関数がどこから呼び出されたかを知るには、その関数内にブレークポイントを設定して、ブレークされたときにコールスタックを確認します。

gsfgsgshh
質問者

補足

http://msdn.microsoft.com/ja-jp/library/cc429198.aspxを読みましたが、よくわかりませんでした・・・。 具体的にどう書けばいいのでしょうか? OnOpenDocument(LPCTSTR lpszPathName)が呼ばれた時点でデバッグで見たところlpszPathNameは文字列が途中までしか入っていませんでした。 OnOpenDocumentが呼ばれる前に処理を加えるべきだと思うのですが、まったくわかりません・・・。

回答No.4

読み込んだデータを、別のクラスに保存しているということですね。 ファイルの読み込み時にドキュメントクラスとの接点はありませんか? ドキュメントクラスからファイル読み込みの関数を呼び出しているとか、ドキュメントクラスのSerialize関数でファイルを読み込んでデータをクラスに設定しているとかであれば、その時点でファイルが正しく読み込めたか判定できるはずです。その判定結果を保存するためのメンバ変数をドキュメントクラスに用意して、SetTitleでその変数を参照すればうまくいくんじゃないでしょうか。 せっかくシリアライズ機能が用意されているのですから、本当はSerialize関数内でファイルを読み込んで、ファイルが不正な場合はメッセージを表示するなりした後で、AfxThrowUserException()などを呼び出して読み込み失敗を通知したほうがいいと思いますが。

gsfgsgshh
質問者

補足

なるほど・・・ありがとうございます。 ちなみに、元の関数のOnOpenDocument(LPCTSTR lpszPathName)では、ある大きさ以上の文字数は途中までしか読み込めないのですが、なぜなのでしょうか? ファイル名が途中できれてしまい、ファイルの読み込みができません。 MFCを起動した際、OnOpenDocumentはどこで呼びだされるのでしょうか?

回答No.3

何をもって「ファイルが正しく開けた」とするのでしょうか? 単にファイルエラーが発生しなかったという条件であれば、そもそもデフォルトの処理でエラー発生時にはタイトルは変更されないようになっているので、何もする必要はないはずです。

gsfgsgshh
質問者

補足

まったく別のクラスのメソッドです。Docの中では、「静的でないメンバ関数の呼び出しが正しくありません」とエラーが出てインスタンス化できません。 どうしたらいいでしょうか?

回答No.2

ドキュメントクラスにvirtual void SetTitle(LPCTSTR lpszTitle)を作成して、その中でタイトルの変更が必要と判断した場合だけCDocument::SetTitleを呼び出せばいいでしょう。

gsfgsgshh
質問者

補足

ありがとうございます。 ファイルが正しく開けたときというのはCDocumentクラスのメソッドにあるのでしょうか?

回答No.1

最近使ったファイルを選択した場合、CWinApp::OnOpenRecentFileが呼び出されます。この中では、対象のファイルのフルパスを取得して、CWinApp::OpenDocumentFileを呼び出しているだけで、タイトルに関しては「開く」で読み込んだ場合と同じ処理です。

gsfgsgshh
質問者

補足

どのようにオーバーライドすればいいのでしょうか?

関連するQ&A