• ベストアンサー

ちょっと質問を変えてみました。

以前にテキストエディタを作成して、問題が発生したと質問をしたものですが、内容を少し変えて質問をさせていただきます。 現在MDIでのテキストエディタを作成中なのですが、このソフトに文字列検索機能をつけたいと考えています。 そして自分で一応はプログラムが組めていますが、一箇所だけ理解不能な部分が現れました。 例えば、エディットコントロールに、「goo  goo  goo」とこのように記述されているとします。 そのときに文字列検索で「goo」と検索した場合、自分のプログラムでは3回「次を検索」のボタンを押すと「最後まで検索しました」とメッセージボックスで表示されました。 またどんな文字列がエディットコントロールに記述されたとしても、検索文字を発見された個数分検索を行い最後にメッセージボックスが表示されます。 よって動作としては完璧なのですが、表示に問題が発生しました。 「次を検索」のボタンを押しても、検索対象文字列(エディットコントロールに記述されている文字列)が選択状態にならないのです。 以下に選択状態にするためのプログラムを記述します。 (1)クライアントウィンドウ内でZオーダーがトップ(一番手前に表示されている)のドキュメントウィンドウハンドルを取得。 (2)そのドキュメントウィンドウの子ウィンドウにあたるエディットコントロールハンドルを取得。 (3)そのエディットコントロールハンドルに向けてSendMessage(エディットコントロールハンドル, EM_SETSEL, 検索された文字列の先頭位置, 検索された文字列の最後の位置); を行う。 この手順により検索された文字列を選択状態にしているのですが、表示としては選択状態になりません。何が間違えているのでしょう? ちなみに表示はされないだけで、何かしら選択状態にはなっているのか?と疑問を持ったため、上の手順の後に下のプログラムを記述してみました。 SendMesssage(エディットコントロールハンドル, EM_GETSEL, (WPARAM)&Start, (LPARAM)&End); このプログラムを実行した場合、上で一応選択状態にした文字列(ディスプレイ上では選択状態には見えない)の開始位置と終了位置が正確にStartとEndに格納されました。 EM_GETSELは現在選択されている文字列の開始位置と終了位置を取得するメッセージであるためエディットコントロール内の検索された文字列は選択状態になっているといえます。 しかしディスプレイ上では選択状態として表示がされません。なぜ表示されないのでしょう? ちょっと大雑把に説明してしまいましたが、質問があれば返信を行いますので、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.2

エディットコントロールに、「ES_NOHIDESEL スタイル」が設定されていなくて、 フォーカスが無い状態で選択されているように見えないとか・・・

noconan
質問者

お礼

返信ありがとうございました。 ご指摘されたとおりの問題でした。 スタイルの付け忘れでした・・・・・・・・・・ こんな初歩的なミスをする自分が情けないです・・・・・・・ これからもプログラムに励んでいきたいと思うので躓いたときなどはまたお世話になると思いますが、よろしくお願いします。

その他の回答 (1)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★エディットボックスの画面更新がされていないと思います。 ・エディットボックスに対して更新信号を出せば表示されるかな?  『InvalidateRect( hEditBox, NULL, TRUE );』としてみる。  hEditBox…エディットボックスのウインドウハンドル  これでどうなります。お試しあれ。 ・今回は自信ないです。参考に!

参考URL:
http://wisdom.sakura.ne.jp/system/winapi/win32/win35.html
noconan
質問者

お礼

返信ありがとうございました。 いつもお世話になっていますw 自分でもInvalidateRect関数を行い再描画要求を出してみたのですが、結果はやはり変わらなかったです。 何らかの問題があるから表示されないと思うのですが、ほんの些細な問題だと思うんですけど、些細だからこそ見つけにくいからプログラムは困りますw

関連するQ&A

  • エディットコントロールへの文字の出力について

    エディットコントロールへの文字の出力について ボタンコントロールを押すとそのイベントをつかんでエディットコントロールに、ある計算処理の結果を表示するプログラムをWINDOWSプログラミングで書いているのですが、ボタンを押すたびにエディットコントロールに書かれている内容が書き換わってしまいます。ボタンを押すたびにエディットコントロールに文字が追記されていくようにしたいのですが、分かる方どうか教えてください。 ちなみに現在はSetWindowText関数を使い出力している状態です。

  • Windowsプログラミングでのテキスト保存について

    Windowsプログラミングでのテキスト保存について エディットコントロールに入力された文字列を取得しGlobalAlloc関数などを使いメモリを確保し CreateFile関数、WriteFile関数を使ってテキストファイルを作成するプログラムを書いたのですが マルチバイト文字でコンパイルした場合とUnicode文字でコンパイルした場合とでファイルの中身の 表示結果が異なってしまいます。 例えば ナンバーは 12 34 56 78 です。 日付 00/00 00:00:00(改行)←1行目 ナンバーは 34 56 78 90 です。 日付 00/00 00:00:00(改行)←2行目 とエディットコントロールに入力されていたものをテキストファイルに書き込むと、 Unicode文字でコンパイルしたプログラムの場合 ナンバーは 12 34 56 78 です(改行)などと途中までしか書き込まれていなかったり あるいは2行中初めの1行しか書き込まれていなかったりします。 このプログラムをマルチバイト文字でコンパイルするとエディットコントロールに入力されたとおりに ファイルに書き込まれるようです。コンパイル時どちらも構文エラーはでません。 自分なりに文字の取得方法やメモリ関係やワイド文字関連の事情などをいろいろ試してみたのですが、いまだに解決していません。分かる人がいましたらどうか教えてください。お願いします。 ちなみにエディットコントロールは複数行入力スタイルでEM_SETSEL、EM_REPLACESELで追記されていく、出力のみ可能という設定です。

  • EM_GETSELメッセージについて。

    質問タイトルのようにEM_GETSELメッセージについての質問です。 カーソルで選択されている文字列の最初の位置と最後の位置を調査するため SendMessage(hEdit, EM_GETSEL, (WPARAM)&Start, (LPARAM)&End); このように記述しました。 ここで、例えば検索文字列内にカーソルのついた文字列がない場合にはStart、Endの値は何が格納されるのでしょう? 初期値を指定した場合はその値のままなのでしょうか? それとも見つからない場合は何か返り値が発生するのでしょうか? ご教授よろしくお願いします。

  • javaプログラムから他のjavaプログラムを操作

    javaのプログラムから他のjavaプログラムを操作するにはどのようにすればいいのでしょうか? 他の方が作った既存のjavaプログラムのウィンドウ内のリストビューの項目を自動的に選択したり、エディットビューの表示文字列をクリップボードにコピーしたいと思っています。 Windowsネイティブプログラムから他のWindowsネイティブプログラムを操作する場合は、FindWindowで親ウィンドウのウィンドウハンドルを取得し、そこからFindWindowExで子ウィンドウのハンドルを取得してサブクラス化するそうですが、javaではどうやるのかが知りたいです。 また、子ウィンドウのハンドルを得るために子ウィンドウを特定するための情報(Windowsネイティブプログラムなら、FindWindowExに引数として渡す「GetClassNameで得られるクラス名」)はどのようにすれば調べられるのでしょうか(EnumChildWindows、GetClassNameなどに該当するメンバ関数はあるのでしょうか)?

    • ベストアンサー
    • Java
  • ExcelVBAでAPIを使って外部ウインドウのエディットテキストを取得する方法

    ●やりたいこと ExcelVBAで、APIを実行し、外部ソフトのウィンドウに含まれている エディットテキストを取得して、セルに出力したい 使用する関数・宣言、できればコードを教えていただけませんでしょうか。 イメージはこちらをご参考いただけると幸いです。 ​http://situmon-img.blogspot.com/2008/08/1.html​ 変数hwindowに親ウィンドウのハンドルが取得されています。 エディットボックスのハンドル、IDは分かりません。 エディットボックスのハンドルを取得し、 分かっているクラス・ハンドルの文字列を取得 といった流れになるのではと思っております。 変数にさえ文字列が取得できれば、 当然ですが、Range("B2")=変数 で大丈夫です。 変数は、ひとつを使いまわしで構いません。 変数をエディットテキストの数だけ用意しても構いません。

  • エディットボックスのカーソル取得方法

    複数のエディットボックスがあり、マウスで選択したエディットボックスに文字列を表示させたいのですが、うまくいきません。使用ツールはVC++です。

  • エディットボックスで改行

    お世話になっております。 VC++でプログラムを組んでおり、下記の要領でエディットボックスに文字を表示しています。 _itoa(inputData[i], receivedChar, 16 );//数値を文字列に変換 SetDlgItemText(argThr1->hWnd, IDC_EDIT2, receivedChar); このとき、エディットボックス内で、任意の位置で改行しながら表示する方法はありますでしょうか? よろしくお願い致します。 表示例 ABC(改行) DEF(改行)

  • C言語に関する質問

    C言語を独学で学んでいる者です。 配列に10桁の文字を格納して、そこから任意の1文字を探し出す(何番目に何の文字があると表示する)プログラムを作ってみたいのですが、どのように記述したらよいか分かりません。特に、10桁の文字列に同じ文字が複数含まれる場合は完全にどうしたら良いのかわからない状態です。 お分かりの方は、ぜひご教授願います。

  • 他アプリの処理を待つには

    VisualBasic2008expressを使っています。 VBで作ったプログラムからインターネットエクスプローラーの検索ボックスのハンドルを取得し、文字列を送信、実行して検索結果を表示した後、また新しい文字列の送信と検索実行を繰り返すプログラムを作ろうとしています。検索を繰り返させるまではできました。 しかし、文字列の送信と検索を実行した後にsleep()を入れているのですが、これだと検索の更新処理の途中で新しい検索をしてしまうので検索結果の表示まで処理されない場合が出てしまいます。 他アプリケーションの更新処理が終わるまで待ち、結果が表示されたらまた新しく文字列の送信と検索実行を繰り返すということができるでしょうか。

  • Win32 API エディットボックス内文字列の色変更

    Win32 APIについて質問です。 (Microsoft Visual Studio .NET 2002、XP、API) エディットコントロールに表示されている文字列の 色(またはフォント)を変更したいと思っています。 エディットボックスに「0」という数字を入力し その後「更新ボタン」をクリックすると、「0」の 文字色が赤色(または赤太文字)へ変更される という具合です。 Win32 APIを始めて間もない者(Cも始めて間もないです) なので、かなり苦戦しております。 「SendMessage() 」みたいな関数を使用しエディット ボックスのハンドルへメッセージを送ることで 実現させるのかなぁ程度しか理解しておりません。 ご存じの方すいませんがよろしくお願いします。

専門家に質問してみよう