プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

C#でテキストボックスを、ReadOnlyで配置する際、
フォーカスが移るとカーソル(キャレット)が表示されてしまいます。

過去ログなどで調べた結果、WindowsAPIを使うしかないと
過去の情報にはあったのですが、この問題は.Netの最新の
4.5(?)現在でも、それに見合ったメソッドは実装されていませんか?

今でもまだ、APIを使用しなければ駄目でしょうか。

よろしくお願いします。

gooドクター

A 回答 (5件)

されていません。


無効であることと意味が異なりますので。

大体日本だと、こういうのがありますよね。
 ・Enabled=falseでいいじゃん
  ⇒背景色、文字色が濃くなって、見辛いのでNG

 ・ReadOnly=true、TabStop=falseでいいじゃん
  ⇒背景色変わってほしくない、マウスでフォーカスがあたるのでNG

 ・ラベルで表現すればいいじゃん
  ⇒情報のコピーを行うことができなくなるのでNG

よほど神経質でない限り、どちらかでいいのでしょうが、いちいちどうでもいい細かいところに
拘りたがります。
そういうの、ある特定条件下において入力可能/不可能が切り替わる時に、大変拘りだすと
思います。


結論は自作するしかありません。

WindowsAPIで実現する方法論は知りませんでしたが、私はOnReadOnlyChangedをオーバーライドして
コンポーネントを自作しましたよ。
加えて、ReadOnlyFocusApplyプロパティみたいなのを作って、trueならただのReadOnly状態、
falseならラベルで表現する、とかってしました。

先に記した状態3つがあるわけですが、ユーザーがどのレベルまで求めているのかによって
対応策が異なると思います。
⇒フォーカスが遷移しないのにWindowsの基本操作に従った手順でコピーは行いたいなんてのは
 ムリなので。

この回答への補足

回答、ありがとうございます。

そんな大したことを望んでいるわけではないのですが…。

要はReadOnlyであろうとなかろうと、『カーソルをみえなくできれば』
良いのでして。

極端な話思いついたのは、カーソルと背景色を同じにできれば
見えなくできると思っていたのですが、それらしいのもないみたいでした。

実際にカーソルが存在していてもいいんです。要は見た目に気づかなければ
良いのですが、そんな方法はありますでしょうか?

補足日時:2014/06/27 16:14
    • good
    • 0

>今でもまだ、APIを使用しなければ駄目でしょうか。


そもそも、「今でもまだ」とは、どういう意味でしょう


Readonly属性は、入力コントロールに対する変更を禁止にするだけの属性です
そして、入力コントロールなのですからキャレットが存在して当たり前です
キャレットの主な役割は、移動、変更、コピー&ペーストがあります
このうち、変更が禁止になっただけなので、移動とコピーのみが出来ますよ
という属性です

「今でもまだ」、まるでこの仕様が不具合で、まだ直っていないとでも
言いたそうですが、もともとがそういう仕様なのですから
今でもまだ、どころか、この先も変わる事は無いです

この回答への補足

回答、恐れ入ります。

決して不具合だとは思っていません。
要は、機能的にあろうとなかろうと、『キャレットを非表示にする』という
メソッドなりが追加されていてもおかしくないのではと思っただけです。

皆様の回答を見ていると、必要以上にこだわりのある
返答のように思えますが、私としては見えなくなってさえくれればいいわけで
当然そのようなメソッド、機能していても非表示にするとか、
キャレットと背景色を同じにするとか。

なので、非表示と無効というのを取り違えて回答するのはやめていただきたく存じます。

補足日時:2014/07/07 08:39
    • good
    • 0

>『できるようになったのかどうか』という内容に、『LAbelで代用しろ』とは、


> 意図そのものが違っているのでは?

そういう事であれば、できませんし将来的にもできるようにはならないと思います。
    • good
    • 1

> 実際にカーソルが存在していてもいいんです。

要は見た目に気づかなければ
> 良いのですが、そんな方法はありますでしょうか?

それは入力可能になる場合がある項目なのでしょうか?
そうでないならば、やはりラベルで代用することが最も簡単でしょう。
そもそもフォーカスが当たらなければ良いわけですから。

もしくは、一度フォーカスが当たってもいいなら、フォーカスが当たった瞬間に
form.ActiveControl=nullにするとか。
    • good
    • 1

「TeextBoxの内容を選択してクリップボードにコピー」という動作を許可する為にはReadOnlyでもキャレットが必要です。



ということで……ReadOnlyで配置する目的はなんでしょう?

Labelで配置ではダメなのでしょうか?
文字色や背景色まで変わってしまいますがEnabledプロパティで無効状態にしてしまう。というのもあるかも知れません。

この回答への補足

すみません。

せっかく回答いただけたのに、質問の意味がお分かりいただけてないようです。
『できるようになったのかどうか』という内容に、『LAbelで代用しろ』とは、
意図そのものが違っているのでは?

>「TeextBoxの内容を選択してクリップボードにコピー」という動作を許可する
ということを書いてはいないつもりですが、この文章はどこから出てきたのですか?

補足日時:2014/06/27 13:09
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング