○開発環境
VC++6.0/WinXP Pro/ダイアログベース
○エディットボックスの機能
改行入力可/垂直スクロールバー有り
VCのリソースエディタで作成したエディットボックスで
原因不明の文字化けが発生するのですが、
何が原因なのかさっぱりわからない状態です。
処理的にやっていることは、
OnInitDialog内でそのエディットボックスに対してLimitText()を行っているだけです。
具体的にどのような文字化けかというと、
ある程度文字を入力した状態でカーソル位置を入力文字の最初の位置に移動。
再度入力を行うと、文字が重なったように表示されます。
上記の状態でも文字を選択状態にすると、正しく表示されます。
更新すれば直ると思い、変更されたたびに更新処理をいれても、
複数行だった場合にスクロールバーを操作すると、同じ現象が発生します。
どなたかこの現象に関して心当たりはございますでしょうか?
よろしくお願いします。
カスタムドローとかしていませんか?
回答有難うございます。
カスタムドローに関しては行っていませんでした。
追記で、部品自体作り直しても現象が発生します。
エディットボックスに関しては基本的にイベント処理は行わないように作成しています。
ダイアログのフォントに日本語が使用できないものを選択していませんか?
(そんな基本的なことじゃないかな?)
ダイアログベースでテスト用の簡単なアプリを作成して
そこにエディットボックスを配置して
「OnInitDialog内でそのエディットボックスに対してLimitText()を行っているだけです。」
を実行しても同じ現象が起こりますか?
起こらないのであれば、テスト用のアプリと今のアプリの差を見つければ、
何かわかるかもしれません。
いろはさん、PATIOさん回答有難うございます。
いろはさん
→ 入力制限に関してはデフォルトのままなので「MSゴシック」です。
ちなみにアルファベットでも日本語でも数字でもこの現象は発生します。
PATIOさん
→ テスト用のダイアログを作成し、試した結果、テスト用では再現しなかったので、
内部の設定を見比べたのですが、違いといえば「WS_VISIBLE」が
設定されていなかっただけでした。
一応設定内容を合わせてみたのですが治りませんでした。
逆に問題のプログラムの方でリビルドが通って動作に影響ないように
気をつけながらプログラムを少しずつコメントアウトしていって
何処までコメントアウトしたら現象が起こらなくなるかとか
そういう調べ方もあると思います。
内部設定とかではなくてプログラムコードで何かしていて
壊しているとか無いでしょうか?
テスト用のプログラムの方では起きなかったのであれば、
問題のプログラムにまずい部分があるはずなので
テスト用のプログラムとの差をソースコードも含めて
徹底的に調べないといけないと思います。
ちょっと思い出したんですが、
以前にVisualStudioのリソースエディターに不具合があって
一度拡張スタイルを設定するとそのスタイルを外しても
リソース上に残っている事があると言う物があったと思います。
対象にエディットコントロールが含まれるかどうかはわかりませんが、
テストプログラムと問題のプログラムのリソースファイルを
直接テキストエディタで参照して比べてみたら何かわかるかもしれません。
PATIOさん回答有難うございます。
>以前にVisualStudioのリソースエディターに不具合があって・・・
→ 拡張スタイルに関してはデフォルトで用意されている「WS_EX_APPWINDOW」
だけでしたので問題ありませんでした。
>プログラムを少しずつコメントアウトしていって・・・
→ これに関しては、コンストラクタ、OnInitDialogの処理全てを
コメントアウトしても再現します。
やはり、画面自体作りなおしたほうがよいのでしょうか?
OnCtrlColor() で pDC->SetBkMode(TRANSPARENT) しているとか。
問題のプログラムがどの程度の規模の物なのか分からないので
コンストラクタとOnInitDialogを全てコメントアウトしても再現すると
言われてもそれで十分な検証になっているのかが分からないです。
例えばの話ですが、問題のアプリケーション内の一見関係ないような
箇所の処理でメモリを破壊していたような場合にそのメモリ破壊によって
どんな現象が起こるかは予想できないです。
なにせ、メモリ上のどのあたりを壊しているか予想もつきませんから
表示がおかしくなる事もありえるでしょうし、突然プログラムが
異常終了するようなケースもあるでしょう。
dairygoodsさんが指摘されているケースも該当しないのであれば、
プログラム内でメモリ破壊が起こるような部分が無いかチェックした方が
良いのではないかと思います。
何にせよ、簡単なテストプログラムでは再現しないわけですから
問題のプログラムに不具合があると考えるべきではないかと思います。
画面の作り直しで回避するのでは原因は分からないままです。
できれば、原因を追究してすっきりした方が良いと思います。
それが次の同様のケースの防止に繋がりますし、同様のケースへの
対応手段の蓄積に繋がります。
dairygoodsさん回答有難うございます。
>OnCtrlColor() で pDC->SetBkMode(TRANSPARENT) しているとか。
→ 正にその通りでした。
試しに「pDC->SetBkMode(TRANSPARENT)」を消した状態で画面を動かすと
文字化けが発生しなくなりました。
バックグラウンドを描画しないという設定で、
なぜ入力文字まで影響を受けるのでしょうか?
とりあえず、処置内容に関しては、
色の塗りつぶし処理を行う場合は「pDC->SetBkMode(TRANSPARENT)」
色の塗りつぶし処理を行わない場合は「「pDC->SetBkMode(OPAQUE)」
とするようにしました。
RAPTさん、いろはさん、PATIOさん、dairygoodsさん、
この問題に関してご助力頂きましてありがとうございました。
文字化けなのではなくて背景描画をしないと前の描画が残ったままで
重ね書きみたいになるからじゃないですかねぇ。
なんにしても解決して何よりでした。