リストボックスの横スクロールバーを自動的に右端移動するには?

解決


Pretzel  2005-11-29 22:59:47  No: 92991

はじめまして。

VisualBasic 6.0, Windows2000 の環境で開発をしております。
あるフォームにリストボックスを貼り付け、SendMessageByNumを使って
リストボックスの横幅を越えた内容について、横スクロールバーを表示して
表示できるようにしました。

ここで表題の問題なのですが、横スクロールバーを表示した文字の右端位置まで
自動的に移動する手段をお伺いしたいのです。
色々なサイトを巡ってみたのですが、いまいち分からず・・・

皆さんのお知恵を拝借したいと思います。よろしくお願いします。


名無し  2005-11-29 23:03:57  No: 92992

単なるVBのスクロールバーならValueをMax値にするだけだけど。


Pretzel  2005-11-29 23:09:13  No: 92993

Value値というのは、SendMessageByNumの引数ですか?

うろ覚えながらVB.netでは、リストボックスに横スクロールバーの
設定をするプロパティが、標準でついているそうですが
VB6.0ではリストボックスに、横スクロールバーのプロパティがついていません。
ですので、SendMessageByNumを使い、表示領域に合わせた形にしなくてはならず・・・


魔界の仮面弁士  2005-11-30 00:49:06  No: 92994

SendMessageByNum という API は存在しません…。
おそらく、SendMessageA につけた別名(Alias)なのでしょうね。

で、今回の場合、「LB_SETHORIZONTALEXTENTメッセージ」を送出する事を
指して、SendMessageByNum だと書かれているのだと思いますが、
もしもそうであれば、WM_HSCROLL と SB_THUMBPOSITION について
併せて送出すれば、スクロール制御も可能でしょう。


Pretzel  2005-11-30 01:03:00  No: 92995

> SendMessageByNum という API は存在しません…。

お恥ずかしい。その通りです。
とりあえずSendMessageAを再び使って、教えていただいた内容でいろいろ
やってみようと思います。(結果は後ほどm(__)m)

今回行おうと思っているのは、サーバとソケット通信を行い、
サーバの応答が送られてくると、それをリストボックスに表示するという機能です。

サーバは自身が考え中になると「**********」というように、アスタリスクを
連続送信してきて、処理がどれくらい進んでいるのかをこちらに通知してきます。
(実際にはアスタリスクは1つずつ送信されてきます)
それらをリストボックスにリアルタイムに表示するわけなのですが、
横幅の表示域を越えた場合、超えた分だけの横スクロールバー表示領域を確保し、
かつ、その横スクロールバーの一番右にツマミを持ってきたかったのです。

なかなかこれが難しく・・・


Pretzel  2005-11-30 02:27:40  No: 92996

結果、出来ました。

受信毎に以下のような内容を読んでいます。

    ---------- Declaration ----------

    Declare Function SendMessageByNum Lib "user32" _
                        Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
                        ByVal wParam As Long, ByVal lParam As Long) As Long

    Const WM_HSCROLL = &H114
    Const SB_LINELEFT = 0
    Const SB_LINERIGHT = 1
    Const SB_THUMBPOSITION = 4

    ---------- Procedure ----------

    With Form1.lstCmd
        For i = 0 To .ListCount - 1
            If lngWidth < Form1.TextWidth(.List(i) & " ") Then
                lngWidth = Form1.TextWidth(.List(i) & " ")
            End If
        Next
        If Form1.ScaleMode = vbTwips Then
            lngWidth = lngWidth \ Screen.TwipsPerPixelX
        End If
        '横スクロールバー表示
        Call SendMessageByNum(.hWnd, LB_SETHORIZONTALEXTENT, lngWidth, 0)
    
        lngScWidth = Form1.TextWidth(.List(.ListCount - 1) & " ") \ Screen.TwipsPerPixelX
        
        If lngScWidth > .Width \ Screen.TwipsPerPixelX Then
            Call SendMessageByNum(.hWnd, WM_HSCROLL, SB_LINERIGHT, 0)
        Else
            Call SendMessageByNum(.hWnd, WM_HSCROLL, SB_THUMBPOSITION, 0)
        End If
    End With

   ---------------------------------

あとは何とかなりそうです。
ありがとうございましたm(__)m


まるち  2005-11-30 18:57:30  No: 92997

http://forums.belution.com/ja/vb/000/014/36.shtml


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

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






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