C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ホイールでタブを回したい


(過去ログ 138 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■81144 / inTopicNo.1)  ホイールでタブを回したい
  
□投稿者/ するめ (1回)-(2016/08/30(Tue) 22:24:41)

分類:[.NET 全般] 



タブコントロールの上でホイールを回すことで
タブを移動できるようにしたいのですが

Private Sub TabControl1_MouseWheel(ByVal sender As Object, ByVal e As MouseEventArgs) Handles TabControl1.MouseWheel

With TabControl1

If e.Delta > 0 Then
.SelectedIndex += 1
Else
If .SelectedIndex > 0 Then .SelectedIndex -= 1
End If

End With

End Sub

のコードでできました。

しかしこの方法だとタブコントロール上部のタブの部分だけでなく
タブページの中でホイールを回したとしても
ページが移動してしまいます。
タブの部分でだけ有効にするにはどうしたら良いですか?




引用返信 編集キー/
■81150 / inTopicNo.2)  Re[1]: ホイールでタブを回したい
□投稿者/ 真田昌幸 (65回)-(2016/08/31(Wed) 09:20:06)
No81144 (するめ さん) に返信
>
>
> タブコントロールの上でホイールを回すことで
> タブを移動できるようにしたいのですが
>
> Private Sub TabControl1_MouseWheel(ByVal sender As Object, ByVal e As MouseEventArgs) Handles TabControl1.MouseWheel
>
> With TabControl1
>
> If e.Delta > 0 Then
> .SelectedIndex += 1
> Else
> If .SelectedIndex > 0 Then .SelectedIndex -= 1
> End If
>
> End With
>
> End Sub
>
> のコードでできました。
>
> しかしこの方法だとタブコントロール上部のタブの部分だけでなく
> タブページの中でホイールを回したとしても
> ページが移動してしまいます。
> タブの部分でだけ有効にするにはどうしたら良いですか?

senderをコントロール型にキャストして、
コントロールタイプがタブ以外だったらExitもしくはRiturnとしてみては?

引用返信 編集キー/
■81154 / inTopicNo.3)  Re[1]: ホイールでタブを回したい
□投稿者/ 魔界の仮面弁士 (857回)-(2016/08/31(Wed) 10:11:49)
No81144 (するめ さん) に返信
> タブの部分でだけ有効にするにはどうしたら良いですか?

こんな感じですね。
TabControl の Alignment が Top 以外であっても対応できます。

垂直スクロールを持つコントロール(ListBox 等)がアクティブな場合、
TabControl に MouseWheel が通知されないので御注意あれ。


Dim tc = DirectCast(sender, TabControl)
If Enumerable.Range(0, tc.TabCount).Where(Function(i) _
 tc.GetTabRect(i).Contains(e.Location)).Any() Then

  If e.Delta > 0 Then
    tc.SelectedIndex += 1
  ElseIf tc.SelectedIndex > 0 Then
    tc.SelectedIndex -= 1
  End If

End If


なお、本当に「タブの上」で無いと反応しませんので、
MultiLine は False にしておくことをお奨めします。


MultiLine が True の場合、下記の図で言えば
★ 部分だけでなく、☆部分でも反応しないため、
前方回転で切り替えた後で、
後方回転で戻せないといった事象が起こりえます。


┌────┐
│TabPage4│☆☆☆☆☆☆☆☆☆☆☆
┌────┏━━━━┓────┐☆
│TabPage1┃TabPage2┃TabPage3│☆
┏━━━━┛    ┗━━━━━━┓
┃★★★★★★★★★★★★★★★★┃
┃★★★★★★★★★★★★★★★★┃
┃★★★★★★★★★★★★★★★★┃
┃★★★★★★★★★★★★★★★★┃
┗━━━━━━━━━━━━━━━━┛

引用返信 編集キー/
■81172 / inTopicNo.4)  Re[2]: ホイールでタブを回したい
□投稿者/ するめ (2回)-(2016/08/31(Wed) 12:59:29)
パーフェクトでした。
ありがとうございます。
 
解決済み
引用返信 編集キー/
■81176 / inTopicNo.5)  Re[3]: ホイールでタブを回したい
□投稿者/ 魔界の仮面弁士 (863回)-(2016/08/31(Wed) 17:01:50)
No81172 (するめ さん) に返信
> パーフェクトでした。

ついでに、MultiLine 対応版も作ってみました。

---------------------------------------

Dim tc = DirectCast(sender, TabControl)

Dim area = Enumerable.Range(0, tc.TabCount) _
  .Select(Function(i) tc.GetTabRect(i)) _
  .Aggregate(Function(a, b) Rectangle.FromLTRB(
    Math.Min(a.Left, b.Left),
    Math.Min(a.Top, b.Top),
    Math.Max(a.Right, b.Right),
    Math.Max(a.Bottom, b.Bottom)))


'If tc.Alignment = TabAlignment.Top OrElse tc.Alignment = TabAlignment.Bottom Then
'  area.Inflate(tc.Right - area.Right, 0)
'Else
'  area.Inflate(0, tc.Height - area.Height)
'End If

If area.Contains(e.Location) Then

  If e.Delta > 0 Then
    tc.SelectedIndex += 1
  ElseIf tc.SelectedIndex > 0 Then
    tc.SelectedIndex -= 1
  End If

End If

---------------------------------------

上記のコードに変更すると、☆部分であっても
ホイールに反応するようになります。

また、コメント部分を解除することで、★の部分にも対応します。


┌────┐
│TabPage4│☆☆☆☆☆☆☆☆☆☆★
┌────┏━━━━┓────┐★
│TabPage1┃TabPage2┃TabPage3│★
┏━━━━┛    ┗━━━━━━┓

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -