• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:水平スクロールができない。)

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

taka_tetsuの回答

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

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

keyguy
質問者

お礼

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

関連する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を設定すると問題なくできるのですが、どなたか分かる方がいましたら宜しくお願い致します。