using System;

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

using Microsoft.WindowsCE.Forms;

namespace ComboBoxEx
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            
            #if DEBUG
                MinimizeBox = false;
            #else       
                MinimizeBox = true;
            #endif
        }

        // константы для сообщений комбинированного окна Combobox

        /// <summary>
        /// Сообщение, получающее размеры выпадающего списка
        /// комбинированного окна
        /// </summary>
        const int CB_GETDROPPEDWIDTH = 0x015f;

        /// <summary>
        /// Сообщение, устанавливающее размеры выпадающего списка 
        /// комбинированного окна
        /// </summary>
        const int CB_SETDROPPEDWIDTH = 0x0160;

        /// <summary>
        /// Сообщение, позволяющее раскрыть или скрыть выпадающий список
        /// </summary>
        private const int CB_SHOWDROPDOWN = 0x014f;

        // Константы, используемые в сообщении CB_SHOWDROPDOWN
        private const int OPEN = 1;
        private const int CLOSE = 0;

        /// <summary>
        /// Сообщение, получающее текущее состояние выпадающего списка у ComboBox
        /// </summary>
        const int CB_GETDROPPEDSTATE = 0x0157;

        /// <summary>
        /// Сообщение, позволяющее найти строку в ComboBox
        /// </summary>
        const int CB_FINDSTRING = 0x14c;

        // Функция Windows API
        [DllImport("coredll.dll")]
        internal static extern int SendMessage(IntPtr hWnd, 
            int msg, 
            int wParam, 
            string lParam);

        
        // процедура установки ширины выпадающего списка у Combobox
        private void SetDropDownWidth(IntPtr handle, int width)
        {
            // Создаем сообщение
            Message CBOXMESSAGE = Message.Create(
                this.comboBox1.Handle, 
                CB_SETDROPPEDWIDTH, (IntPtr)width, IntPtr.Zero);
            MessageWindow.SendMessage(ref CBOXMESSAGE);
        }

        // процедура получения текущей ширины выпадающего списка у Combobox
        private int GetDropDownWidth(ComboBox cbox)
        {
            // Создаем сообщение
            Message CBOXMESSAGE = Message.Create(
                this.comboBox1.Handle, 
                CB_GETDROPPEDWIDTH, IntPtr.Zero, IntPtr.Zero);
            MessageWindow.SendMessage(ref CBOXMESSAGE);

            return (int)CBOXMESSAGE.Result;
        }

        // процедура получения состояние выпадающего списка у ComboBox
        bool DroppedState(ComboBox cbox)
        {
            // Создаем сообщение
            Message CBOXMESSAGE = Message.Create(cbox.Handle, 
                CB_GETDROPPEDSTATE, IntPtr.Zero, IntPtr.Zero);
            MessageWindow.SendMessage(ref CBOXMESSAGE);

            return CBOXMESSAGE.Result != IntPtr.Zero;
        }

        private void butSetWidthCB_Click(object sender, EventArgs e)
        {
            // Устанавливаем ширину combobox в 230 пикселов
            SetDropDownWidth(comboBox1.Handle, 230);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.Items.Add("Рыжик");
            comboBox1.Items.Add("Васька");
            comboBox1.Items.Add("Мурзик");
            comboBox1.Items.Add("КотСОченьДлиннымИменем");

            MessageBox.Show(
                "Длина ComboBox равна: " + 
                GetDropDownWidth(comboBox1).ToString());
        }

        private void butShowDrop_Click(object sender, EventArgs e)
        {
            // Создаем сообщение
            Message CBOXMESSAGE = Message.Create(
                this.comboBox1.Handle, CB_SHOWDROPDOWN, 
                (IntPtr) OPEN, IntPtr.Zero);
            MessageWindow.SendMessage(ref CBOXMESSAGE);
        }

        private void butHideDrop_Click(object sender, EventArgs e)
        {
            // Создаем сообщение
            Message CBOXMESSAGE = Message.Create(
                this.comboBox1.Handle, CB_SHOWDROPDOWN, 
                (IntPtr)CLOSE, IntPtr.Zero);
            MessageWindow.SendMessage(ref CBOXMESSAGE);
        }

        private void menuItemExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void menuItemCheckState_Click(object sender, EventArgs e)
        {
            if(DroppedState(comboBox1))
                lbInfo.Text = "Список открыт";
            else
                lbInfo.Text = "Список скрыт";
        }

        private void txtTest_TextChanged(object sender, EventArgs e)
        {
            // Поиск строки по вводимым символам
            comboBox1.SelectedIndex = SendMessage(comboBox1.Handle,
                CB_FINDSTRING, -1, txtTest.Text);
        }
    }
}