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
No.2ベストアンサー
- 回答日時:
でも回答してますが、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
お答えを頂き有り難うございます。
実は1115409のスレッドはこちらに質問する前に参考にさせて頂きました(^^;
動作しなかったのは、やはりバグ(^^;だったんですね。
そこで、上記コードを参考に試してみたのですが、
[idx = GetTabSelection(TabStrip1, x, y) - 1]の行にて型が一致しないというエラーが出てしまいます。
[idx]と[GetTabSelection]の[long型]を[variant型]に変更してみてもエラーが出る様なので、根本的に格納できない型の組み合わせなのでしょうか(^^;
この辺りをもう少し研究してみます。
No.6
- 回答日時:
>[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
No.5
- 回答日時:
#4です。
SSTabでのフォーカス移動ですが、これはTabStripと同じように各タブに対してFrameやPictureBoxでコンテナを作れば解決します。
コンテナが2重になりますが、制御は楽だと思います。
XPスタイルに関してはどうしようもありませんね。
役に立たなくてすみません(^^;
No.4
- 回答日時:
質問の意図とは違いますが、ひとつの解決策として。
SSTab(Microsoft Tabbed Dialog Control)を使用する。
というのはいかがでしょうか?
ビジュアルに差もありませんよ。
お答えを頂き有り難うございます。
[SSTab]はコーティングが簡単というメリットを持っていますが、既知の問題点がございます。
実行時、アクティブなタブ上のボタンなどのコントロールを選択して、キーボードの矢印キーを押しフォーカスを移動していると[SSTab]上の他のタブに置かれているコントロールにもフォーカスが移動してしまうという致命的なものです。
それと補足なのですが、[SSTab]はXPスタイルに対応していない点です。その他のコントロールは[manifest]ファイルにてXPスタイルに変更していますので。
No.3
- 回答日時:
度々すみません。
#2です。紹介したサンプルコードは右クリックの場合等(つまりButton/Shift)の処理が抜けていますので、右クリックだとおかしくなっちゃいます。
あとタブは展開されていること(横幅が少ないとき←→が表示されますが、そうでない場合)と、一列であることが前提です。
その辺は宿題ということで・・・(^^;
No.1
- 回答日時:
>ドラッグしてフォーム外でドロップすると、
これは TabStrip 領域外ですね?
初めて知りました。曲者ですね。
イベント順ですが本来は
[MouseDown]→[MouseUp]→[Crick]
が正しいと思います。バージョンによって異なるのかも知れませんが...
恐らくそちらでは[MouseDown]の中からTabStrip1_Click()を呼んでいるので、そう見えるだけだと言う事ですよね。
それで結局どうするかですが、TabStrip1_MouseDown()の終わり当りでマウスキャプチャを解放してやれば全てうまくいくのではないかと思います。
もちろんドラッグは出来なくなりますが、一連の[MouseDown]→[MouseUp]→[Crick]が起こると思います。
ReleaseCpature()API辺りを調べてみてやってみて下さい。
お答えを頂き有り難うございます。
早速WindowsAPIの[SetCapture]及び[ReleaseCapture]にて検証してみたのですが、やはり[Crick]イベントが発生しないようです。
WindowsAPIにて直接TabStripを作成すれば議題の[マウスを押した(押下)時のページ切り替え]を実現出来るのですが、デザイン時に把握し辛い事と、コーディングが複雑になってしまう為、出来れば避けて通りたかったのですが。
VBのコンポーネントは今一つ物足りないですね(^^;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETでボタンクリックイベン...
-
VBAで一時中断したプログラムの...
-
グリッドビューでのチェックボ...
-
初期状態に戻す方法
-
JavaのJButtonについて。
-
javascript 別ウィンドウを開...
-
CheckBoxをボタン形式にして押...
-
Eclipseでクリーンが出来ない
-
JSPでメッセージボックスを表示...
-
Excel97で強制終了
-
Webブラウザの閉じるボタン無効...
-
メール添付されたPDFファイルが...
-
F2+Ctrl押下時のイベント記述方法
-
ACCESS リストボックスに検索結...
-
簡単なプログラム
-
DataGridViewのチェックボック...
-
c# 文字列の最後から1文字削除...
-
SUBMITボタンを表示させないでS...
-
VB.netでボリュームレベルメー...
-
エクセルVBAで画面の大きさを取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DataGridViewのチェックボック...
-
VBAで一時中断したプログラムの...
-
Eclipseでクリーンが出来ない
-
SPREADでカーソルの位置を1行目...
-
EXCEL2010でセルが編集中かを判...
-
c# 文字列の最後から1文字削除...
-
ロストフォーカスイベントとそ...
-
CheckBoxをボタン形式にして押...
-
最大化ボタンと最小化ボタンを...
-
VBのこのコードの意味を教えて...
-
Fancyboxのiframe内に閉じるボタン
-
ブラウザの×ボタン(閉じるボタ...
-
Ctrlキーを押しながらのダブル...
-
今更、VBAでRPA、キーボード操...
-
グリッドビューでのチェックボ...
-
【C#】 : WindowsProgramming ...
-
Webブラウザの閉じるボタン無効...
-
Page_Load時にボタンクリックイ...
-
PreTranslateMessageで音がする
-
メール添付されたPDFファイルが...
おすすめ情報