プロが教えるわが家の防犯対策術!

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

A 回答 (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

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=1115409
    • good
    • 0
この回答へのお礼

お答えを頂き有り難うございます。
実は1115409のスレッドはこちらに質問する前に参考にさせて頂きました(^^;
動作しなかったのは、やはりバグ(^^;だったんですね。
そこで、上記コードを参考に試してみたのですが、
[idx = GetTabSelection(TabStrip1, x, y) - 1]の行にて型が一致しないというエラーが出てしまいます。
[idx]と[GetTabSelection]の[long型]を[variant型]に変更してみてもエラーが出る様なので、根本的に格納できない型の組み合わせなのでしょうか(^^;
この辺りをもう少し研究してみます。

お礼日時:2005/01/18 23:52

>[idx = GetTabSelection(TabStrip1, x, y) - 1]の行にて型が一致しないというエラーが出てしまいます。



GetTabSelection()では、TabStripを引数にしてますが
名前解決が出来てないのではないでしょうか?
Common Controlを複数参照設定していると、どっちのTabStripかを指定する必要があります。

oCtrl As TabStrip

oCtrl As ComctlLib.TabStrip
として試してみてください。

それでも駄目なら、GetTabSelection()から第一引数を取り去って、GetTabSelection()中のoCtrlを全て(Me.)TabStrip1(直接参照)としてみてください。
    • good
    • 0
この回答へのお礼

お答えを頂き有り難うございます。
察しの通り、複数参照していました。
これはタブをXPスタイルに適用すべくVB5のコントロールを使用したためでした。
[x,y]についてはフォーム座標が[Twip]ではなく[Pixel]ですので[Screen.TwipsPerPixelX及びY]にて変換したところ、見事解決致しました。
右クリックは下記で回避
If Button = vbRightButton Then Exit Sub
シフトは他で使用しませんので(^^;

したかった事が実現しますと気持ちが良いですね(^^)本当に有り難うございましたm(_ _)m

お礼日時:2005/01/20 19:35

#4です。



SSTabでのフォーカス移動ですが、これはTabStripと同じように各タブに対してFrameやPictureBoxでコンテナを作れば解決します。
コンテナが2重になりますが、制御は楽だと思います。

XPスタイルに関してはどうしようもありませんね。
役に立たなくてすみません(^^;
    • good
    • 0
この回答へのお礼

お答えを頂き有り難うございます。
簡単な回避方法があったんですね(^^;
XPスタイルに対応していれば…残念

お礼日時:2005/01/20 19:11

質問の意図とは違いますが、ひとつの解決策として。


SSTab(Microsoft Tabbed Dialog Control)を使用する。
というのはいかがでしょうか?
ビジュアルに差もありませんよ。
    • good
    • 0
この回答へのお礼

お答えを頂き有り難うございます。
[SSTab]はコーティングが簡単というメリットを持っていますが、既知の問題点がございます。

実行時、アクティブなタブ上のボタンなどのコントロールを選択して、キーボードの矢印キーを押しフォーカスを移動していると[SSTab]上の他のタブに置かれているコントロールにもフォーカスが移動してしまうという致命的なものです。

それと補足なのですが、[SSTab]はXPスタイルに対応していない点です。その他のコントロールは[manifest]ファイルにてXPスタイルに変更していますので。

お礼日時:2005/01/18 21:13

度々すみません。

#2です。

紹介したサンプルコードは右クリックの場合等(つまりButton/Shift)の処理が抜けていますので、右クリックだとおかしくなっちゃいます。
あとタブは展開されていること(横幅が少ないとき←→が表示されますが、そうでない場合)と、一列であることが前提です。
その辺は宿題ということで・・・(^^;
    • good
    • 0

>ドラッグしてフォーム外でドロップすると、


これは TabStrip 領域外ですね?
初めて知りました。曲者ですね。

イベント順ですが本来は
[MouseDown]→[MouseUp]→[Crick]
が正しいと思います。バージョンによって異なるのかも知れませんが...
恐らくそちらでは[MouseDown]の中からTabStrip1_Click()を呼んでいるので、そう見えるだけだと言う事ですよね。

それで結局どうするかですが、TabStrip1_MouseDown()の終わり当りでマウスキャプチャを解放してやれば全てうまくいくのではないかと思います。
 もちろんドラッグは出来なくなりますが、一連の[MouseDown]→[MouseUp]→[Crick]が起こると思います。
ReleaseCpature()API辺りを調べてみてやってみて下さい。
    • good
    • 0
この回答へのお礼

お答えを頂き有り難うございます。
早速WindowsAPIの[SetCapture]及び[ReleaseCapture]にて検証してみたのですが、やはり[Crick]イベントが発生しないようです。
WindowsAPIにて直接TabStripを作成すれば議題の[マウスを押した(押下)時のページ切り替え]を実現出来るのですが、デザイン時に把握し辛い事と、コーディングが複雑になってしまう為、出来れば避けて通りたかったのですが。
VBのコンポーネントは今一つ物足りないですね(^^;

お礼日時:2005/01/18 20:24

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