- PR -

MainMenuコントロールへのフォーカス

1
投稿者投稿内容
たく
会議室デビュー日: 2007/06/15
投稿数: 16
投稿日時: 2007-07-19 14:18
−環境−
 VS2005(C#)
 Windows VISTA

現在、System.Windows.Forms.MainMenuをフォームのMenuに登録しています。
ボタンを押下したタイミングで、メニューの左側のアイテムを選択状態にしたいのです。

MSDNも見てみたんですが、フォーカスをあてるようなメソッドが用意されていなくて。。。
VISTAなんかだと、Altキー押下でメニューが表示されますが、その時はメニューの左側のアイテムが選択状態になっているので、出来なくはないと思うのですが方法がわかりません。


よい方法をご存知の方いたら教えてください。
よろしくお願いします。

tkrn
ベテラン
会議室デビュー日: 2005/10/25
投稿数: 61
投稿日時: 2007-07-19 15:13
引用:

たくさんの書き込み (2007-07-19 14:18) より:
−環境−
 VS2005(C#)
 Windows VISTA

現在、System.Windows.Forms.MainMenuをフォームのMenuに登録しています。
ボタンを押下したタイミングで、メニューの左側のアイテムを選択状態にしたいのです。

MSDNも見てみたんですが、フォーカスをあてるようなメソッドが用意されていなくて。。。
VISTAなんかだと、Altキー押下でメニューが表示されますが、その時はメニューの左側のアイテムが選択状態になっているので、出来なくはないと思うのですが方法がわかりません。


よい方法をご存知の方いたら教えてください。
よろしくお願いします。



回答ではありません。

VS2005ならMainMenuでなくMenuStripは使えないのですか?
MenuStripなら可能なようですが。

menuStrip1.Items[0].Select();
たく
会議室デビュー日: 2007/06/15
投稿数: 16
投稿日時: 2007-07-19 15:27
レスありがとうございます。

引用:

VS2005ならMainMenuでなくMenuStripは使えないのですか?
MenuStripなら可能なようですが。

menuStrip1.Items[0].Select();



確かに、Stripの方はやりたい事ができるI/Fが用意されていました。
ですが、MainMenuとMenuStripではどうやらクライアント領域のサイズが変わってくるみたいなのです。
確か、Stripの方はクライアント領域にStripも含まれるが、MainMenuはクライアント領域に含まれなかったような気がします。

で、メニュー部分をクライアント領域に含めたくないのでMainMenuを用いています。


先にこの情報を書いておくべきでした、すいませんでした。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-07-20 00:47
引用:

VISTAなんかだと、Altキー押下でメニューが表示されますが、その時はメニューの左側のアイテムが選択状態になっているので、出来なくはないと思うのですが方法がわかりません。



あれは多分、MainMenu ではなく MenuStrip に相当するブツのはずです。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-20 03:06
引用:

たくさんの書き込み より:
確か、Stripの方はクライアント領域にStripも含まれるが、MainMenuはクライアント領域に含まれなかったような気がします。

で、メニュー部分をクライアント領域に含めたくないのでMainMenuを用いています。



いろんな事情があるとは思いますが、
MenuStrip+コントロールのDockingで
解決するのが普通かなぁと。

クライアント領域に自分で描いたりしたい場合には
Dockするコントロールをクライアント領域の代わりに使えば大抵間に合うし。

引用:

たくさんの書き込み (2007-07-19 14:18) より:
現在、System.Windows.Forms.MainMenuをフォームのMenuに登録しています。
ボタンを押下したタイミングで、メニューの左側のアイテムを選択状態にしたいのです。
よい方法をご存知の方いたら教えてください。



あまりよい方法でないんですが、
こんな感じで動いてはいます。

PostMessageで強引に。

遥か昔からこの手を使ってて、他に手を知らないので、
.Netでいい方法があったら教えてください。

コード:
    Private Const WM_SYSCOMMAND = &H112
    Private Const SC_KEYMENU = &HF100

    <DllImport("user32.dll")> _
    Private Shared Function PostMessage( _
        ByVal hWnd As IntPtr, _
        ByVal Msg As UInteger, _
        ByVal wParam As IntPtr, _
        ByVal lParam As IntPtr) As IntPtr
    End Function

    Private Sub Button1_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click
        Form1.PostMessage(Me.Handle, WM_SYSCOMMAND, New IntPtr(SC_KEYMENU), IntPtr.Zero)
    End Sub


れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-20 03:28
引用:

渋木宏明(ひどり)さんの書き込み (2007-07-20 00:47) より:
引用:

VISTAなんかだと、Altキー押下でメニューが表示されますが、その時はメニューの左側のアイテムが選択状態になっているので、出来なくはないと思うのですが方法がわかりません。



あれは多分、MainMenu ではなく MenuStrip に相当するブツのはずです。



そういえばMessengerはMainMenuでした。


渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-07-20 08:02
引用:

そういえばMessengerはMainMenuでした。



なので、IE7 のメニューとは「非表示→表示」の動作が異なりますよね。
たく
会議室デビュー日: 2007/06/15
投稿数: 16
投稿日時: 2007-07-20 11:29
渋木宏明(ひどり)さん、れいさん、回答ありがとうございます。


やはり、MenuStripでやるべきなんですね。。。
最初からそうしておけばよかったです、、、

確かに、MenuStripの場合だとやりたい動作はできます。
ただし、切り替えると変数名を変えるなどではない修正が入れる必要があるので、あまり変えたくないんのです。

れいさんに教えていただいたコードを組むことで、一応やりたい事はできたみたいです。
ありがとうございますm(__)m
ただ、ポストメッセージって今まで使った記憶がないので、ちょっと調べてみます。


あと、ご存知だったら教えていただきたいのですが、MainMenuにフォーカスがある時ってKeyDownイベントは呼ばれないのでしょうか?
(KeyUpは必ず呼ばれてるみたいです。ただ、altを押した場合、keycode=menuとなってました。)
1

スキルアップ/キャリアアップ(JOB@IT)