質問者
フォーカスが来ないボタン

質問
-
初めて投稿させてもらいます。
環境: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);
}としていますがなかなかうまくいきません。
基本的なことが間違っているような気もします…。
ご教授していただけると大変うれしいです。宜しくお願いします。
すべての返信
-
はやとさん、こんにちは。
はやと さんからの引用 Form1.csにボタンを貼り付けて、Form1.csのコードに public void Main()
{
this.SetStyle(ControlStyles.Selectable, false);
}としていますがなかなかうまくいきません。
例だとしても、Main という名前のメソッドは混乱を招きますね。
あくまで例だと仮定して SetStyle の後に、
this.UpdateStyles();
this.RecreateHandle();
を加えてみてもダメでしょうか?
タイミングの問題のような気もしますが...
-
諸農です。
参考サイトを見ながら以下の方法でやってみました。
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);
}
-
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
-
>ただ、Protectedで宣言されているので、Buttonを継承したクラスを用意して、
>その実装中で呼び出す必要があります。とあるのですが、Buttonを継承したクラスを用意するというのは具体的にはどうすればよろしいでしょうか?
新しい項目を追加で、クラスを追加して、そのクラスのコードの中に
Public class MyButton : Button
{
public MyButton() : base()
{
this.SetStyele(ContorolStyles.Selectable, false);
}
}
を記入すればよろしいでしょうか?
せっかく教えていただいてるのに、理解できなくて申し訳ございません。
-
書くのに時間をかけすぎたので、諸農さんの書き込みより後になってますが、
諸農さんの書き込みの方が適切なので、そちらを参考にされることをお勧めします。
(私のサンプルでも実現できますが、諸農さんのやり方の方が、
ツールボックスに追加される分、デザインを作りやすいと思います。)継承したクラスの用意のしかたとしてはそれで合っています。
継承に関しての説明は、「C#」「継承」といったキーワードでweb検索することをお勧めします。諸農さんの書き込みを参考にされるのであれば、
「partial」「orverride」「カスタムコントロール」などのキーワードも調べておくと良いでしょう。