Климов Александр Петрович
Шрифт:
Рис. 4.4. Стандартный размер выпадающего списка
Теперь нужно перейти ко второму комбинированному окну. У него размер выпадающего списка увеличился, что позволяет увидеть весь текст (рис. 4.5).
Рис. 4.5. Увеличенный размер выпадающего списка у ComboBox
ListBox
Элемент
ListBox
имеет множество возможностей, которые пока не реализованы в рамках платформы .NET Compact Framework. В частности, данный элемент не позволяет осуществлять поиск элементов по первым символам. Но для решения этой задачи можно использовать сообщение LB_FINDSTRING
. Чтобы создать тестовое приложение, нужно добавить на форму список
ListBox
и текстовое поле TextBox
. Также потребуется ввести код, приведенный в листинге 4.5. Листинг 4.5
const int LB_FINDSTRING = 0x018F;
const int LB_FINDSTRINGEXACT = 0x01A2;
[DllImport("coredll.dll")]
static extern int SendMessage(IntPtr hwnd, int msg,
int wParam, string lParam);
private void textBox1_TextChanged(object sender, EventArgs e) {
//поиск строки по вводимым символам
listBox1.SelectedIndex =
SendMessage(listBox1.Handle, LB_FINDSTRING, -1, textBox1.Text);
}
private void Form1_Load(object sender. EventArgs e) {
listBox1.Items.Add("bank");
listBox1.Items.Add("banana");
listBox1.Items.Add("ball");
listBox1.Items.Add("bounty");
listBox1.Items.Add("bar");
}
После запуска проекта можно попробовать ввести в текстовом поле любое слово. Если в списке есть слова, начинающиеся с введенных символов, то они начнут выделяться в списке. Например, можно сначала ввести символ
b
, затем a
и, наконец, l
. Сначала будет выделено слово bank
, а после третьего введенного символа выделение перейдет на слово ball
. Существует также сообщение
LB_FINDSTRINGEXACT
, которое осуществляет поиск по целому слову без учета регистра. Имеет смысл применять его, когда список содержит сотни записей и отыскивание нужного слова становится утомительным занятием. Чтобы показать применение этого сообщения, нужно добавить в предыдущий пример дополнительную кнопку и ввести код, приведенный в листинге 4.6. Листинг 4.6
private void button1_Click(object sender, EventArgs e) {
listBox1.SelectedIndex =
SendMessage(listBox1.Handle, LB_FINDSTRINGEXACT, -1, "ball");
}
ListView
Возможно, вы замечали, что в некоторых программах используется элемент
ListView
с градиентной заливкой. Например, такое оформление интерфейса можно увидеть в списке контактов. Оказывается, совсем не сложно применить такую раскраску в своем приложении. Но для этого надо использовать стиль LVS_GRADIENT
, как показано в листинге 4.7. Листинг 4.7
using System.Runtime.InteropServices;
[DllImport("coredll.dll")]
static extern int SendMessage(IntPtr hwnd, uint msg, int wParam, int lParam);
const int LVS_EX_GRADIENT = 0x20000000;
const int LVM_SETEXTENDEDLISTVIEWSTYLE = 0x1000 + 54;
// Создаем градиентный фон для ListView
private void CreateGradientListView(ListView listView) {
// Получим дескриптор ListView
IntPtr hLV = listView.Handle;
// Устанавливаем расширенный стиль
SendMessage(hLV, (uint)LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_GRADIENT);
// Обновляем вид
listView.Refresh;
}
private void Form1_Load(object sender, EventArgs e) {
CreateGradientListView(listView1);