none
フォーカスが来ないボタン RRS feed

  • 質問

  • 初めて投稿させてもらいます。

     環境:WindowsXP sp2,.Net Framework v2.0,VS2005,Windowsフォーム


    Visual C#にて、スクリーンキーボード(ソフトキーボード)の作成をしております。

    スクリーンキーボードの作成の過程で、

    http://homepage1.nifty.com/yasunari/VB/VB2005/ScreenKeyBoardMaking.htm

    ↑のWebページ(VBですが)を見つけまして、

    第一に、フォーカスがあたらない(アクティブにならない)ボタンの作成をしなければならないということがわかりました。

     

    http://forums.microsoft.com/msdn-ja/showpost.aspx?postid=391238&SiteID=7

    というのも参考にして、

    SetStyle(ControlStyles.Selectable, false);

    というのを使って実現するということもわかったので、C#で

    Form1.csにボタンを貼り付けて、Form1.csのコードに

            public void Main()
            {
                this.SetStyle(ControlStyles.Selectable, false);
            }

     としていますがなかなかうまくいきません。

     

    基本的なことが間違っているような気もします…。

    ご教授していただけると大変うれしいです。宜しくお願いします。

     

    2006年8月18日 11:18

すべての返信

  • はやとさん、こんにちは。

     はやと さんからの引用
    Form1.csにボタンを貼り付けて、Form1.csのコードに

            public void Main()
            {
                this.SetStyle(ControlStyles.Selectable, false);
            }

     としていますがなかなかうまくいきません。

    例だとしても、Main という名前のメソッドは混乱を招きますね。

    あくまで例だと仮定して SetStyle の後に、


    this.UpdateStyles();
    this.RecreateHandle();

     

    を加えてみてもダメでしょうか?

    タイミングの問題のような気もしますが...

    2006年8月18日 13:12
  • 早速の返事ありがとうございます。

            public void Test()
            {
                this.SetStyle(ControlStyles.Selectable, false);
                this.UpdateStyles();
                this.RecreateHandle();
            }

    ※MainをTestに変更しました。

    2行を加えてみましたが、ビルドした後ボタンをクリックするとフォーカス(ボタンが点線で囲まれる)が当たってしまいます。

    2行を加えるところが間違っているとかでしょうか?

    2006年8月18日 13:29
  • 諸農です。

    参考サイトを見ながら以下の方法でやってみました。
    WinFormアプリケーションプロジェクトを作成し、プロジェクトの追加メニューから「新しい項目|カスタムコントロール」を選択します。新しいコントロールの継承元をButtonに変更して、コンストラクタに以下のコードを記述します。



    namespace NonFocusForm
    {
        public partial class NonFocusButton : Button     //←Buttonに変更
        {
            public NonFocusButton():base()            //←:baseを追加
            {
                InitializeComponent();
                 //↓追加
                this.SetStyle(ControlStyles.Selectable, false); 
            }
            protected override void OnPaint(PaintEventArgs pe)
            {
                // TODO: カスタム ペイント コードをここに追加します
                // 基本クラス OnPaint を呼び出しています
                base.OnPaint(pe);
            }
        }
    }

     

    一度ビルドを行うとツールボックスに新しく作成したボタンコンポーネントが登録されますので、フォームデザイナに切り替えてフォーム上に貼り付けます。
    フォームをダブルクリックしてIDEによって作成されるForm_Loadスケルトンの作成とWndProcメソッドのオーバーライドを行います。



            private void Form1_Load(object sender, EventArgs e)
            {
                this.TopMost = true;
            }
            const int WM_MOUSEACTIVATE = 0x21;
            const int MA_NOACTIVATE = 3;
            const int MA_NOACTIVATEANDEAT = 4;
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_MOUSEACTIVATE)
                {
                    m.Result = (IntPtr)MA_NOACTIVATE;
                    return;
                }
                base.WndProc(ref m);
            }

     

     

    2006年8月18日 14:57
  • Form1のコードで

    this.SetStyle(ControlStyles.Selectable, false);

    と、やっても、フォーカスが消えるのはForm1だけではないでしょうか?
    SetStyleはControlで定義されているので、ButtonのSetStyleを呼ぶ必要があると思います。

    ただ、Protectedで宣言されているので、Buttonを継承したクラスを用意して、
    その実装中で呼び出す必要があります。


    Public class MyButton : Button
    {
        public MyButton() : base()
        {
            this.SetStyele(ContorolStyles.Selectable, false);
        }
    }
     

    として、Form1.Designer.csの方でButtonの代わりにMyButtonを使ってやればうまく行きました。
    (デザイン側に手を加えていいんだっけ^^;)

    http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.setstyle.aspx

     

    2006年8月18日 15:06
  • >ただ、Protectedで宣言されているので、Buttonを継承したクラスを用意して、
    >その実装中で呼び出す必要があります。

    とあるのですが、Buttonを継承したクラスを用意するというのは具体的にはどうすればよろしいでしょうか?

    新しい項目を追加で、クラスを追加して、そのクラスのコードの中に 


    Public class MyButton : Button
    {
        public MyButton() : base()
        {
            this.SetStyele(ContorolStyles.Selectable, false);
        }
    }
     

    を記入すればよろしいでしょうか?

     

    せっかく教えていただいてるのに、理解できなくて申し訳ございません。

    2006年8月18日 15:56
  • 書くのに時間をかけすぎたので、諸農さんの書き込みより後になってますが、
    諸農さんの書き込みの方が適切なので、そちらを参考にされることをお勧めします。
    (私のサンプルでも実現できますが、諸農さんのやり方の方が、
    ツールボックスに追加される分、デザインを作りやすいと思います。)

    継承したクラスの用意のしかたとしてはそれで合っています。
    継承に関しての説明は、「C#」「継承」といったキーワードでweb検索することをお勧めします。

    諸農さんの書き込みを参考にされるのであれば、
    「partial」「orverride」「カスタムコントロール」などのキーワードも調べておくと良いでしょう。

    2006年8月19日 1:57