水平スクロールができない

このQ&Aのポイント
  • リストボックスで水平スクロールバーを表示できない状態になっています。TextOutの結果は256です。
  • 垂直スクロールバーは表示されていますが、水平スクロールバーが表示されず、文字列の水平方向のオーバーフローを見ることができません。
  • 水平スクロールバーを表示するためには、リストボックスの幅を指定する必要があります。SendMessage関数を使用して、リストボックスの水平方向の幅を指定してください。
回答を見る
  • ベストアンサー

水平スクロールができない。

hLB=CreateWindow ("LISTBOX",NULL,WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL|LBS_MULTIPLESEL,0,0,400,400,hW,NULL,hI,NULL); SendMessage(hLB,LB_SETHORIZONTALEXTENT,256,0); i=(int)SendMessage(hLB,LB_GETHORIZONTALEXTENT ,0,0); TextOut(hD,300,0,s,strlen(itoa(i,s,10))); (ただしchar s[99];と宣言されている) として200文字の文字列を200個リストボックスに格納すると 垂直スクロールバーはできるのですが水平スクロールバーができず水平方向にオーバーフローした文字を見るためのスクロールもできません。 しかしTextOutの結果は256になります。 どうすれば水平スクロールバーを出すことができ水平スクロールできるようになるのでしょうか。

  • keyguy
  • お礼率68% (895/1314)

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

あれ?正しく幅を設定すればスクロールバー消えるはずですけど。 消えないように(不要なときは使用不可)するには LBS_DISABLENOSCROLLを指定する必要があります。 なんで、長さの計算が合っていないのでは? 固定値を入力するのではなく、ちゃんとGetTextExtentPoint等を使ってデバイスコンテキストから 必要なピクセル数求めないとダメですよ。

keyguy
質問者

お礼

やっぱりおおちゃくは駄目ですね。 すべての項目文字の幅のなかの最大値を求めてそれで幅を設定しなければならないのですね。 リストコントロールがやってくれたらというのは贅沢ですね。 ありがとうございました。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

LB_SETHORIZONTALEXTENTは、ピクセル数を指定します。 ソースで256と指定しているので、256ピクセル分しかリストの幅はないということになるので、256ピクセルより幅が広い場合はスクロールバーは出ません。 文字数ではないところに注意してください。

参考URL:
http://www.microsoft.com/japan/developer/library/vcmfc/_mfc_clistbox.3a3a.sethorizontalextent.htm
keyguy
質問者

お礼

ありがとうございました。解決しました。 SendMessage(hLB,LB_SETHORIZONTALEXTENT,16384,0); とすれば動きました。 どうも符号付き2バイト整数のようで32768以上を設定すると駄目みたいですが余り大きく設定するとスクロール範囲が広がりすぎ利用しない方がましになってしまいます。 データ数が少なく垂直スクロールする必要が無いときには自動的に垂直スクロールバーが消えるのですが 文字列の長さが短くて水平スクロールする必要が無いときでも指定した長さ用の水平スクロールバーがでてしまします。 垂直スクロールバーと違って水平スクロールバーは自分で長さに応じて設定するしか仕方がないのでしょうか? 自動的に消えたり長さが自動的に合わされるような設定はないものでしょうか?

関連するQ&A

  • 次のようにEditを作成し

    hE=CreateWindow ("EDIT",NULL,WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_AUTOVSCROLL|WS_VSCROLL|WS_BORDER,0,0,0,0,hWmain,HMENU(IDE),hInst,NULL); 使っていますが SetWindowTextでhEの大容量の文字列を送ったのですが 表示させているエディット画面の下に表示画面一行目が最初から何行目にあるか表示させようと思っています どんなメッセージをそれを送れば取得できるでしょうか? 例えばListでいえば i=(int)SendMessage(hL,LB_GETTOPINDEX,0,0); のようなものを知りたいのです

  • テキストエディタならばCreateWindow

    を使って hEdit = CreateWindow("EDIT",NULL,WS_CHILD| WS_VISIBLE|ES_WANTRETURN|ES_MULTILINE| ES_AUTOVSCROLL|WS_VSCROLL|ES_AUTOHSCROLL| WS_HSCROLL, 0,0,rc.right,rc.bottom,hWnd,(HMENU)ID_EDIT, hInst,NULL); として char Str[1048576]にテキストをおさめ SetWindowText(hEdit,Str); とすればスクロール関数も使う必要なくカレットもでて文字を簡単に編集できるのですが テキストビューワならば文字を変更する必要が無くカレットもでると困るのでこれが使えません また↓や↑で1行スクロールしないといけません (エディタの場合はカレットが上下端にきたときにスクロールだからちょっと違う) DrawTextだとスクロール関数を使わないといけないような気がするし・・・ 見るだけのテキストビューワを作るのに適した方法やC言語SDK関数を教えてください

  • 1つのウィンドウに2つのエディット

    case WM_CREATE:  GetClientRect(hWnd, &rc);  EditL = CreateWindow(  TEXT("EDIT") , NULL ,  WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |  ES_AUTOHSCROLL | ES_AUTOVSCROLL |  ES_LEFT | ES_MULTILINE ,  0 , 0 , rc.right / 2 , rc.bottom , hWnd , (HMENU)1 ,  ((LPCREATESTRUCT)(lParam))->hInstance , NULL);  EditR = CreateWindow(  TEXT("EDIT") , NULL ,  WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |  ES_AUTOHSCROLL | ES_AUTOVSCROLL |  ES_LEFT | ES_MULTILINE ,  rc.left / 2 , 0 , rc.right , rc.bottom , hWnd , (HMENU)2 ,  ((LPCREATESTRUCT)(lParam))->hInstance , NULL);  return FALSE; とすると、1つのエディットしか表示されません。 また、 case WM_SIZE:  GetClientRect(edit, &rc); MoveWindow(edit, rc.left, rc.top, rc.right, rc.bottom, TRUE); として、ウィンドウサイズが変更された時に どちらのエディットもクライアント領域にあわせたつもりなのですが、 サイズ変更で左側のエディットがスクロールバーの幅の分だけ 縮小されてしまいます。 どこをどのように直したらよろしいのでしょうか? 宜しくお願いします。 #Win98 & VC++6.0 & SDK で作成しています。

  • ListBoxコントロール

    hLB1=CreateWindow ("LISTBOX","",WS_CHILD|WS_VISIBLE|LBS_STANDARD, 0,0,300,150,hwnd,(HMENU)1,cs->hInstance,NULL); hLB2=CreateWindow ("LISTBOX","",WS_CHILD|WS_VISIBLE|LBS_STANDARD, 0,160,300,150,hwnd,(HMENU)2,cs->hInstance,NULL); という風に2つのListBoxコントロールを作っているサンプルを見たのですが (HMENU)1と(HMENU)2のところをともにNULLにしたら問題なのでしょうか。

  • C#:ListViewでのスクロールイベントの取得について

    .Net2003 C# にてアプリを作成しています。 .Netを始めて初心者です。(プログラミング経験も浅いです) ListView1とListView2を作成して、 ListView2がスクロールしたら、ListView1も同じくスクロールさせる と言ったListViewのスクロールの同期化処理を行いたいのですが、 ソースコードが思いつきません。 ListViewのイベント、プロパティにはスクロール情報を取得するモノが みつかりませんでした。 現在は下記サイトを参考にさせて頂き、スクロールイベントの発生をキャッチする所までは なんとかたどり着いたのですが、ここからどうやって ListView1にスクロール同期化をさせるコードを書いていいのかが 思いつきません。 何か参考になるHPや、コードがありましたら教えてください。 http://dobon.net/vb/dotnet/control/firescrollevent.html から以下コードを参考にしました。 protected override void WndProc(ref Message m) { const int WM_HSCROLL = 0x114; const int WM_VSCROLL = 0x115; switch (m.Msg) { case WM_HSCROLL: Console.WriteLine( "水平スクロールバーがスクロールされました。"); break; case WM_VSCROLL: Console.WriteLine( "垂直スクロールバーがスクロールされました。"); break; } base.WndProc(ref m); }

  • ExcelVBAで他のアプリをスクロールさせたい

    エクセルVBAから 他のアプリのスクロールバーを操作して、指定範囲で画面スクロールしたいと思っています。 キー入力では操作出来ない(マウス操作でのみスクロールされる)アプリなので、 Sendkeysは使えないのではないかと思い、 APIでハンドルを取得して、 SendMessageすればできるかなと思いましたが、APIについてよく分からないので、 とりあえず、メモ帳で以下を作成してみました。しかし、スクロールされません。 どこがいけないのか教えていただけないでしょうか? よろしくお願いします。 *************** Public Declare Function FindWindowA Lib "User32" (ByVal cnm As String, ByVal cap As String) As Long Public Declare Function SendMessage Lib "User32" Alias "SendMessageA" _ (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const WM_VSCROLL = &H115 Public Const WM_HSCROLL = &H114 Public Const SB_TOP = &H6& Public Const SB_BOTTOM = &H7& Sub handle_get()  Dim Handle As Long  Dim Ap1 As String  Ap1 = "a.txt - メモ帳"  AppActivate Ap1  Handle = FindWindowA(vbNullString, Ap1)  SendMessage Handle, WM_VSCROLL, SB_BOTTOM, ByVal CLng(0)  SendMessage Handle, WM_HSCROLL, SB_TOP, ByVal CLng(0) End Sub ***************

  • VBA:水平スクロールバーが要らない!

    XP&Excel2000でVBAを組んでいるビギナーです。 その中でリストボックスを入れたいのですが、例えば、 4文字程度のテキストしかリストになく、 リストボックスの幅は十分それ以上のスペースがあるのに、 走らせてみると水平スクロールバーが表示されており、 additemで“テキスト”と追加したはずのデータが、まるで“  テキスト  ”と前後に余計なスペースが混じっているような感じになってしまいます。 これは一体何が原因でしょうか? また、リストボックスにはスクロールバーに関するプロパティが見当たりませんが、そもそもスクロールバーを直接設定することはできないのでしょうか? よろしくお願いいたします。

  • CreateWindowについて

    hE=CreateWindow("EDIT",NULL,WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_AUTOVSCROLL|WS_VSCROLL|ES_READONLY,0,0,100,100,hW,(HMENU)ID_EDIT,hI,NULL); のようにES_READONLYを入れるとエジットコントロールの背面が灰色になってしまうのですがES_READONLYを入れる前のように背面を白いままにしたいのですが何か方法はありませんか。

  • ScrollBarコントロール

    hSB=CreateWindow ("SCROLLBAR","",WS_CHILD|WS_VISIBLE|SB_CTL,0,0,600,20,hW,NULL,hI,NULL); としてhWにスクロールバーを付けたのですが つまみをドラッグ移動しても離すとすぐにはじめの位置に引き戻されます。 hSBのウィンドウ処理関数を記述することなくつまみをドラッグ移動した後に離したときその位置につまみがとどまるようにすることはできるのでしょうか?

  • TreeViewのスクロール制御

    VB6でTreeViewコントロールのスクロールをプログラム側から制御する物を作っているのですが分からなくて困っています。 TreeViewでNodeが増えれば自動的に表示されるスクロールバーは表示をしないように「Scrollプロバティ」にFalseを入力してSendMessageで下記の方法で行ったのですがスクロールしません。 Private Sub Command1_Click() Call SendMessage(TreeView1.hwnd, WM_VSCROLL, MAKEWPARAM(SB_THUMBPOSITION, sPos), 0) End Sub Private Function MAKEWPARAM(LOWWORD As Long, HIWORD As Long) As Long MAKEWPARAM = (LOWWORD And &HFFFF&) Or (HIWORD * &H10000) End Function 「Scrollプロパティ」にTrueを設定すると問題なくできるのですが、どなたか分かる方がいましたら宜しくお願い致します。