リッチテキストボックスのスクロールバーのみを有効にするには?

解決


けんと  2002-09-02 07:19:26  No: 76071

連続の質問で申し訳ありません。
テキストボックスや、リッチテキストボックスのEnabledプロパティは
Falseにすると、テキストボックス内が触れなくなるのはいいのですが、
スクロールバーまで無効になりますよね?
これを、スクロールバーだけを有効にする方法はないでしょうか?
よろしくお願いします。


oku  URL  2002-09-02 08:06:40  No: 76072

APIのSendMessageを使えば、テキストボックス内を
編集できないように出来るので、この方法が良いと思います。

'SendMessage=>メッセージをウインドウに送る

'<引数>
'hWnd:ウインドウのハンドル
'wMsg:定数(EM_××参照)
'wParam:パラメータ
'lParam:0

'<戻り値>
'余り使わない

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
                (ByVal hwnd As Long, _
                ByVal wMsg As Long, _
                ByVal wParam As Long, _
                lParam As Long) As Long

Const EM_SETREADONLY = &HCF    '読み込み専用にする

Private Sub Form_Load()
 'テキストボックスを編集できないようにする。
   Call SendMessage(Text1.hwnd, EM_SETREADONLY, -1, 0)
End Sub

ちなみに編集出来るように戻す場合は、
Private Sub Command1_Click()
'テキストボックスを編集できるようにする
   Call SendMessage(Text1.hwnd, EM_SETREADONLY, 0, 0)
End Sub

テキストボックスのEnabledは、TRUEのままで!


たかみちえ  URL  2002-09-02 08:09:12  No: 76073

うーん、ReadOnlyをTrue(プロパティ名違うかも?)で読み取り専用にして、
背景色を使用不可部分の色に変えて、
さらにこだわりたいなら、キャレット(文字入力用のカーソルのこと)が移動するごとに、
CreateCaretとShowCaretを使って、キャレットが表示されないようにする。

  これでどうでしょう?


たかみちえ  URL  2002-09-02 08:12:17  No: 76074

VBのリッチテキストボックスって、
読み取り専用にするプロパティがあったよね…?

  ごめんなさい、これまたあいまいです。
もしなければ、okuさんの方法で読み取り専用にしてください。

  それから、キャレットを隠すのは、HideCaretというAPIひとつでできるようですね^^;


けんと  2002-09-03 04:54:44  No: 76075

okuさん、たかみちえさんありがとうございます。
リッチテキストボックスってリードオンリーにするプロパティって
なかったと思うのですが・・・
で、okuさんに教えていただいたやり方でとりあえず、スクロールバーだけ
生かすことはできたのですが、キャレットは、色んなイベントが起こるたびに
HIDECARETで消さなければならないんでしょうか?
と、いいますか、キャレットが移動すること自体抑えたいんです。
移動することによって次に文字を表示する時に1回だけ表示されない現象が
起きてしまうので。なにか方法ありませんか?


たかみちえ  URL  2002-09-03 05:33:39  No: 76076

> なかったと思うのですが・・・
  なかったですか^^;ごめんなさい。
今Delphiを使ってるもので…。

  HideCaretは、
キャレット移動時に起こるイベントでやればいいでしょう。
ええと…。VBではなんと言う名前でしたでしょうか(-_-;)
SelectChangeとか、そういう名前だったと思いますが、それです。
エディタを作ったときに使った記憶があるので、
それは確実にあると思いますけど。

  少なくとも、Delphiではこれでキャレットが変形したりします。ええ。
自信・・・ありませんが(ーー;)

  もしEnabled状態をオンオフできる必要があるのなら、
if文で、ShowCaretとHideCaretを使い分けるようにしてください。
ifでHideCaretを使わないようにするだけでは、
オンにした直後、キャレットが見えなくなります。

  もしキャレットが見えようと見えまいと、
とにかくキーボードのカーソルキーで移動させたくないというのなら、
フォーカスがあたったときに、(フォーカスを)よそに飛ばしてしまえばいいでしょう。


けんと  2002-09-04 05:17:18  No: 76077

う〜ん・・・
結局、したいことは、キャレットを見えなくすることと、キャレットの移動
自体をできなくしたいんですよ。マウスでテキストボックス内をクリック
してしまえばキャレットが移動してしまうので、次の表示に支障が出てしまう
んです。フォーカスを飛ばしてしまうのはちょっとやりたくないんですけど
何かいい方法ありませんかね?
何度もすみません。


たかみちえ  URL  2002-09-04 07:29:34  No: 76078

ほかに方法は・・・ないような気がします。

  たぶん、何かメモのような感じで、はっておくつもりだと思いますけど、
そうすると、キャレットが移動できない(スクロールバーしか使えない)と、かえって不便なんじゃないでしょうか?

  キャレットが動かせれば、必要な部分をコピーして、別の場所に貼り付けたりできますし。
たとえメモでも、ホイールマウスやカーソルキーが使いたいよーという人もいると思います。
(わたしは、そうですね)

  それでも何なら、全部自前描画・・・でしょうか?
かえって難しい気がしますけど。

  そうそう、今思いついたんですけど、
IEコンポーネントを埋め込んで、HTMLを表示させてもいいですね。
res://〜と入れれば、リソースも読み出せるようだし。

もちろん、IEがないと使えなくなりますし、重くなりますが。


けんと  2002-09-06 04:40:10  No: 76079

いろいろありがとうございます。
今作ってるのは、ソケット通信で受信した内容を箇条書き風に表示
させるもので、ただ見れればそれでいいものですから、キャレットは
出てくれると逆に困ってしまうんです。スクロールバーさえ使えれば
それでいいんで。
自分はまだまだVB初心者なので、これからもいろいろ勉強していきます。
まだうかがうこともあるかと思いますがその節はよろしくお願いします。


たかみちえ  URL  2002-09-06 09:06:18  No: 76080

そうだったんですか。
でも、それならやっぱり、キャレットは表示されないけど、
カーソルキーで移動はできるでいいと思いますよ。
わたしはログを見るのだって、キーボードを使いますから。

  ところでログだったら、最初から書き換えのできないListBoxなどでもよかったんじゃ…?
(それではフォーカスの線がでますけど、そのあたりの自前描画は、テキストボックスよりずっと簡単だと思います)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加