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

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

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

Re[1]: VB.net タブコントロールのタブの遷移イベントについて


(過去ログ 141 を表示中)

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

■82772 / inTopicNo.1)  VB.net タブコントロールのタブの遷移イベントについて
  
□投稿者/ ちょんも (2回)-(2017/02/03(Fri) 12:46:47)

分類:[VB.NET/VB2005 以降] 

はじめまして。VB開発の初心者です。
VB.net(visual studio 2015)を使用してアプリの画面を開発しています。

【やりたい事】
タブコントロール上に複数のタブページを配置した画面を作成しているのですが、タブコントロールのAppearance(タブの描画設定)のプロパティ値をNormalからButtonsの(ボタン形式)に変更しました。
その際、Normalではキーボードの矢印キー(↑↓→←)でタブを移動した際にタブの表示が自動で切り替わるのですが、Buttonsの設定ではフォーカスが移動するのみでタブの表示は切り替わらないため、Normalの場合と同様に表示が切り替わるようにしたい。

【質問事項】
タブコントロール上のタブページ(ボタン形式)の移動(フォーカス遷移)のイベントを検知して処理を埋め込む事は可能でしょうか?

タブコントロール上で矢印キー押下のイベントを検知して、タブの表示を切り替える事はできたのですが、その後に自動でフォーカス移動の処理も動作するため、切り替えたタブの次のタブにフォーカスも移動してしまい、上手くいきませんでした。

また、何か他に良い方法等はないでしょうか?
ご回答の程、宜しくお願いします。

引用返信 編集キー/
■82774 / inTopicNo.2)  Re[1]: VB.net タブコントロールのタブの遷移イベントについて
□投稿者/ 魔界の仮面弁士 (1107回)-(2017/02/03(Fri) 15:53:55)
No82772 (ちょんも さん) に返信
> Buttonsの設定ではフォーカスが移動するのみでタブの表示は切り替わらないため、
相手は「ボタン」なので、普通の Button や CheckBox と同様に、
Space キーを入力するなどの追加操作が必要ですね。


> タブページ(ボタン形式)の移動(フォーカス遷移)のイベントを検知して

遷移検知は TCN_FOCUSCHANGE を捕らえればいけました。

しかし肝心の、ボタンを「押されたことにする」方法が
  SendKeys.SendWait(" ")
ぐらいしか思いつきませんでした。


SendKeys 無しで実装するとなると、
力技になりますが、こんな感じでしょうか。


Imports System.Runtime.InteropServices
Imports System.Reflection

Public Class TabControlEx
  Inherits TabControl
  Private WmSelChange As Func(Of Boolean)
  Public Sub New()
    Dim bf = BindingFlags.Instance Or BindingFlags.NonPublic
    Dim m = GetType(TabControl).GetMethod("WmSelChange", bf)
    WmSelChange = Function() CBool(m.Invoke(Me, Nothing))
  End Sub
  Protected Overrides Sub WndProc(ByRef m As Message)
    Const WM_NOTIFY As Integer = &H4E
    Const WM_REFLECT As Integer = &H2000
    Select Case m.Msg
      Case WM_REFLECT + WM_NOTIFY, WM_NOTIFY
        Const TCN_FOCUSCHANGE As Integer = -554
        If TCN_FOCUSCHANGE = Marshal.ReadInt32(m.LParam, 2 * IntPtr.Size) Then
          MyBase.WndProc(m)
          Const TCM_GETCURFOCUS As Integer = &H132F
          Dim m2 = Message.Create(Handle, TCM_GETCURFOCUS, IntPtr.Zero, IntPtr.Zero)
          MyBase.WndProc(m2)
          Dim index = m2.Result
          Const TCM_SETCURSEL As Integer = &H130C
          Dim m3 = Message.Create(Handle, TCM_SETCURSEL, index, IntPtr.Zero)
          MyBase.WndProc(m3)
          WmSelChange()
          Return
        End If
    End Select
    MyBase.WndProc(m)
  End Sub
End Class
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -