- ベストアンサー
ちょっと質問を変えてみました。
以前にテキストエディタを作成して、問題が発生したと質問をしたものですが、内容を少し変えて質問をさせていただきます。 現在MDIでのテキストエディタを作成中なのですが、このソフトに文字列検索機能をつけたいと考えています。 そして自分で一応はプログラムが組めていますが、一箇所だけ理解不能な部分が現れました。 例えば、エディットコントロールに、「goo goo goo」とこのように記述されているとします。 そのときに文字列検索で「goo」と検索した場合、自分のプログラムでは3回「次を検索」のボタンを押すと「最後まで検索しました」とメッセージボックスで表示されました。 またどんな文字列がエディットコントロールに記述されたとしても、検索文字を発見された個数分検索を行い最後にメッセージボックスが表示されます。 よって動作としては完璧なのですが、表示に問題が発生しました。 「次を検索」のボタンを押しても、検索対象文字列(エディットコントロールに記述されている文字列)が選択状態にならないのです。 以下に選択状態にするためのプログラムを記述します。 (1)クライアントウィンドウ内でZオーダーがトップ(一番手前に表示されている)のドキュメントウィンドウハンドルを取得。 (2)そのドキュメントウィンドウの子ウィンドウにあたるエディットコントロールハンドルを取得。 (3)そのエディットコントロールハンドルに向けてSendMessage(エディットコントロールハンドル, EM_SETSEL, 検索された文字列の先頭位置, 検索された文字列の最後の位置); を行う。 この手順により検索された文字列を選択状態にしているのですが、表示としては選択状態になりません。何が間違えているのでしょう? ちなみに表示はされないだけで、何かしら選択状態にはなっているのか?と疑問を持ったため、上の手順の後に下のプログラムを記述してみました。 SendMesssage(エディットコントロールハンドル, EM_GETSEL, (WPARAM)&Start, (LPARAM)&End); このプログラムを実行した場合、上で一応選択状態にした文字列(ディスプレイ上では選択状態には見えない)の開始位置と終了位置が正確にStartとEndに格納されました。 EM_GETSELは現在選択されている文字列の開始位置と終了位置を取得するメッセージであるためエディットコントロール内の検索された文字列は選択状態になっているといえます。 しかしディスプレイ上では選択状態として表示がされません。なぜ表示されないのでしょう? ちょっと大雑把に説明してしまいましたが、質問があれば返信を行いますので、よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
エディットコントロールに、「ES_NOHIDESEL スタイル」が設定されていなくて、 フォーカスが無い状態で選択されているように見えないとか・・・
その他の回答 (1)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★エディットボックスの画面更新がされていないと思います。 ・エディットボックスに対して更新信号を出せば表示されるかな? 『InvalidateRect( hEditBox, NULL, TRUE );』としてみる。 hEditBox…エディットボックスのウインドウハンドル これでどうなります。お試しあれ。 ・今回は自信ないです。参考に!
お礼
返信ありがとうございました。 いつもお世話になっていますw 自分でもInvalidateRect関数を行い再描画要求を出してみたのですが、結果はやはり変わらなかったです。 何らかの問題があるから表示されないと思うのですが、ほんの些細な問題だと思うんですけど、些細だからこそ見つけにくいからプログラムは困りますw
お礼
返信ありがとうございました。 ご指摘されたとおりの問題でした。 スタイルの付け忘れでした・・・・・・・・・・ こんな初歩的なミスをする自分が情けないです・・・・・・・ これからもプログラムに励んでいきたいと思うので躓いたときなどはまたお世話になると思いますが、よろしくお願いします。