private static extern int SetWindowLong(IntPtr hWnd, int nIndex,
int dwNewLong);
public const int GWLSTYLE = -16;
// стиль многострочного текста
public const int BS_MULTILINE = 0x2000;
private void Form1_Load(object sender, EventArgs e) {
IntPtr hWnd;
int style;
this.butMultiline.Capture = true;
hWnd = GetCapture();
this.butMultiline.Capture = false;
style = GetWindowLong(hWnd, GWL_STYLE);
SetWindowLong(hWnd, GWL_STYLE, style | BS_MULTILINE);
}
В этом примере для сравнения использовались две кнопки. На каждой из них размещен достаточно длинный текст (рис. 4.2).
Рис. 4.2. Вид кнопок в процессе программирования
При загрузке формы выполняется изменение стиля для первой кнопки butMultiline
, а вторая кнопка остается без изменений. После запуска приложения можно заметить, что длинный текст в первой кнопке разбивается на две строки и полностью умещается в границах кнопки. Во второй кнопке слова обрезаются, и текст просто нельзя прочитать (рис. 4.3).
Рис. 4.3. Создание многострочного текста на кнопке
Данный пример был написан еще для .NET Compact Framework 1.0. В .NET Compact Framework 2.0 нет надобности вызывать функцию GetCapture() для получения дескриптора hWnd, так как теперь поддерживается свойство Control.Handle.
Увеличение ширины выпадающего списка ComboBox
Выпадающий список у комбинированного окна равен ширине самого комбинированного окна ComboBox
. Но можно обойти это ограничение с помощью неуправляемого кода, как показано в листинге 4.4.
/// <summary>
/// Сообщение, получающее размеры выпадающего списка
/// комбинированного окна
/// </summary>
const int CB_GETDROPPEDWIDTH = 0x015f;
/// <summary>
/// Сообщение, устанавливающее размеры выпадающего списка
/// комбинированного окна
/// </summary>
const int CB_SETDROPPEDWIDTH = 0x0160;
[DllImport('coredll.dll')]
static extern int SendMessage(IntPtr hwnd, int msg, int wParam, int lParam);
private void Form1_Load(object sender, EventArgs e) {
comboBox1.Items.Add('Раз');
comboBox1.Items.Add('Два');
comboBox1.Items.Add('Три');
comboBox2.Items.Add('Длинный текст');
comboBox2.Items.Add('Очень длинный текст');
comboBox2.Items.Add('Hy очень длинный текст');
// Устанавливаем желаемую ширину
SendMessage(comboBox2.Handle, CB_SETDROPPEDWIDTH, 200, 0);
// Получим ширину выпадающего окна
int retval = SendMessage(comboBox2.Handle, CB_GETDROPPEDWIDTH, 0, 0);
this.Text = retval.ToString();
}
На форме надо разместить два элемента ComboBox
. Один из них будет стандартным. А второй элемент обработает сообщение CB_SETDROPPEDWIDTH
со значением второго параметра 200. В результате выпадающий список будет в ширину занимать 200 пикселов.
После запуска программы сначала надо обратить внимание на работу первого комбинированного окна (рис. 4.4). Оно ведет себя стандартным образом.
Рис. 4.4. Стандартный размер выпадающего списка
Теперь нужно перейти ко второму комбинированному окну. У него размер выпадающего списка увеличился, что позволяет увидеть весь текст (рис. 4.5).
Рис. 4.5. Увеличенный размер выпадающего списка у ComboBox
ListBox
Элемент ListBox
имеет множество возможностей, которые пока не реализованы в рамках платформы .NET Compact Framework. В частности, данный элемент не позволяет осуществлять поиск элементов по первым символам. Но для решения этой задачи можно использовать сообщение LB_FINDSTRING
.
Чтобы создать тестовое приложение, нужно добавить на форму список ListBox
и текстовое поле TextBox
. Также потребуется ввести код, приведенный в листинге 4.5.
const int LB_FINDSTRING = 0x018F;
const int LB_FINDSTRINGEXACT = 0x01A2;
[DllImport('coredll.dll')]