- ベストアンサー
TabStripのイベントについて
VB6にて開発しています。 VB.NETと違い、VB6の[TabStrip]には各ページにコンテナが用意されていません。 そこで、[PictureBox]をコンテナにして、実行時の[Crick]イベントにて [SelectedItem.Index]を参照し、[Visible]プロパティを切り替えて使用しています。 しかしここでひとつ不具合が起こります。 タブをクリック(押下)したままドラッグしてフォーム外でドロップすると、 タブ自体は切り替わりますが、[Crick]イベントが発生しません。 [TabStrip]の[MouseUp]イベント時に[Crick]イベントをコールするという方法で 回避しています。 ですが、そもそも一般のタブは(例えば画面のプロパティ等のタブ) マウスを押した(押下)時点でページが変わります。 これを実現したく、思考錯誤しています。 [Crick]イベントでは、マウスを押して放した時にイベントが発生します。 マウスを押した(押下)時点で切り替えるには、必然的に[MouseDown]時に [Visible]プロパティを切り替えなければいけないと思うのです。 が、イベントの発生順序は[MouseDown]→[Crick]→[MouseUp]という順で発生する為、 どうしても[Crick]時に取得する[SelectedItem.Index]が[MouseDown]時に取得できず、 実現しません。 VB6でマウスを押した(押下)時のページ切り替えを実現する方法はないのでしょうか? [参考] Private Sub TabStrip1_Click() Dim i As Byte With Me For i = 0 To 8 .Picture1(i).Visible = False Next i i = .TabStrip1.SelectedItem.Index - 1 .Picture1(i).Visible = True End With End Sub
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1115409 でも回答してますが、MouseDownで座標からClick位置を割り出す方法がありますね。 このとき回答した内容にバグがあったので手直しして、ついでに参考コードも幾分スマートに書き直してみました(^^; Private Sub TabStrip1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) Dim i As Long Dim idx As Long idx = GetTabSelection(TabStrip1, x, y) - 1 For i = 0 To Picture1.Count - 1 Picture1(i).Visible = (i = idx) Next i End Sub Private Function GetTabSelection(oCtrl As TabStrip, x As Single, y As Single) As Long GetTabSelection = oCtrl.SelectedItem.Index Dim oTab As ComctlLib.Tab For Each oTab In oCtrl.Tabs With oTab If (.Left + .Width) >= x + oCtrl.Left And _ .Left <= x + oCtrl.Left Then 'If y + oCtrl.Top <= .Height Then If y <= .Height Then GetTabSelection = oTab.Index Exit For End If End If End With Next End Function
その他の回答 (5)
- piyo2000
- ベストアンサー率49% (144/293)
>[idx = GetTabSelection(TabStrip1, x, y) - 1]の行にて型が一致しないというエラーが出てしまいます。 GetTabSelection()では、TabStripを引数にしてますが 名前解決が出来てないのではないでしょうか? Common Controlを複数参照設定していると、どっちのTabStripかを指定する必要があります。 oCtrl As TabStrip を oCtrl As ComctlLib.TabStrip として試してみてください。 それでも駄目なら、GetTabSelection()から第一引数を取り去って、GetTabSelection()中のoCtrlを全て(Me.)TabStrip1(直接参照)としてみてください。
お礼
お答えを頂き有り難うございます。 察しの通り、複数参照していました。 これはタブをXPスタイルに適用すべくVB5のコントロールを使用したためでした。 [x,y]についてはフォーム座標が[Twip]ではなく[Pixel]ですので[Screen.TwipsPerPixelX及びY]にて変換したところ、見事解決致しました。 右クリックは下記で回避 If Button = vbRightButton Then Exit Sub シフトは他で使用しませんので(^^; したかった事が実現しますと気持ちが良いですね(^^)本当に有り難うございましたm(_ _)m
- Kuppycat
- ベストアンサー率50% (109/216)
#4です。 SSTabでのフォーカス移動ですが、これはTabStripと同じように各タブに対してFrameやPictureBoxでコンテナを作れば解決します。 コンテナが2重になりますが、制御は楽だと思います。 XPスタイルに関してはどうしようもありませんね。 役に立たなくてすみません(^^;
お礼
お答えを頂き有り難うございます。 簡単な回避方法があったんですね(^^; XPスタイルに対応していれば…残念
- Kuppycat
- ベストアンサー率50% (109/216)
質問の意図とは違いますが、ひとつの解決策として。 SSTab(Microsoft Tabbed Dialog Control)を使用する。 というのはいかがでしょうか? ビジュアルに差もありませんよ。
お礼
お答えを頂き有り難うございます。 [SSTab]はコーティングが簡単というメリットを持っていますが、既知の問題点がございます。 実行時、アクティブなタブ上のボタンなどのコントロールを選択して、キーボードの矢印キーを押しフォーカスを移動していると[SSTab]上の他のタブに置かれているコントロールにもフォーカスが移動してしまうという致命的なものです。 それと補足なのですが、[SSTab]はXPスタイルに対応していない点です。その他のコントロールは[manifest]ファイルにてXPスタイルに変更していますので。
- piyo2000
- ベストアンサー率49% (144/293)
度々すみません。#2です。 紹介したサンプルコードは右クリックの場合等(つまりButton/Shift)の処理が抜けていますので、右クリックだとおかしくなっちゃいます。 あとタブは展開されていること(横幅が少ないとき←→が表示されますが、そうでない場合)と、一列であることが前提です。 その辺は宿題ということで・・・(^^;
- hope10
- ベストアンサー率48% (17/35)
>ドラッグしてフォーム外でドロップすると、 これは TabStrip 領域外ですね? 初めて知りました。曲者ですね。 イベント順ですが本来は [MouseDown]→[MouseUp]→[Crick] が正しいと思います。バージョンによって異なるのかも知れませんが... 恐らくそちらでは[MouseDown]の中からTabStrip1_Click()を呼んでいるので、そう見えるだけだと言う事ですよね。 それで結局どうするかですが、TabStrip1_MouseDown()の終わり当りでマウスキャプチャを解放してやれば全てうまくいくのではないかと思います。 もちろんドラッグは出来なくなりますが、一連の[MouseDown]→[MouseUp]→[Crick]が起こると思います。 ReleaseCpature()API辺りを調べてみてやってみて下さい。
お礼
お答えを頂き有り難うございます。 早速WindowsAPIの[SetCapture]及び[ReleaseCapture]にて検証してみたのですが、やはり[Crick]イベントが発生しないようです。 WindowsAPIにて直接TabStripを作成すれば議題の[マウスを押した(押下)時のページ切り替え]を実現出来るのですが、デザイン時に把握し辛い事と、コーディングが複雑になってしまう為、出来れば避けて通りたかったのですが。 VBのコンポーネントは今一つ物足りないですね(^^;
お礼
お答えを頂き有り難うございます。 実は1115409のスレッドはこちらに質問する前に参考にさせて頂きました(^^; 動作しなかったのは、やはりバグ(^^;だったんですね。 そこで、上記コードを参考に試してみたのですが、 [idx = GetTabSelection(TabStrip1, x, y) - 1]の行にて型が一致しないというエラーが出てしまいます。 [idx]と[GetTabSelection]の[long型]を[variant型]に変更してみてもエラーが出る様なので、根本的に格納できない型の組み合わせなのでしょうか(^^; この辺りをもう少し研究してみます。