03.Aero での背景色 で、触れていますが、コントロールの内部的なステータスを取得するために、リフレクションを使う必要があります。

これも拡張メソッドで定義しておきましょう。

 private const int STATE_ENABLED = 0x00000004;
 
 private static MethodInfo m_GetStateMethod = typeof(Control).GetMethod(
                                     "GetState",
                                     BindingFlags.NonPublic | BindingFlags.Instance,
                                     null,
                                     new Type[] { typeof(int) }
                                     , null
                                     );
 
 internal static bool GetStateInternal(this Control target, int flag)
 {
     return (bool)m_GetStateMethod.Invoke(target, new object[] { flag });
 }
 
 internal static bool GetEnabledInternal(this Control target)
 {
     return target.GetStateInternal(STATE_ENABLED);
 }

こんな感じで使うことになります。

 [DllImport("user32")]
 [return: MarshalAs(UnmanagedType.Bool)]
 public static extern bool EnableWindow(HandleRef hWnd, [MarshalAs(UnmanagedType.Bool)] bool fEnable); 
 
 if (IsHandleCreated)
 {
     EnableWindow(new HandleRef(this, Handle), this.GetEnabledInternal());
     if (GetStyle(ControlStyles.UserPaint))
     {
         Invalidate();
         Update();
     }
 }



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-12-14 (土) 01:15:11 (1291d)