none
RichTextBoxのキャレットが非表示になる RRS feed

  • 質問

  • VC++ 2008 でRichTextBoxを使用した画面を作成しています。
    以下、作成手順です。

    1.新規フォームを作成
    2.RichTextBox、ボタン、ラベルの各コントロールを追加
    3.RichTextBoxのプロパティのTextに表示したい文字を記載

    この状態で実行すると、RichTextBoxに、上記3で設定した文字が表示され、キャレットも点滅表示します。

    しかし、RichTextBoxとは関係の無い、ボタン(クリックでラベルに文字を表示させる)をクリックすると、RichTextBox内のキャレットが消えてしまいます。
    今回の画面では、RichTextBoxのキャレットは表示したままとしたいのですが、ボタンをクリックすると消えてしまいます。

    色々と調べましたが、なぜボタンがクリックされると、RichTextBoxのキャレットが消えるのか分かりませんでした。


    解決法など、ご存知の方おられましたら、ご教授お願いします。


    2010年2月16日 8:32

回答

  • ボタンをクリックすることで、フォーカスがボタンへ移動するからじゃないですか。
    ボタンをリリースした時点で、再度RichTextBoxへフォーカスを再設定するしか手はないかと思いますが、そうしちゃうとTABキーなんかでフォーカスを移動すると面倒なことになりそうですね。
    2010年2月16日 9:11
  • 色々と調べましたが、なぜボタンがクリックされると、RichTextBoxのキャレットが消えるのか分かりませんでした。

    解決法など、ご存知の方おられましたら、ご教授お願いします。
    キャレット(カレット)は「キーボード入力フォーカス」を持つウインドウだけが表示するべきだあるという
    MSのガイドラインがあります。他のウインドウやコントロールをクリックするとそのウインドウ
    やコントロールに「キーボード入力フォーカス」が移動してしまう場合があります(ごく普通の動作です)。
    一般に、ガイドラインに沿ったコードになっている場合、「キーボード入力フォーカス」を失ったウインドウ
    (この場合RichTextBox)はキャレットを非表示にします。

    新しく「キーボード入力フォーカス」を取得した自アプリのコントロールが、特に「キーボード入力フォーカス」を
    必要としない場合(ボタン等)場合、あたらためてRichTextBoxにフォーカスを設定しなおしせば、見た目上は
    キャレットが表示されるかもしれません。

    .Netの場合、あんまり細かい制御を利かせるのはコスト的に意味がないので、
    細かいことは気にする必要の無いアプリケーションにのみ使用すべきです。
    2010年2月16日 9:23
  • Windowless Rich Editを使用すれば、CaretなどUIのCustomizeが可能です。

    ただし、習得すべき知識と実装量は大変多いため、
    勉強目的以外ではお勧めしません。

    逆に言えば、それだけ得られる知識は素晴らしく多いです。

    Windowless Rich Editは.NET(Forms Application)で用意されていないため、
    API/COMから始めることになります。

    その後、.NET(Designerも含め)で扱えるようにComponent Moduleにしていく作業になります。

    [Windowless Rich Edit Controls]
      http://msdn.microsoft.com/en-us/library/bb787609(VS.85).aspx

    或いは、小手先の技でFocus処理を行うというのもありますが、
    Controlの構成によっては、不都合が出てくるのでお勧めしません。
    2010年2月18日 17:58

すべての返信

  • ボタンをクリックすることで、フォーカスがボタンへ移動するからじゃないですか。
    ボタンをリリースした時点で、再度RichTextBoxへフォーカスを再設定するしか手はないかと思いますが、そうしちゃうとTABキーなんかでフォーカスを移動すると面倒なことになりそうですね。
    2010年2月16日 9:11
  • 色々と調べましたが、なぜボタンがクリックされると、RichTextBoxのキャレットが消えるのか分かりませんでした。

    解決法など、ご存知の方おられましたら、ご教授お願いします。
    キャレット(カレット)は「キーボード入力フォーカス」を持つウインドウだけが表示するべきだあるという
    MSのガイドラインがあります。他のウインドウやコントロールをクリックするとそのウインドウ
    やコントロールに「キーボード入力フォーカス」が移動してしまう場合があります(ごく普通の動作です)。
    一般に、ガイドラインに沿ったコードになっている場合、「キーボード入力フォーカス」を失ったウインドウ
    (この場合RichTextBox)はキャレットを非表示にします。

    新しく「キーボード入力フォーカス」を取得した自アプリのコントロールが、特に「キーボード入力フォーカス」を
    必要としない場合(ボタン等)場合、あたらためてRichTextBoxにフォーカスを設定しなおしせば、見た目上は
    キャレットが表示されるかもしれません。

    .Netの場合、あんまり細かい制御を利かせるのはコスト的に意味がないので、
    細かいことは気にする必要の無いアプリケーションにのみ使用すべきです。
    2010年2月16日 9:23
  • Windowless Rich Editを使用すれば、CaretなどUIのCustomizeが可能です。

    ただし、習得すべき知識と実装量は大変多いため、
    勉強目的以外ではお勧めしません。

    逆に言えば、それだけ得られる知識は素晴らしく多いです。

    Windowless Rich Editは.NET(Forms Application)で用意されていないため、
    API/COMから始めることになります。

    その後、.NET(Designerも含め)で扱えるようにComponent Moduleにしていく作業になります。

    [Windowless Rich Edit Controls]
      http://msdn.microsoft.com/en-us/library/bb787609(VS.85).aspx

    或いは、小手先の技でFocus処理を行うというのもありますが、
    Controlの構成によっては、不都合が出てくるのでお勧めしません。
    2010年2月18日 17:58
  • こんにちは。フォーラムオペレーターの高橋春樹です。

    ふるかわあきひとさん、仲澤さん、kozzさん
    アドバイスの投稿、有難うございました。

    sunafukinさん
    MSDNフォーラムのご利用有難うございます。
    ふるかわあきひとさん、仲澤さん、kozzさんからアドバイスを頂いたと思うのですが、如何でしょうか?
    今回、皆様からのアドバイスが、有用な情報だと思いましたので、勝手ながら、回答マークを付けさせてもらいました。
    もし、疑問点がありましたら、皆様の投稿に返信して頂きたいと思います。

    尚、回答マークは問題解決を意味するものではないので、その他アドバイスがありましたら
    ご投稿の程、宜しくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2010年2月23日 2:50