重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

A 回答 (7件)

リソースのStringTableにあるIDR_MAINFRAMEの文字列を編集します。


1個目の\nと2個目の\nの間にhogeと入れておけば、新規ドキュメントのタイトルとして使われるはずです。

この回答への補足

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

補足日時:2011/02/07 09:44
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/01/20 18:10

> この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されています。



という記述があります。MFC内部でも、この制限を超えないものとしてコーディングされていると推測できます。ファイル名を格納する領域の文字数としてMAX_PATHが指定されていて、その文字数を超えないように文字列操作をしているために、ファイル名が途中で切れているのではないでしょうか。

この制限にかからないようにするには、

・OSとしてWindows95/98/Meを対象外とする
・ファイル名を取得する部分で文字数がMAX_PATHに制限されないように書き直す
・ファイルをオープンする時にCreateFileのUNICODE版(CreateFileW)を使用し、ファイル名の先頭に"\\?\"を付加する

といった処理が必要になります。
かなり大がかりな作業になると思いますよ。

この回答への補足

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

補足日時:2011/01/20 17:44
    • good
    • 0

MFC内部ではWindowsAPIが使用されていますから、WindowsAPIと同様の制限を受けます。


ファイルオープンにはCreateFileが使用されるので、CreateFileの制限を確認してください。

CreateFile
http://msdn.microsoft.com/ja-jp/library/cc429198 …

特定の状況で、ある関数がどこから呼び出されたかを知るには、その関数内にブレークポイントを設定して、ブレークされたときにコールスタックを確認します。

この回答への補足

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

補足日時:2011/01/20 15:49
    • good
    • 0

読み込んだデータを、別のクラスに保存しているということですね。


ファイルの読み込み時にドキュメントクラスとの接点はありませんか?
ドキュメントクラスからファイル読み込みの関数を呼び出しているとか、ドキュメントクラスのSerialize関数でファイルを読み込んでデータをクラスに設定しているとかであれば、その時点でファイルが正しく読み込めたか判定できるはずです。その判定結果を保存するためのメンバ変数をドキュメントクラスに用意して、SetTitleでその変数を参照すればうまくいくんじゃないでしょうか。

せっかくシリアライズ機能が用意されているのですから、本当はSerialize関数内でファイルを読み込んで、ファイルが不正な場合はメッセージを表示するなりした後で、AfxThrowUserException()などを呼び出して読み込み失敗を通知したほうがいいと思いますが。

この回答への補足

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

補足日時:2011/01/20 13:48
    • good
    • 0

何をもって「ファイルが正しく開けた」とするのでしょうか?


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

この回答への補足

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

補足日時:2011/01/19 17:47
    • good
    • 0

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

この回答への補足

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

補足日時:2011/01/19 17:06
    • good
    • 0

最近使ったファイルを選択した場合、CWinApp::OnOpenRecentFileが呼び出されます。

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

この回答への補足

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

補足日時:2011/01/19 15:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!