エディットボックスの文字化けの原因について – プログラミング – Home

エディットボックスの文字化けの原因につ...
 
通知
すべてクリア

[解決済] エディットボックスの文字化けの原因について


タケシ
 タケシ
(@タケシ)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

○開発環境
VC++6.0/WinXP Pro/ダイアログベース
○エディットボックスの機能
改行入力可/垂直スクロールバー有り

VCのリソースエディタで作成したエディットボックスで
原因不明の文字化けが発生するのですが、
何が原因なのかさっぱりわからない状態です。

処理的にやっていることは、
OnInitDialog内でそのエディットボックスに対してLimitText()を行っているだけです。

具体的にどのような文字化けかというと、
ある程度文字を入力した状態でカーソル位置を入力文字の最初の位置に移動。
再度入力を行うと、文字が重なったように表示されます。

上記の状態でも文字を選択状態にすると、正しく表示されます。

更新すれば直ると思い、変更されたたびに更新処理をいれても、
複数行だった場合にスクロールバーを操作すると、同じ現象が発生します。

どなたかこの現象に関して心当たりはございますでしょうか?
よろしくお願いします。


引用未解決
トピックタグ
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

カスタムドローとかしていませんか?


返信引用
タケシ
 タケシ
(@タケシ)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

回答有難うございます。

カスタムドローに関しては行っていませんでした。

追記で、部品自体作り直しても現象が発生します。
エディットボックスに関しては基本的にイベント処理は行わないように作成しています。


返信引用
いろは
 いろは
(@いろは)
ゲスト
結合: 21年前
投稿: 43
 

ダイアログのフォントに日本語が使用できないものを選択していませんか?
(そんな基本的なことじゃないかな?)


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

ダイアログベースでテスト用の簡単なアプリを作成して
そこにエディットボックスを配置して
「OnInitDialog内でそのエディットボックスに対してLimitText()を行っているだけです。」
を実行しても同じ現象が起こりますか?

起こらないのであれば、テスト用のアプリと今のアプリの差を見つければ、
何かわかるかもしれません。


返信引用
タケシ
 タケシ
(@タケシ)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

いろはさん、PATIOさん回答有難うございます。

いろはさん
 → 入力制限に関してはデフォルトのままなので「MSゴシック」です。
   ちなみにアルファベットでも日本語でも数字でもこの現象は発生します。

PATIOさん
 → テスト用のダイアログを作成し、試した結果、テスト用では再現しなかったので、
   内部の設定を見比べたのですが、違いといえば「WS_VISIBLE」が
   設定されていなかっただけでした。
   一応設定内容を合わせてみたのですが治りませんでした。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

逆に問題のプログラムの方でリビルドが通って動作に影響ないように
気をつけながらプログラムを少しずつコメントアウトしていって
何処までコメントアウトしたら現象が起こらなくなるかとか
そういう調べ方もあると思います。

内部設定とかではなくてプログラムコードで何かしていて
壊しているとか無いでしょうか?
テスト用のプログラムの方では起きなかったのであれば、
問題のプログラムにまずい部分があるはずなので
テスト用のプログラムとの差をソースコードも含めて
徹底的に調べないといけないと思います。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

ちょっと思い出したんですが、
以前にVisualStudioのリソースエディターに不具合があって
一度拡張スタイルを設定するとそのスタイルを外しても
リソース上に残っている事があると言う物があったと思います。
対象にエディットコントロールが含まれるかどうかはわかりませんが、
テストプログラムと問題のプログラムのリソースファイルを
直接テキストエディタで参照して比べてみたら何かわかるかもしれません。


返信引用
タケシ
 タケシ
(@タケシ)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

PATIOさん回答有難うございます。

>以前にVisualStudioのリソースエディターに不具合があって・・・
 → 拡張スタイルに関してはデフォルトで用意されている「WS_EX_APPWINDOW」
   だけでしたので問題ありませんでした。

>プログラムを少しずつコメントアウトしていって・・・
 → これに関しては、コンストラクタ、OnInitDialogの処理全てを
   コメントアウトしても再現します。

やはり、画面自体作りなおしたほうがよいのでしょうか?
 


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

OnCtrlColor() で pDC->SetBkMode(TRANSPARENT) しているとか。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

問題のプログラムがどの程度の規模の物なのか分からないので
コンストラクタとOnInitDialogを全てコメントアウトしても再現すると
言われてもそれで十分な検証になっているのかが分からないです。

例えばの話ですが、問題のアプリケーション内の一見関係ないような
箇所の処理でメモリを破壊していたような場合にそのメモリ破壊によって
どんな現象が起こるかは予想できないです。
なにせ、メモリ上のどのあたりを壊しているか予想もつきませんから
表示がおかしくなる事もありえるでしょうし、突然プログラムが
異常終了するようなケースもあるでしょう。

dairygoodsさんが指摘されているケースも該当しないのであれば、
プログラム内でメモリ破壊が起こるような部分が無いかチェックした方が
良いのではないかと思います。

何にせよ、簡単なテストプログラムでは再現しないわけですから
問題のプログラムに不具合があると考えるべきではないかと思います。
画面の作り直しで回避するのでは原因は分からないままです。
できれば、原因を追究してすっきりした方が良いと思います。
それが次の同様のケースの防止に繋がりますし、同様のケースへの
対応手段の蓄積に繋がります。


返信引用
タケシ
 タケシ
(@タケシ)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

dairygoodsさん回答有難うございます。

>OnCtrlColor() で pDC->SetBkMode(TRANSPARENT) しているとか。
 → 正にその通りでした。
   試しに「pDC->SetBkMode(TRANSPARENT)」を消した状態で画面を動かすと
   文字化けが発生しなくなりました。
   バックグラウンドを描画しないという設定で、
   なぜ入力文字まで影響を受けるのでしょうか?

   とりあえず、処置内容に関しては、
    色の塗りつぶし処理を行う場合は「pDC->SetBkMode(TRANSPARENT)」
    色の塗りつぶし処理を行わない場合は「「pDC->SetBkMode(OPAQUE)」
   とするようにしました。

RAPTさん、いろはさん、PATIOさん、dairygoodsさん、
この問題に関してご助力頂きましてありがとうございました。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

文字化けなのではなくて背景描画をしないと前の描画が残ったままで
重ね書きみたいになるからじゃないですかねぇ。
なんにしても解決して何よりでした。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました