- 締切済み
VC++2003SDIでMFCアプリ作成中です。
最近使ったファイルからファイルを選んだ際、自動的にタイトルバーが更新されるようですが、これはどのクラスのどのメソッドで行われているのでしょうか? ある条件のときのみタイトルバーを更新したいので、処理を変更する為オーバーライドしたいと考えております。 どなたか教えていただけませんでしょうか?
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- m-take0220
- ベストアンサー率60% (477/782)
リソースのStringTableにあるIDR_MAINFRAMEの文字列を編集します。 1個目の\nと2個目の\nの間にhogeと入れておけば、新規ドキュメントのタイトルとして使われるはずです。
- m-take0220
- ベストアンサー率60% (477/782)
> この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されています。 という記述があります。MFC内部でも、この制限を超えないものとしてコーディングされていると推測できます。ファイル名を格納する領域の文字数としてMAX_PATHが指定されていて、その文字数を超えないように文字列操作をしているために、ファイル名が途中で切れているのではないでしょうか。 この制限にかからないようにするには、 ・OSとしてWindows95/98/Meを対象外とする ・ファイル名を取得する部分で文字数がMAX_PATHに制限されないように書き直す ・ファイルをオープンする時にCreateFileのUNICODE版(CreateFileW)を使用し、ファイル名の先頭に"\\?\"を付加する といった処理が必要になります。 かなり大がかりな作業になると思いますよ。
補足
難ししいですね・・ いろいろありがとうございます。 最後に伺いたいのですが、タイトルバーのデフォルト名は「無題」だと思いますが、 「hoge」のような名前にしたい場合はどうすればいいでしょうか? デフォルト時のみ変更したいのですが・・・
- m-take0220
- ベストアンサー率60% (477/782)
MFC内部ではWindowsAPIが使用されていますから、WindowsAPIと同様の制限を受けます。 ファイルオープンにはCreateFileが使用されるので、CreateFileの制限を確認してください。 CreateFile http://msdn.microsoft.com/ja-jp/library/cc429198.aspx 特定の状況で、ある関数がどこから呼び出されたかを知るには、その関数内にブレークポイントを設定して、ブレークされたときにコールスタックを確認します。
補足
http://msdn.microsoft.com/ja-jp/library/cc429198.aspxを読みましたが、よくわかりませんでした・・・。 具体的にどう書けばいいのでしょうか? OnOpenDocument(LPCTSTR lpszPathName)が呼ばれた時点でデバッグで見たところlpszPathNameは文字列が途中までしか入っていませんでした。 OnOpenDocumentが呼ばれる前に処理を加えるべきだと思うのですが、まったくわかりません・・・。
- m-take0220
- ベストアンサー率60% (477/782)
読み込んだデータを、別のクラスに保存しているということですね。 ファイルの読み込み時にドキュメントクラスとの接点はありませんか? ドキュメントクラスからファイル読み込みの関数を呼び出しているとか、ドキュメントクラスのSerialize関数でファイルを読み込んでデータをクラスに設定しているとかであれば、その時点でファイルが正しく読み込めたか判定できるはずです。その判定結果を保存するためのメンバ変数をドキュメントクラスに用意して、SetTitleでその変数を参照すればうまくいくんじゃないでしょうか。 せっかくシリアライズ機能が用意されているのですから、本当はSerialize関数内でファイルを読み込んで、ファイルが不正な場合はメッセージを表示するなりした後で、AfxThrowUserException()などを呼び出して読み込み失敗を通知したほうがいいと思いますが。
補足
なるほど・・・ありがとうございます。 ちなみに、元の関数のOnOpenDocument(LPCTSTR lpszPathName)では、ある大きさ以上の文字数は途中までしか読み込めないのですが、なぜなのでしょうか? ファイル名が途中できれてしまい、ファイルの読み込みができません。 MFCを起動した際、OnOpenDocumentはどこで呼びだされるのでしょうか?
- m-take0220
- ベストアンサー率60% (477/782)
何をもって「ファイルが正しく開けた」とするのでしょうか? 単にファイルエラーが発生しなかったという条件であれば、そもそもデフォルトの処理でエラー発生時にはタイトルは変更されないようになっているので、何もする必要はないはずです。
補足
まったく別のクラスのメソッドです。Docの中では、「静的でないメンバ関数の呼び出しが正しくありません」とエラーが出てインスタンス化できません。 どうしたらいいでしょうか?
- m-take0220
- ベストアンサー率60% (477/782)
ドキュメントクラスにvirtual void SetTitle(LPCTSTR lpszTitle)を作成して、その中でタイトルの変更が必要と判断した場合だけCDocument::SetTitleを呼び出せばいいでしょう。
補足
ありがとうございます。 ファイルが正しく開けたときというのはCDocumentクラスのメソッドにあるのでしょうか?
- m-take0220
- ベストアンサー率60% (477/782)
最近使ったファイルを選択した場合、CWinApp::OnOpenRecentFileが呼び出されます。この中では、対象のファイルのフルパスを取得して、CWinApp::OpenDocumentFileを呼び出しているだけで、タイトルに関しては「開く」で読み込んだ場合と同じ処理です。
補足
どのようにオーバーライドすればいいのでしょうか?
お礼
できました! ほんとに何度もありがとうございました。
補足
ちなみにですが、タイトルバーが文字化けすることがあるようです。 しかし、ファイルは正しい書式のときはうまく読み込めています。 つまり、タイトルバーの更新部分でおかしなことになっているようなのです。 しかも、なぜかドラッグ&ドロップでファイルを読み込んだ際はファイルも正しく表示されるし、タイトルバーも正しく表示されます。 ちなみに、おかしくなるのは全角の文字がファイル名に入っているときです。 原因がわかる方いらっしゃいますでしょうか?