SetModifiedFlag関数を使用した場合の表示メッセージについて

[戻る]
平井 2002/01/08(火) 16:25:10
VC++に関して質問させていただきます。
現在日本語リージョンと英語リージョンの両対応プログラムを作成しています。
過去ログなどを参考にさせていただき、リソースを日英2つ用意すれば、
Windowsのリージョンによって自動的にリソースが使いわけられるということ
までは分かりました。しかし、困ったことが起こりました。

ドキュメントを変更した時に
pDoc->SetModifiedFlag(TRUE);
としておくと、ウィンドウを閉じようとする際に自動的に
「***への変更を保存しますか。」というメッセージウィンドウが表示されます。
これが、英語リージョンでは「***??????????」となるのです。
これ以外のメッセージは全てStringTable(リソース)に持っていますのでうまく
使い分けが出来ています。

少し調べてみましたところ、問題のメッセージは AFXRES.H において
#define AFX_IDP_ASK_TO_SAVE   0xF103

として定義されていました。しかしこれ以上どう調べてよいのか分かりません。
0xF103 に該当するエラーはコンパイル時点で既に埋めこまれているのでしょうか。
そうであるならば、英語リージョンにおいて「への変更を保存しますか。」に該当
する部分が「????????」と表示されるのは納得がいきます。

長くなってしまいましたが、英語リージョンにおいて「***への変更を保存しますか。」
に該当する英語メッセージをちゃんと表示したいということです。
今考えているのは、StringTable に日英のメッセージを用意して、
CDocument::SaveModified 関数をオーバーライドする方法ですが、
もっと良い方法がありましたら教えて下さい。

クラフトマン 2002/01/08(火) 17:36:39
『テクニカル ノート 57: MFC コンポーネントのローカライズ』に、これに関する記述があります。
MSDNで調べてみてください。

平井 2002/01/09(水) 11:24:54
ご回答ありがとうございます。

私は「MFCのスタティックライブラリを使用」を選択していましたので、
アプリケーション自体にMFCリソースを抱えていたようです。

「共有DLLでMFCを使用」を選択しますと、日本語リージョンでは
日本語メッセージが、英語リージョンでは英語メッセージが表示される
ようになりました。

ただ気になりますのは、共有DLLを使用する場合、MFC4x.DLLも一緒に
配布しなければならないのでしょうか。それとも最近のWindowsであれば
MFC4x.DLLは当然あるものとして考えてもよいのでしょうか。

一方、MFCのリソースをスタティックなものとして使用する場合、
インクルードファイルの設定を変更することで日本語のリソースから
英語のリソースへ変えることができました。但し、この方法だと
メッセージは常に英語のみとなってしまいます。
(英語はどのリージョンでも表示できるのでこれでも我慢できますが・・)

MFCのスタティックライブラリを使用する場合でも、多国語に対応する
方法はないのでしょうか。

クラフトマン 2002/01/09(水) 19:20:23
再頒布に関しては、『テクニカル ノート 56』にMFCxx.DLLのインストールに関する注意事項が
あります。『再頒布』などもMSDNで調べてください。

>MFCのスタティックライブラリを使用する場合でも、多国語に対応する
>方法はないのでしょうか。

最初にお断りしておきますが、これから書くことは検証もしていないし、最適な方法である保証
もありません。
メニューから『表示』→『インクルードファイルの設定』を開いて、『コンパイル時に追加する
ファイル』の部分を見てください。ここで、日本の言語とコードページを設定して、MFCの日本語
リソースをインクルードしている部分があると思います。
これの下に、同じように英語の設定をして、MFCの英語リソースをインクルードする記述を追加し
ます。でも、これだけでは動きません。インクルードされるリソースファイルをメモ帳で開いて
みればわかりますが、二重インクルードを避けるための処理が施されているため、読み込みがス
キップされてしまうからです。
そこで、判定用のdefineをundefしてやります。
こんな感じ。(インクルードする内容は自分のアプリに合わせてください)
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
#undef __AFXRES_RC__
#undef __AFXCTL_RC__
#include "afxres.rc"          // 標準のコンポーネント
#include "afxprint.rc"        // 印刷/印刷プレビュー リソース
#endif

このundefして無理やり読み込ますという部分が、非常に不安です。
インクルードされるMFCのリソースファイルをよく読んで、問題がないことを確認しなければ
なりませんね。
#素直に、国別にリソースDLLを作成するとかしたほうがいいかも。

平井 2002/01/10(木) 10:16:12
[[解決]]
ご回答ありがとうございます。

まず、DLLの配布についてはやめておこうと思います。
色々と複雑になりそうですし、モジュール自体に適切な
MFCリソースを含めた方が安心できます。

> このundefして無理やり読み込ますという部分が、非常に不安です。
> インクルードされるMFCのリソースファイルをよく読んで、問題がないことを確認しなければ
> なりませんね。

教えていただいた方法を試してみたのですが、afxres.rc と l.jpn/afxres.rc で同じ値が定義
されているため、リソースコンパイラエラーとなりました。何か勘違いしていますでしょうか?

AFX_IDS_OPENFILE     "Open" (afxres.rc)
AFX_IDS_OPENFILE     "開く" (l.jpn/afxres.rc)


考えた結論なのですが、やはり日本語版と英語版で2バージョン作成しようと思います。
一つのプログラムで2つの言語に対応させようと考えたのは、プログラムに変更を加えた
場合に作業が一回で済むようにと考えたからですが、インクルードするMFCリソースの変更
くらいはすぐに出来ます。一つのプロジェクトで、2バージョン作ろうと思います。

クラフトマンさん、色々と教えて頂きありがとうございました。

クラフトマン 2002/01/10(木) 10:49:03
>教えていただいた方法を試してみたのですが、afxres.rc と l.jpn/afxres.rc で同じ値が定義
>されているため、リソースコンパイラエラーとなりました。何か勘違いしていますでしょうか?

同じ値でないと困ります。
ご自分のリソースファイル(日英混合の)をテキストとして開いてみれば、今回私がやろうとしたこと
の意味がわかると思います。ご参考まで。

とはいえ、今回平井さんが選択した方法が最も無難な方法であることは間違いないです。
それ以外には、リソースだけのDLL(サテライトDLL)を国別に配布する方法もあります。
これなら、例えば中国語に対応しなければならなくなった場合などに、中国語のDLLを作成するだけ
で済む可能性があります。

古いスレッドには追加発言できません。