- •"Combobox"
- •Void winapi InitCommonControls(void)
- •Idd_controlsdlg dialog 260, 200, 180, 120
- •Int apientry WinMain (hinstance hinstance, hinstance hPrevInstance,
- •Idd_controlsdlg dialog 260, 200, 180, 120
- •Idd_controlsdlg dialog 260, 200, 180, 120
- •Int apientry WinMain (hinstance hinstance, hinstance hPrevInstance, lpstr lpCmdLine, int nCmdShow)
Idd_controlsdlg dialog 260, 200, 180, 120
СТИЛЬ DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
Подписью "Элементы управления Windows"
FONT 8, "MS Shell Dlg"
НАЧАТЬ
DEFPUSHBUTTON "Закрыть", IDCANCEL, 120, 100, 50, 14
LTEXT "Страна:", IDC_STATIC, 10, 10, 25, 8
COMBOBOX IDD_COUNTRIES_CBO, 40, 8, 90, 60,
WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWN
КОНЕЦ
Для создания списка элементов в поле со списком, измените файл Exercise.cpp следующим образом:
#include <windows.h>
#ifdef __BORLANDC__
#pragma argsused
#endif
#include "resource.h"
// ------------------------------------------------ ---------------------------
HWND HWND;
LRESULT CALLBACK DlgProc (HWND HWND, UINT Msg, WPARAM WPARAM, LPARAM LPARAM);
// ------------------------------------------------ ---------------------------
Int apientry WinMain (hinstance hinstance, hinstance hPrevInstance, lpstr lpCmdLine, int nCmdShow)
{
hInst = HINSTANCE;
DialogBox (HINSTANCE, MAKEINTRESOURCE (IDD_CONTROLSDLG),
HWND, reinterpret_cast <DlgProc> (DlgProc));
вернуть 0;
}
// ------------------------------------------------ ---------------------------
LRESULT CALLBACK DlgProc (HWND hWndDlg, UINT Msg, WPARAM WPARAM, LPARAM LPARAM)
{
HWND cboCountries;
строительства символ * Страны [] = {"Шри-Ланка", "Сальвадор", "Ботсвана",
"Франция", "Куба", "Южная Африка",
"Австралия", "Россия", "Ямайка",
"Великобритания", "Сенегал", "Бангла Дэш"};
Переключатель (MSG)
{
Дело WM_INITDIALOG:
cboCountries = GetDlgItem (hWndDlg, IDD_COUNTRIES_CBO);
для (INT = 0 Граф, граф <12; Кол-во ++)
{
SendMessage (cboCountries,
CB_ADDSTRING,
0,
reinterpret_cast <> (LPARAM (LPCTSTR) Страны [Count]));
}
вернуться TRUE;
Дело WM_COMMAND:
переключатель (WPARAM)
{
Дело IDCANCEL:
EndDialog (hWndDlg, 0);
вернуться TRUE;
}
перерыв;
}
вернуться false;
}
// ------------------------------------------------ ---------------------------
Тестирование приложения
Вернуться к среде программирования
Сортировка элементов в списке
Как элементы добавляются в список в поле со списком, они создают C ++ тип массив, индексированный так, что первый пункт списка имеет числовое положение 0, второй 1, и т.д. Этот показатель позволит вам выполнить Различные операции по пунктам размещения по желаемой основанную на индексе.
Пункты со списком которые в совокупности добавлен в список, который, в порядке. Если вы хотите, чтобы устроить их в алфавитном порядке, при создании поля со списком, добавить стиль CBS_SORT. Когда этот стиль установлен, элементы автоматически и надлежащим образом вставлен в порядке, основанном на языке компьютера, как установить в панели управления. Таким образом, каждый раз, когда вы добавляете элемент в список с помощью сообщение CB_ADDSTRING, список отсортирован переставить его.
Удаление элементов из списка
В отличие от добавления деталь, если список уже содержит строки, и вы хотите, чтобы удалить элемент из списка, вызовите функцию SendMessage (), передавая тип сообщения как CB_DELETESTRING и индекс нежелательного элемента в качестве значения LPARAM.
Вот пример, который удаляет четвертый пункт списка:
SendMessage (cboCountries, CB_DELETESTRING, 3, 0);
Если вы хотите, чтобы удалить все элементы из выпадающего списка, вызовите функцию SendMessage () с сообщением CB_RESETCONTENT. Два сопровождающих аргументы, WPARAM и LPARAM, не используются.
Выбор пункта
После того, как список в поле со списком был создан, пользователь может щелкнуть элемент в списке, чтобы выбрать его. Чтобы выбрать элемент в выпадающем списком, пользователь может щелкнуть стрелкой вниз или нажмите Alt + Стрелка вниз. Любое из этих действий приводит список выпадающего списком для отображения. Вы также, как программист, можно отобразить список программно в любое время, даже если пользователь нажимает другую контроля. Для отображения списка, вы можете отправить сообщение CB_SHOWDROPDOWN в функции SendMessage (). Аргумент WPARAM несет истинное значение, если вы хотите, чтобы отобразить список. Аргумент LPARAM не используется. Вот пример:
SendMessage (cboCountries, CB_SHOWDROPDOWN ИСТИНА, 0);
Элемент, который выбран в списке обычно называют текущего выделения. Вы также, как программист может выбрать пункт в любое время. Например, после создания списка, вы можете указать пункт по умолчанию будет показан в рамках редактирования контроля.
Чтобы выбрать элемент из списка, вы можете отправить сообщение CB_SETCURSEL в функции SendMessage (). Как элементы 0 на основе, чтобы выбрать конкретный пункт, пройти его индекс в качестве параметра WPARAM. Аргумент lpParam не используется.
Вот пример, который выбирает четвертый пункт в списке:
SendMessage (cboCountries, CB_SETCURSEL, 3, 0);
Альтернативой выбора строку в поле со списком, чтобы отправить сообщение WM_SETTEXT в поле со списком с помощью функции SendMessage (). В этом случае, аргумент WPARAM не используется. Аргумент LPARAM несет строку, чтобы выбрать. Вот пример:
SendMessage (cboCountries, WM_SETTEXT, 0, (LPARAM) Страны [5]);
До сих пор мы уже упоминали, что две категории комбинированных окон: простой и упасть. Мы также увидели, что пользователь может нажать стрелку выпадающего стиле, чтобы отобразить список. Падение вниз версии есть еще одну характеристику: она позволяет пользователю нажмите на редактировать часть управления и начать печатать. Это может позволить пользователю найти матч строки на основе типизированных писем. В некоторых случаях, вы можете пользователю только быть в состоянии выбрать пункт в списке, не набрав его. В этом случае поле со списком обеспечивает стиль CBS_DROPDOWNLIST. Когда этот стиль был добавлен, редактировать часть контроля отключена или устранены; она становится только держатель место для выбранного элемента.
Ширина Combo Box
При создании наших выпадающие списки, мы узнали, чтобы указать их ширину. После списком была создана, если вы хотите, чтобы найти его ширину, вы можете вызвать функцию SendMessage () с сообщением CB_GETDROPPEDWIDTH. Оба WPARAM и аргументы LPARAM не используются. Если функция SendMessage () преуспевает в его просьбе, он возвращает текущую ширину выпадающего списка.
Иногда после добавления элемента в списке, вы можете узнать, что это долго, чем ширина поля со списком можно отобразить. Хотя существуют различные способы, вы можете изменять размер элемента управления, поле со списком обеспечивает собственную и (очень) простой механизм, чтобы изменить его ширину. Это может быть сделано путем отправки сообщения CB_SETDROPPEDWIDTH с помощью функции SendMessage (). Аргумент WPARAM используется для указания нового нужную ширину. Аргумент LPARAM не используется.
SendMessage (cboCountries, CB_SETDROPPEDWIDTH, 240, 0);
Получение выбранного элемента
В любое время, чтобы выяснить, какой элемент был выбран или какой элемент является отображение в редактирования части управления, вы можете вызвать функцию SendMessage () с сообщением CB_GETCURSEL. Когда функция вызывается с этим сообщением, он проверяет поле со списком в первую очередь. Если пункт выбран, то она возвращает его. Если ни один элемент не выбран, эта функция возвращает CB_ERR.
Альтернативой для получения строку, выбранную в комбинированном окне, чтобы отправить WM_GETTEXT в поле со списком с помощью функции SendMessage (). WPARAM это длина строки. Аргумент LPARAM является переменной, в которую Строка будет скопирована.
Combo Box События
Список Показать События
Когда списком создается как упасть, чтобы выбрать пункт из списка, пользователь должен отобразить список. Это делается либо нажав стрелкой вниз или нажав Alt и клавишу со стрелкой вниз (на клавиатуре). Однако это будет сделано, когда пользователь решает для отображения списка, просто до появления списка, поле со списком отправляет сообщение CBN_DROPDOWN в диалоговом окне или объекта, на котором размещен выпадающий список. Вы можете сделать некоторые последнюю минуту обработку до появления списка. Например, вы можете перехватить это сообщение и предотвратить список отображать, или вы можете обновить его, ничего.
Поскольку это сообщение приходит от контроля за ребенком, диалоговое окно обрабатывает его как сообщение WM_COMMAND. Списком, который посылает это сообщение может быть идентифицированы с использованием младшее слово аргумента WPARAM процедуры. В следующем примере, сообщение перехватывается и используется, чтобы пользователю знать, прежде чем играть список:
// ------------------------------------------------ ---------------------------
LRESULT CALLBACK DlgProc (HWND hWndDlg, UINT Msg, WPARAM WPARAM, LPARAM LPARAM)
{
HWND cboCountries;
строительства символ * Страны [] = {"Шри-Ланка", "Сальвадор", "Ботсвана",
"Франция", "Куба", "Южная Африка",
"Австралия", "Россия", "Ямайка",
"Великобритания", "Сенегал", "Бангла Дэш"};
Переключатель (MSG)
{
Дело WM_INITDIALOG:
cboCountries = GetDlgItem (hWndDlg, IDD_COUNTRIES_CBO);
для (INT = 0 Граф, граф <12; Кол-во ++)
{
SendMessage (cboCountries,
CB_ADDSTRING,
0,
reinterpret_cast <> (LPARAM (LPCTSTR) Страны [Count]));
}
SendMessage (cboCountries, CB_SETCURSEL, 3, 0);
перерыв;
Дело WM_COMMAND: // Окна управления обработки
переключатель (LOWORD (WPARAM)) // Этот переключатель определяет контроль
{
Дело IDD_COUNTRIES_CBO: // Если поле со списком послал сообщение,
переключатель (HIWORD (WPARAM)) // Узнайте, что сообщение было
{
Дело CBN_DROPDOWN: // Это означает, что список собирается показывать
MessageBox (hWndDlg, "запрос для отображения списка было сделано",
"Показывать уведомление", MB_OK);
перерыв;
}
перерыв;
Дело IDCANCEL:
EndDialog (hWndDlg, 0);
вернуться TRUE;
}
перерыв;
}
вернуться false;
}
// ------------------------------------------------ ---------------------------
Мы уже упоминали, что, в отличие от пользователя отображение списка, вы также можете отобразить его, отправив сообщение CB_SHOWDROPDOWN. В любое время вы можете выяснить список в настоящее время отображения отправив сообщение CB_GETDROPPEDSTATE в поле со списком.
После того как пользователь закончит работать с список со списком, он или она может закрыть его. Это может быть сделано путем выбора пункта, нажав стрелкой вниз, или нажав клавишу Esc. Во всех случаях, это действие закрывает или скрывает список, а затем поле со списком отправляет сообщение CBN_CLOSEUP его родителя. Вот пример:
// ------------------------------------------------ ---------------------------
LRESULT CALLBACK DlgProc (HWND hWndDlg, UINT Msg, WPARAM WPARAM, LPARAM LPARAM)
{
HWND cboCountries;
строительства символ * Страны [] = {"Шри-Ланка", "Сальвадор", "Ботсвана",
"Франция", "Куба", "Южная Африка",
"Австралия", "Россия", "Ямайка",
"Великобритания", "Сенегал", "Бангла Дэш"};
Переключатель (MSG)
{
Дело WM_INITDIALOG:
cboCountries = GetDlgItem (hWndDlg, IDD_COUNTRIES_CBO);
для (INT = 0 Граф, граф <12; Кол-во ++)
{
SendMessage (cboCountries,
CB_ADDSTRING,
0,
reinterpret_cast <> (LPARAM (LPCTSTR) Страны [Count]));
}
SendMessage (cboCountries, CB_SETCURSEL, 3, 0);
перерыв;
Дело WM_COMMAND: // Окна управления обработки
переключатель (LOWORD (WPARAM)) // Этот переключатель определяет контроль
{
Дело IDD_COUNTRIES_CBO: // Если поле со списком послал сообщение,
переключатель (HIWORD (WPARAM)) // Узнайте, что сообщение было
{
Дело CBN_DROPDOWN: // Это означает, что список собирается показывать
MessageBox (hWndDlg, "запрос для отображения списка было сделано",
"Показывать уведомление", MB_OK);
перерыв;
Дело CBN_CLOSEUP:
MessageBox (hWndDlg, "список будет закрыта",
"Список Закрыть Уведомление", MB_OK);
перерыв;
}
перерыв;
Дело IDCANCEL:
EndDialog (hWndDlg, 0);
вернуться TRUE;
}
перерыв;
}
вернуться false;
}
// ------------------------------------------------ ---------------------------
Выбор событий, связанных с
После того как пользователь выбрал пункт из списка, поле со списком отправляет сообщение CBN_SELCHANGE его родителей, а затем список закроется. Вы можете это событие или связанные CBN_CLOSEUP событие, чтобы найти, что пользователь выбрал, если таковые имеются.
Если пользователь выводит список и нажимает на элемент, список убирается. Если выбор был успешным (иногда что-то может пойти не так), выпадающий список посылает сообщение CBN_SELENDOK. С другой стороны, если пользователь отображает список, но не выбрать пункт, а затем либо нажимает стрелкой вниз, нажимает где-то еще, или нажимает клавишу Esc, выпадающий список позволяет его родитель знает, что ничего не было выбрано. Чтобы сделать это, он посылает сообщение CBN_SELENDCANCEL.
