DOBON.NET DOBON.NETプログラミング掲示板過去ログ

どのTabが右クリックされたかを取得する方法

環境/言語:[C#]
分類:[.NET]

 TabCtrlで、どのTabPageが右クリックされたを知るために、
以下のようにしたのですが、なぜかnullが返ってきます。
 正しい方法があれば、ご教授お願いします。


private void tab_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
Point pt = new Point(e.X, e.Y);
TabPage page = tab.GetChildAtPoint(pt) as TabPage;
}
}
2005/01/24(Mon) 11:01:37 編集(投稿者)

 次のスレが参考になるかも知れません。

タブコントロールのタブの選択について
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=8361&rev=&no=0


■追記
 API を使ってもよければ、 TCM_HITTEST メッセージを投げるという方法もあります。
#動作については未確認 :-p
.NETなんで、できればWindowProcとかWM_XXXXとかは使いたくないんですが。
そのための.NETですし・・・

 HitTestに相当するものを探していたら、GetChildAtPoint()を発見したんで。
TabPageの親がTabCtrlみたいなんで、GetChildAtPoint()で取得できそうなもんですが・・・

 TabのRectを取得して、というのでとりあえず試してみます。
■No8686に返信(KJさんの記事)

こんにちは平ちゃんです。
VB.NETですが
Private Sub TabControl1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TabControl1.MouseUp
Dim s As String
If e.Button = MouseButtons.Right Then
s = s + "R"
End If
End Sub
でちゃんと右クリックが判断できてます。
c#でもできるはずですが。


> .NETなんで、できればWindowProcとかWM_XXXXとかは使いたくないんですが。
> そのための.NETですし・・・

この件ですがWindowProcとかWM_XXXXで.NETの特長が失われるのでしょうか?
APIでしたら確かにその通りと思いますが、WindowProcとかWM_XXXXは
.NETで標準装備のメソッドですから、そのような事はないと理解していました。
是非この辺りを教えてください。宜しくお願いします。
えーと、すいません。
右クリックされたことは判断できるんですが、
どのTabPageが右クリックされたかを知りたいんです。

 タブは右クリックでは選択状態にならないんで、
座標から割り出そうとしたんですが、うまくいってません。


> この件ですがWindowProcとかWM_XXXXで.NETの特長が失われるのでしょうか?
> APIでしたら確かにその通りと思いますが、WindowProcとかWM_XXXXは
> .NETで標準装備のメソッドですから、そのような事はないと理解していました。

 標準装備の割には、

Private Const WM_ACTIVATEAPP As Integer = &H1C

のように、メッセージのIDを自分で定義しなければならないことに、
疑問を持ったことはありませんか?
C++なら、ヘッダに全て書いてあります(VB6は知りませんが)

.NETでは、メッセージではなくデリゲート(イベントハンドラ)で
イベントを処理するように設計されています。
通常、メッセージを直接処理することはありません。
代わりのイベントがあるはずです。

はずなんですが、どうしても抜けがあって、コントロールやフォームのイベントに
無い処理をしたいときは、直接ウィンドウプロシージャを処理しなきゃ
いけないんですけどね・・・

正直、WM_XXXXでできたことは、.NETでも全てサポートして欲しいです。
ウィンドウプロシージャ操作しなけりゃいけないんなら、
最初からC++で書いた方がまし・・・でもそうもいかないんですよね。
■No8700に返信(KJさんの記事)

こんにちは 宜しくお願いします。

> どのTabPageが右クリックされたかを知りたいんです。
>
タブコントロールのタブの選択について
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=8361&rev=&no=0
に書いた GetTabRect メソッドで取り出した座標と右クリックした座標を
比較する事で出来ると思います。


別の話ですが

>  標準装備の割には、
>
> Private Const WM_ACTIVATEAPP As Integer = &H1C
>
> のように、メッセージのIDを自分で定義しなければならないことに、
> 疑問を持ったことはありませんか?
> C++なら、ヘッダに全て書いてあります(VB6は知りませんが)
>
> .NETでは、メッセージではなくデリゲート(イベントハンドラ)で
> イベントを処理するように設計されています。
> 通常、メッセージを直接処理することはありません。
> 代わりのイベントがあるはずです。
>
> はずなんですが、どうしても抜けがあって、コントロールやフォームのイベントに
> 無い処理をしたいときは、直接ウィンドウプロシージャを処理しなきゃ
> いけないんですけどね・・・
>
> 正直、WM_XXXXでできたことは、.NETでも全てサポートして欲しいです。
> ウィンドウプロシージャ操作しなけりゃいけないんなら、
> 最初からC++で書いた方がまし・・・でもそうもいかないんですよね。
>


私の場合は主要なプロパティ、メソッド、イベントを見てこれで処理できない場合はウインドウメッセージの一覧を参照しメッセージのID

を記入しますので、別に不便を感じないですね。


私が気になったのは WM_XXXX 等のウインドウメッセージを使う事により下記の引用の.NET Frameworkの特長が失われるのかと思ったので

質問させて頂きました。(未熟者ですから)
ですので以下の引用には関係ないと理解させて頂いて宜しいですね。

以下 引用
-----------
 .NET Frameworkをベースとして開発されたアプリケーションは、下位のハードウェア・プラットフォームやOSがどのようなものであろう

と、.NET Frameworkが実装された環境なら、どこでも実行することができる。もちろん、アプリケーションの処理は、たとえばWindows OS

なら、最終的にはWin32 API呼び出しに変換されることになるが、これらはすべて.NET Frameworkによって隠蔽されており、アプリケーショ

ンが直接APIを呼び出す必要はない。
------------
http://www.atmarkit.co.jp/icd/root/50/50470250.html

DOBON.NET | プログラミング道 | プログラミング掲示板