Top / .NET備忘録 / 04.最難関!ComboBox / 01.ComboBoxInfo と GetComboBoxInfo

ComboBox は、複数のコントロールからなっていますが、これらの情報を取得するために、GetComboBoxInfo という API があります。(Windows 2000 以降)

    [DllImport("user32")]
    public static extern bool GetComboBoxInfo(HandleRef hwndCombo, ComboBoxInfo cbinfo);

ComboBox のハンドルを指定し、ComboBoxInfo 構造体で情報を受け取ります。

ComboBoxInfo 構造体 は次のように宣言します。

    [StructLayout(LayoutKind.Sequential)]
    public class ComboBoxInfo
    {
        public int Size;
        public Rectangle RectItem;
        public Rectangle RectButton;
        public int ButtonState;
        public IntPtr ComboBoxHandle;
        public IntPtr EditBoxHandle;
        public IntPtr ListBoxHandle;
        public ComboBoxInfo()
        {
            this.Size = Marshal.SizeOf(this);
        }
    }

OnHandleCreate メソッドが呼び出されたときに実行し、EditBox のハンドルと、ListBox のハンドルを取得しておきます。

    private IntPtr m_EditBoxHandle;
    private IntPtr m_ListBoxBoxHandle;
 
    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
 
        HandleRef hr = new HandleRef(this, this.Handle);
        ComboBoxInfo ci = new ComboBoxInfo();
 
        if (GetComboBoxInfo(hr, ci))
        {
            m_EditBoxHandle = ci.EditBoxHandle;
            m_ListBoxBoxHandle = ci.ListBoxHandle;
        }
        else
        {
            m_EditBoxHandle = IntPtr.Zero;
            m_ListBoxBoxHandle = IntPtr.Zero;
        }
    }
 
    protected IntPtr EditBoxHandle
    {
        get { return m_EditBoxHandle; }
    }
 
    protected IntPtr ListBoxHandle
    {
        get { return m_ListBoxBoxHandle; }
    }

.NET Framework のソースを見ると 9x 系や、NT4.0 などもターゲットに入っているので GetWindow を使ってこれらを取得していますが、気にしないことにします。(^_^;)




トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-03-05 (火) 17:50:43 (1573d)