• ベストアンサー

ScrollBarコントロール

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

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

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

  • ベストアンサー
noname#5537
noname#5537
回答No.4

> フォーカスがスクロールバーに行かないのですから当然 > スクロールバーの処理関数のところまでメッセージが届きません。 スクロールバーはフォーカスを受け取らないのが普通です。 フォーカス受け取るようにすることも出来ますが、 フォーカスがあたっていなくても、メッセージは送られてきます。 垂直スクロールバーなら WM_VSCROLL が、 水平スクロールバーなら WM_HSCROLL が、 スクロールバーの親ウィンドウに送られます。 そのあたりに間違いはないでしょうか? ところで、メッセージが来ないというのはどのように確認されましたか?

keyguy
質問者

補足

ありがとうございます。 てっききりスクロールバーにフォーカスがいきスクロールメッセージの処理をスクロールバーのウィンドウ処理関数にやらさないといけないと勘違いしていました。 (わざわざスクロールバーの処理関数を定義してしまった。) 「スクロールバーの親ウィンドウに送られます。」 だから 親ウィンドウにやらせばいいのですね。 そのようにしたらうまくいきました。 しかしSBS_HORZ(クリエイト関数に)とかSB_HORZ(位置の読みとり書き込み関数に)を使うと2つのスクロールバーが上下に並んででてしまいます。 上のバーのボタンでしたのつまみが動くような変な動作をします。 SB_CTLでは問題ないのですが・・・ 何か心当たりが有れば教えてください。

その他の回答 (4)

  • cherry3
  • ベストアンサー率39% (18/46)
回答No.5

#2です。 ちょっと自信ないですが、スクロールバーのレンジや位置を設定する際に SetScrollPos系の関数かSetScrollInfoを使っていると思いますが これらの第2引数にSB_CTLを指定していますか? スクロールバーのフラグはSB_CTLかSB_VERTかSB_HORZのどれかになりますが、 SB_CTRはスクロールバーを自分で作った場合に使います。 CreateWindow関数の親ウインドウのウィンドウスタイルに WS_VSCROLL, WS_HSCROLLを指定してを作った場合は それぞれSB_VERT, SB_HORZを選びます。

keyguy
質問者

お礼

SB_CTRはスクロールバーを自分で作った場合に使います。 まさに自分で作ったものです。 だからSB_CTRで動くのですね。 SetScrollPosにはSB_CTLや指摘のものをいろいろ試しました。 ちなみに親ウィンドウはWS_OVERLAPPEDWINDOWです。 とりあえず今は問題の起きていない方法でやってみます。 上下に連なってでてくる理由を知りたいけれどもマイクロソフトのバグかもしれないので知る必要がでるまでは触らぬ神にたたりなしのやり方でいきたいと思います。 ありがとうございます。

  • cherry3
  • ベストアンサー率39% (18/46)
回答No.3

補足ですが、スクロールバーのスタイルは、 SB_CTLではなくSBS_VERTかSBS_HORZで水平か垂直かを指定します。

keyguy
質問者

お礼

hS=CreateWindow ("SCROLLBAR","",WS_CHILD|WS_VISIBLE|SBS_HORZ,0,0,600,20,hW,(HMENU)99,hI,NULL); としてみたところ水平スクロールバーが2つ上下に隣接してできました。 hS=CreateWindow ("SCROLLBAR","",WS_CHILD|WS_VISIBLE|SB_CTL,0,0,600,20,hW,(HMENU)99,hI,NULL); とすれば1つしかでないので問題ないのですが・・・ なにか設定に間違いがあるのでしょうか?

keyguy
質問者

補足

ありがとうございます。 実は水平スクロールバーのウィンドウ処理関数を書いてしまったので少しがんばって動けば今回はこれで通そうと思っているのですがスクロールバーをクリックしてもスクロールバーにフォーカスが移動しません。 フォーカスがスクロールバーに行かないのですから当然スクロールバーの処理関数のところまでメッセージが届きません。 どうしたらいいのでしょうか?

  • cherry3
  • ベストアンサー率39% (18/46)
回答No.2

スライダーは別名トラックバーとも呼ばれていて トラックバーで検索すると参考ページが見つかりますよ。 一応参考URLを載せておきますね。 このページでは範囲選択のあるスライダーを使ってますが スタイルを変更することによって、範囲選択をなくすことも出来ます。 スクロールバーは、WM_VSCROLLかWM_HSCROLLの どちらかで処理するのは#1さんと同じですが、 その時にSetScrollInfo関数の方を使うとレンジに比例して つまみ部分が大きくなったり、自動で無効化されたりします。

参考URL:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_190.htm
noname#5537
noname#5537
回答No.1

> hSBのウィンドウ処理関数を記述することなくつまみを > ドラッグ移動した後に離したときその位置につまみが > とどまるようにすることはできるのでしょうか? 出来ないと思います。 WM_VSCROLL か WM_HSCROLL を処理して SetScrollPos でつまみの位置を設定してやる必要があります。 用途によっては、スライダーコントロールを使ってもいいかもしれませんね。 こちらの場合、メッセージを処理しなくてもつまみがとどまります。

keyguy
質問者

お礼

ありがとうございます。 スライダコントロールを調べてみます。

keyguy
質問者

補足

スライダコントロールの説明サイトが見つかりません。 もしスライダコントロールを説明しているサイトを知っていれば教えてください。

関連するQ&A

  • 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にしたら問題なのでしょうか。

  • リストコントロールの文字の大きさを可変に

    ハンドルがhWの主ウィンドウに hL=CreateWindow("LISTBOX",NULL,WS_CHILD|WS_VISIBLE,0,0,0,0,hW,HMENU(IDL),hI,0); でハンドルがhLのリストを配置して項目として "This is a pen." と "That is a book." を配置するときに文字の大きさをメインウィンドウのサイズの2倍にしたいのですがどのようにすればいいのでしょうか?

  • Windowハンドルを再利用できない

    hPushBox=CreateWindow("BUTTON","a",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,0,0,0,0,hW,HMENU(0), ((LPCREATESTRUCT)lP)->hInstance,NULL);DestroyWindow(hPushBox); hPushBox=CreateWindow("BUTTON","a",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,0,0,0,0,hW,HMENU(0), ((LPCREATESTRUCT)lP)->hInstance,NULL);DestroyWindow(hPushBox); Window処理関数で上記のようにするとコンパイルは通るのに実行がエラーになります 1度使ったハンドルをウィンドを破棄した後使えるようにするにはどうしたらいいのでしょうか?

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

    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になります。 どうすれば水平スクロールバーを出すことができ水平スクロールできるようになるのでしょうか。

  • コントロール内の文字の背景色

     hSWnd = CreateWindow("STATIC","あいう",WS_CHILD | WS_VISIBLE,               0,0,320,240,hWnd,NULL,hInst,NULL); に対して、  case WM_CTLCOLORSTATIC:      hBrush = CreateSolidBrush(RGB(0, 255, 0));      return (LRESULT)hBrush;  break; とすると、hSWnd は緑になるけど、hSWnd の あいう の文字の 背景色が白です。 その白の部分を赤にするソースを教えてください。

  • 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を入れる前のように背面を白いままにしたいのですが何か方法はありませんか。

  • CreateWindowでSTATICコントロールを使ってBITMAP表示する。

    WIN32、VC++2005にて開発中です。 CreateWindowでSTATICコントロールを使ってBITMAPを表示する方法が分からなくて困ってます。 ウィンドウプロシージャのWM_CREATEで、 下記の様に書いてみたんですがダメでした。 CreateWindowW(L"Static", L"***", WS_VISIBLE|WS_CHILD|SS_BITMAP,120, 3, 100, 45, hWnd, HMENU(-1), NULL, NULL); ビットマップはIDB_BITMAP1という名前で追加してリソースビューで確認しました。 CreateWindowで表示させたいんですがいい方法ありますか? 初心者でアホなんでなるべく解り易くお願いします。

  • c++ で web browser

    windows 7 32 vs c++ 2010 で web browser を作成しようとして躓いています windows xp 32 vs c++ 2010 で動いた 下記コードを 7 で実行すると CreateWindow されません。 ie_hWnd = CreateWindow("AtlAxWin", "Shell.Explorer.2", WS_CHILD | WS_VISIBLE, 0, 0, 500, 500, main_hWnd, NULL, GetModuleHandle(NULL), NULL); 何をどう変えれば 7 でも動くようになりますか? よろしくお願いします。

  • リストコントロールの文字の大きさ

    ハンドルがhWの主ウィンドウに hL=CreateWindow("LISTBOX",NULL,WS_CHILD|WS_VISIBLE,0,0,600,400,hW,HMENU(IDL),hI,0); でハンドルがhLのリストを配置して hF=CreateFont(36,(16,0,0,FW_NORMAL,FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,"MS Pゴシック"); SendMessage(hL,WM_SETFONT,(WPARAM)hF,1); として文字の大きさを2倍にしようとしたのですが リストコントロールは2倍になったと思って項目の間隔を文字が2倍であるかのように開くのですが肝心の文字が大きくなりません。 何が問題なのでしょうか?

  • staticコントロール

    CreateWindow( "static", // スタティックコントロールのクラス名 "text is here.", // 表示する文字列 SS_SIMPLE | WS_CHILD | WS_VISIBLE, // 詳細はあとで。 x, y, // 左上の座標 iWidth, iHeight, // 幅と高さ hParent, // 親ウインドウのウインドウハンドル NULL, // メニューハンドル。NULLでよい。 hInstance, // アプリケーションのインスタンスハンドル。 NULL // ウインドウ作成データ。NULLでよい ) ; のメッセージを処理したいのですが既成のwindowなのでどのようにウィンドウ処理関数を指定すればいいのかわかりません。 自分で登録した場合にはウィンドウ処理関数を指定できますが既成の場合どうするのでしょうか。