C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: コントロールのフォーカスセットメッセージの取得について


(過去ログ 72 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■41743 / inTopicNo.1)  コントロールのフォーカスセットメッセージの取得について
  
□投稿者/ プリ太 (74回)-(2009/09/29(Tue) 20:39:57)

分類:[C#] 

いつもお世話になっております。
プリ太です。

コントロールに読み取り専用モードを追加したいので、コントロールを継承し、WndProcをoverrideして、
フォーカスを抜けようとしています。

RadioButton、TextBox、CheckBox、DataGridViewは抜けることができたのですが、
DomainUpDownとComboBoxがフォーカスを抜けることができません。
WndProcは以下のようにしています。
protected override void WndProc(ref Message m)
{
const int WM_PASTE = 0x0302;
const int WM_LBUTTONDOWN = 0x201;
const int WM_RBUTTONDOWN = 0x204;
const int WM_MBUTTONDOWN = 0x207;
const int WM_LBUTTONDBLCLK = 0x203;
const int WM_MBUTTONDBLCLK = 0x206;
const int WM_SETFOCUS = 0x0007;

switch (m.Msg)
{
case WM_LBUTTONDOWN:
return;
case WM_RBUTTONDOWN:
return;
case WM_MBUTTONDOWN:
return;
case WM_LBUTTONDBLCLK:
return;
case WM_MBUTTONDBLCLK:
return;
case WM_PASTE:
return;
case WM_SETFOCUS:
return;
}

base.WndProc(ref m);
}

WndProcはRadioButton等と同じなのですが、コントロールを左クリックするとフォーカスがセットされます。
WM_SETFOCUSのreturnにブレイクポイントを設定しても、ブレイクに引っかかりません。

DomainUpDownとComboBoxのフォーカス取得時の値はRadioButton等と違うのでしょうか?
または、DomainUpDownとComboBoxのフォーカス取得の値の取り方が違うのでしょうか?

環境はVS2005です。
宜しくお願いします。

引用返信 編集キー/
■41755 / inTopicNo.2)  Re[1]: コントロールのフォーカスセットメッセージの取得について
□投稿者/ やじゅ (1348回)-(2009/09/29(Tue) 23:42:09)
やじゅ さんの Web サイト
No41743 (プリ太 さん) に返信

この質問の回答にはなってないかなー、下記サイトをみつけたんですけどね。

TextBoxってReadOnly = trueでもフォーカスあたる。空気読めなさすぎだよね。
http://d.hatena.ne.jp/zecl/20090201/p1
引用返信 編集キー/
■41781 / inTopicNo.3)  Re[2]: コントロールのフォーカスセットメッセージの取得について
□投稿者/ プリ太 (75回)-(2009/09/30(Wed) 14:03:28)
やじゅ さん ありがとうございます。

> この質問の回答にはなってないかなー、下記サイトをみつけたんですけどね。
>
> TextBoxってReadOnly = trueでもフォーカスあたる。空気読めなさすぎだよね。
> http://d.hatena.ne.jp/zecl/20090201/p1

このサイトで拡張ComboBoxの実装について記載しているところで、
「ComboBoxの場合、内部的にもっているEditBoxおよびListBoxのハンドルを取得し、
それぞれに対して、NaitiveWindowを用いてWndProcをカプセル化する必要があります。」
とあり、ひょっとして内部的EditBoxとListBoxのフォーカスについて取得しないといけないのかも?と思いました。
どうやって取得できるのか調べてみます。

が、とりあえず、教えていただいたサイトのソースを試してみようと思い組み込んでみたのですが、
ISelectableインターフェイスを定義の部分で
public static void InitializeSelectable(this ISelectable self)
の引数thisの部分で「型が必要です。」とエラーになります。
#"this"の記述を削除すると違うエラーが発生します。
このthisの記述の意味は何なのでしょうか?

宜しくお願いします。
引用返信 編集キー/
■41784 / inTopicNo.4)  Re[3]: コントロールのフォーカスセットメッセージの取得について
□投稿者/ 魔界の仮面弁士 (1329回)-(2009/09/30(Wed) 15:35:02)
2009/09/30(Wed) 15:37:02 編集(投稿者)
No41781 (プリ太 さん) に返信
> public static void InitializeSelectable(this ISelectable self)
この構文は、C# 3.0 (C#.NET 2008) 以降の「拡張メソッド」構文ですね。


> の引数thisの部分で「型が必要です。」とエラーになります。
2002/2003/2005 を使っている、とか。



> #"this"の記述を削除すると違うエラーが発生します。
> このthisの記述の意味は何なのでしょうか?
下記の例を参照してみてください。
http://msdn.microsoft.com/ja-jp/library/bb311042.aspx

ここでは、
 public static int WordCount(this String str)
という定義によって、
 string s = "〜";
 int i = s.WordCount();
というコードが書けるようになっています。
(string 型に WordCount メソッドがあるかのように振る舞われます)

もし、this が無い場合、上記は
 // using CustomExtensions;
 int i = StringExtension.WordCount(s);
と書き換える事ができます。

引用返信 編集キー/
■41787 / inTopicNo.5)  Re[4]: コントロールのフォーカスセットメッセージの取得について
□投稿者/ プリ太 (76回)-(2009/09/30(Wed) 15:53:16)
魔界の仮面弁士 さん ありがとうございます。

>>public static void InitializeSelectable(this ISelectable self)
> この構文は、C# 3.0 (C#.NET 2008) 以降の「拡張メソッド」構文ですね。
>
>
>>の引数thisの部分で「型が必要です。」とエラーになります。
> 2002/2003/2005 を使っている、とか。

あ、プリ太はVS2005で開発しています。
それでエラーになるのですね。
#どうりで"this"を消しても"this."にしてもエラーが出るはずですね。
ということは、ここのソースは2008にしかない型を使っている可能性もありますね。
#その先でエラーになるのもそういうことなのでしょうか・・・


>>#"this"の記述を削除すると違うエラーが発生します。
>>このthisの記述の意味は何なのでしょうか?
> 下記の例を参照してみてください。
> http://msdn.microsoft.com/ja-jp/library/bb311042.aspx
>
> ここでは、
>  public static int WordCount(this String str)
> という定義によって、
>  string s = "〜";
>  int i = s.WordCount();
> というコードが書けるようになっています。
> (string 型に WordCount メソッドがあるかのように振る舞われます)
>
> もし、this が無い場合、上記は
>  // using CustomExtensions;
>  int i = StringExtension.WordCount(s);
> と書き換える事ができます。

VS2005ではこの機能が組み込まれていないので、置き換えをしてやらないと動かない、ということですね。

ひょっとして、VS2005ではNativeWindowクラス自体を作ることができないのでしょうか?
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -