餃子を食べるとき、何をつけますか?

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

A 回答 (5件)

> フォーカスがスクロールバーに行かないのですから当然


> スクロールバーの処理関数のところまでメッセージが届きません。

スクロールバーはフォーカスを受け取らないのが普通です。
フォーカス受け取るようにすることも出来ますが、
フォーカスがあたっていなくても、メッセージは送られてきます。

垂直スクロールバーなら WM_VSCROLL が、
水平スクロールバーなら WM_HSCROLL が、
スクロールバーの親ウィンドウに送られます。
そのあたりに間違いはないでしょうか?

ところで、メッセージが来ないというのはどのように確認されましたか?

この回答への補足

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

補足日時:2003/06/07 01:16
    • good
    • 0

#2です。


ちょっと自信ないですが、スクロールバーのレンジや位置を設定する際に
SetScrollPos系の関数かSetScrollInfoを使っていると思いますが
これらの第2引数にSB_CTLを指定していますか?

スクロールバーのフラグはSB_CTLかSB_VERTかSB_HORZのどれかになりますが、
SB_CTRはスクロールバーを自分で作った場合に使います。
CreateWindow関数の親ウインドウのウィンドウスタイルに
WS_VSCROLL, WS_HSCROLLを指定してを作った場合は
それぞれSB_VERT, SB_HORZを選びます。
    • good
    • 0
この回答へのお礼

SB_CTRはスクロールバーを自分で作った場合に使います。
まさに自分で作ったものです。
だからSB_CTRで動くのですね。
SetScrollPosにはSB_CTLや指摘のものをいろいろ試しました。

ちなみに親ウィンドウはWS_OVERLAPPEDWINDOWです。

とりあえず今は問題の起きていない方法でやってみます。
上下に連なってでてくる理由を知りたいけれどもマイクロソフトのバグかもしれないので知る必要がでるまでは触らぬ神にたたりなしのやり方でいきたいと思います。

ありがとうございます。

お礼日時:2003/06/07 03:45

補足ですが、スクロールバーのスタイルは、


SB_CTLではなくSBS_VERTかSBS_HORZで水平か垂直かを指定します。

この回答への補足

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

補足日時:2003/06/06 22:32
    • good
    • 0
この回答へのお礼

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つしかでないので問題ないのですが・・・
なにか設定に間違いがあるのでしょうか?

お礼日時:2003/06/07 01:24

スライダーは別名トラックバーとも呼ばれていて


トラックバーで検索すると参考ページが見つかりますよ。
一応参考URLを載せておきますね。
このページでは範囲選択のあるスライダーを使ってますが
スタイルを変更することによって、範囲選択をなくすことも出来ます。

スクロールバーは、WM_VSCROLLかWM_HSCROLLの
どちらかで処理するのは#1さんと同じですが、
その時にSetScrollInfo関数の方を使うとレンジに比例して
つまみ部分が大きくなったり、自動で無効化されたりします。

参考URL:http://www.kumei.ne.jp/c_lang/sdk2/sdk_190.htm
    • good
    • 0

> hSBのウィンドウ処理関数を記述することなくつまみを


> ドラッグ移動した後に離したときその位置につまみが
> とどまるようにすることはできるのでしょうか?

出来ないと思います。
WM_VSCROLL か WM_HSCROLL を処理して SetScrollPos
でつまみの位置を設定してやる必要があります。

用途によっては、スライダーコントロールを使ってもいいかもしれませんね。
こちらの場合、メッセージを処理しなくてもつまみがとどまります。

この回答への補足

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

補足日時:2003/06/06 01:07
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/06/06 00:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報