トラックバーの使い方

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
ぼのぼの

トラックバーの使い方

#1 投稿記事 by ぼのぼの »

初心者です。

RADツールのトラックバーの使い方を教えて下さい。
ドラッグしたときに、どのようにイベントコーディングするのか
またどのようにその値を取得するのか HELP を見ても分かりませんでした。
ささら
記事: 7
登録日時: 2005年6月18日(土) 16:03

Re: トラックバーの使い方

#2 投稿記事 by ささら »

> ドラッグしたときに、どのようにイベントコーディングするのか
 トラックバーをドラッグさせると、親ウインドウには「xScroll」メッセージが送られます。
トラックバーが横に長い場合は「HScroll」が、縦に長い場合は「VScroll」が送られます。
 ただし、1ピクセルでも動くごとにメッセージが送られるので、イベント内で処理が重くならないようにする必要があります。

*余談ですが「xScroll」の説明はRADが登場した時から「スクロールバーが~」となっていますし、
添付されているヘルプでもコモンコントロール関係がフォローされていませんので分かりにくいですよね(^ ^;)
とりあえずRADの方は要望として書き込んでみます。
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

Re: トラックバーの使い方

#3 投稿記事 by tak »

> またどのようにその値を取得するのか HELP を見ても分かりませんでした。

ささらさんが解説してくださった上記のイベント処理にて、対象となるトラックバーに、SendMessage()を使用して TBM_GETPOSを送信します。関数の戻り値が現在の値となります。

なお、プロジェクトオプションで「コモン コントロールを使用する」にチェックを入れるのを忘れずに。
ささら
記事: 7
登録日時: 2005年6月18日(土) 16:03

Re: トラックバーの使い方

#4 投稿記事 by ささら »

> > またどのようにその値を取得するのか HELP を見ても分かりませんでした。
>
> ささらさんが解説してくださった上記のイベント処理にて、対象となるトラックバーに、SendMessage()を使用して TBM_GETPOSを送信します。関数の戻り値が現在の値となります。
>
> なお、プロジェクトオプションで「コモン コントロールを使用する」にチェックを入れるのを忘れずに。

スイマセン、takさん細かいフォロー有り難う御座いますn(_ _)n
ぼのぼの

ありがとうございます

#5 投稿記事 by ぼのぼの »

イベントコーディングのところはうまくいきました!!
Sub MainWnd_HScroll の中に、
適当なエディットボックスに、nPos の値を書き込ませたら、
ドラッグすると値が変わって感動でした!!
ただ、トラックバーは実は3つあって、どのトラックバーから
得られた値なのかがよく分からずいろいろ調べてみましたが
つまりました。

> 対象となるトラックバーに、SendMessage()を使用して TBM_GETPOSを送信します。

お返事いただいた部分のここがよく分かりませんでした。。。

Sub MainWnd_HScroll(nScrollCode As Long, nPos As Integer, hwndScrollBar As DWord)


End Sub

ここに書くのですよね。
トラックバーは3つあって、ID はそれぞれ
TrackBar1、TrackBar2、TrackBar3
となっているのですが、
どのようにSendMessage() 関数を利用すればよいのか
具体的にお教えいただけませんか?
また、SendMessage() 関数のHELP の中の

・メッセージの付加情報を指定します。意味はメッセージにより、異なります。
は、異なる内容はどこで調べればよいのでしょうか? ;_;


とても敷居が高い。
難しい。。。
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

Re: ありがとうございます

#6 投稿記事 by Sinryow »

ぼのぼの さんが書きました:ただ、トラックバーは実は3つあって、どのトラックバーから
得られた値なのかがよく分からずいろいろ調べてみましたが
つまりました。
先にウィンドウハンドルを取得しておき,その値と比較するのがよいでしょう。(下のコードを参照)
ぼのぼの さんが書きました:> 対象となるトラックバーに、SendMessage()を使用して TBM_GETPOSを送信します。

お返事いただいた部分のここがよく分かりませんでした。。。
TBM_GETPOSの解説(英語) ※日本版MSDNには,TBM_GETPOSの解説が載ってないです(核爆)
下の例では,"pos"という変数に現在の位置をセットしています。

コード: 全て選択

' トラックバー3つ(TrackBar1~TrackBar3)と,スタティックテキスト1つ(Static1)を
' RADで作っているものとする。

Dim Track[ELM(3)] As HWND

(中略)

Sub MainWnd_HScroll(nScrollCode As Long, nPos As Integer, hwndScrollBar As DWord)
	Dim i As Long, buf As String, pos As Long
	If hwndScrollBar<>NULL Then
		For i=1 To 3
			If Track[i-1]=hwndScrollBar Then
				pos=SendMessage(hwndScrollBar, TBM_GETPOS, 0, 0)
				buf="トラックバー"+Str$(i)+"が動きました。値は"+Str$(pos)+"です。"
				SetDlgItemText(hMainWnd, Static1, buf)
			End If
		Next
	End If
End Sub

Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
	Track[0]=GetDlgItem(hMainWnd, TrackBar1)
	Track[1]=GetDlgItem(hMainWnd, TrackBar2)
	Track[2]=GetDlgItem(hMainWnd, TrackBar3)
End Sub
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#7 投稿記事 by tak »

ぼのぼの さんが書きました:ただ、トラックバーは実は3つあって、どのトラックバーから
得られた値なのかがよく分からずいろいろ調べてみましたが
つまりました。
> 先にウィンドウハンドルを取得しておき,その値と比較するのがよいでしょう。

ほかにも、もう少し直感的にコントロールIDでSelect Caseする方法もあります。

コード: 全て選択

Dim tbID As Long
tbID = GetDlgCtrlID(hwndScrollBar)

Select Case tbID
	Case TrackBar1


	Case TrackBar2


	Case TrackBar3


End Select
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

#8 投稿記事 by Sinryow »

> ほかにも、もう少し直感的にコントロールIDでSelect Caseする方法もあります。
> Dim tbID As Long
> tbID = GetDlgCtrlID(hwndScrollBar)

私,そんな関数知りませんでしたので(^^;)
私が参考になりました(爆)。
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
ぼのぼの

出来ました!

#9 投稿記事 by ぼのぼの »

3つのトラックバーを利用して
RGB の色指定ができるようにしたかったのですが、
おかげさまで出来ました。


Sinryow さんのコードをそのまま利用して

Dim i As Long, pos As Long
If hwndScrollBar<>NULL Then
For i=1 To 3
If Track[i-1]=hwndScrollBar Then
pos=SendMessage(hwndScrollBar, TBM_GETPOS, 0, 0)
Select case i
Case 1
lineColorR=Int(pos*255/100)
Case 2
lineColorG=Int(pos*255/100)
Case 3
lineColorB=Int(pos*255/100)
End Select
End If
Next
End If

こんな感じにしました。
そのままですね。。。ごめんなさい。m(_ _)m

tak さんのコードだと、なぜか
ドラッグ終了したとき、(MouseUp?)
0 に戻ってしまいうまくいきませんでした。


でも、一歩前進して感無量です!!

みなさん本当にありがとうございました!!!

P.S もう1つ質問があるのですが、それは別立てします。。。
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#10 投稿記事 by tak »

> 3つのトラックバーを利用して
> RGB の色指定ができるようにしたかったのですが、
> おかげさまで出来ました。
>
>
> Sinryow さんのコードをそのまま利用して
> tak さんのコードだと、なぜか
> ドラッグ終了したとき、(MouseUp?)
> 0 に戻ってしまいうまくいきませんでした。

これは、現在値の取得に nPos を利用しているからだと思われます。
こちらでは、ドラッグが終了したときに nPos = 0 となってHScrollイベントが発生することが確認されました。
nPos を使わずに、必ず TBM_GETPOSメッセージを利用して値を取得すればこの問題を回避できます。

なお、Sinryowさんのコードで値が 0 にならなかったのは、nPos ではなく TBM_GETPOSメッセージを使って値を取得しているためです。
GetDlgCtrlID() や Select Case に本質的な問題があったわけではありません。
ぼのぼの

なるほど!

#11 投稿記事 by ぼのぼの »

>これは、現在値の取得に nPos を利用しているからだと思われます。
こちらでは、ドラッグが終了したときに nPos = 0 となってHScrollイベントが発生することが確認されました。
nPos を使わずに、必ず TBM_GETPOSメッセージを利用して値を取得すればこの問題を回避できます。

なお、Sinryowさんのコードで値が 0 にならなかったのは、nPos ではなく TBM_GETPOSメッセージを使って値を取得しているためです。
GetDlgCtrlID() や Select Case に本質的な問題があったわけではありません。

後学のために教えて下さい。
結局 nPos を利用すると、私が考えられるプログラムの中では
すべてこの
「ドラッグが終了したときにnPos = 0となってHScrollイベントが発生する」
がネックになってうまくいかなくなってしまうような気がするのですが、
nPos をそのまま利用しても問題がないような場面とはあるのでしょうか?
返信する