- •Лекции 4- 5
- •Элементы
- •Основные стандартные
- •Создание
- •Кнопки – класс “button”
- •BS_LEFTTEXT
- •Кнопки могут находиться в двух состояниях: нажатом и отжатом. Для управления этими состояниями
- •Кнопки стилей BS_3STATE, BS_CHECKBOX, BS_RADIOBUTTON не перерисовываются при их переключении. Для выполнения этого
- •Статический элемент
- •SS_BLACKFRAME
- •Редактор текста –
- •ES_AUTOHSCROLL
- •Сообщения для редактора текста
- •Младшее слово wParam – идентификатор.
- •Пример
- •Функции StrToInt и IntToStr() для перевода строки в целое число и обратно.
- •LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
- •case WM_COMMAND:
- •Пример работы программы
- •Списки строк –
- •Список со стиле LBS_NOTIFY посылает в окно сообщение MW_COMMAND. При этом младшее слово
- •Сообщения для списка строк
- •Сообщения для списка строк
- •Пример
- •int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {
- •//Функция InitApp
- •LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
- •case WM_COMMAND:
- •// Когда главное окно приложения получает фокус ввода, отдаем фокус списку case WM_SETFOCUS:
- •http://www.frolov-lib.ru/books/bsp/v12/ch2_5.htm
- •Комбинированный
- •Сообщения от комбинированного списка
- •Сообщения для комбинированного списка
- •Сообщения для комбинированного списка
- •Пример
- •int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
- •BOOL InitApp(HINSTANCE hInstance)
- •LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
- •case WM_COMMAND:
- •case WM_SETFOCUS:
- •http://www.frolov-lib.ru/books/bsp/v12/ch2_6.htm
- •Следующая
Пример работы программы
Списки строк –
класс “listbox”
Списки строк создают на базе класса “listbox”. Строки в списке нумерует операционная система начиная с 0. Списки могут быть одноколоночные и многоколоночные, с вертикальной и горизонтальной полосой просмотра.
При создании списка первый параметр функции CreateWindow должен содержать “listbox”, второй параметр – NULL, а третий параметр должен содержать стиль создаваемого списка.
|
Стили списка строк |
LBS_DISABLENOSCROLL |
Запретить убирать вертикальную полосу прокрутки, если |
|
она не нужна |
LBS_EXTENDEDSEL |
Возможность выделения нескольких строк с помощью |
|
клавиши shift |
LBS_HASSTRINGS |
Список посылает родительскому окну сообщение |
|
WM_VKEYTOITEM с кодом виртуальной клавиши |
|
(LOWORD)wParam, с номером текущей строки |
|
(HIWORD)wParam и дескриптором списка lParam |
LBS_MULTICOLUMN |
Многоколоночный список. Количество колонок задают |
|
сообщением LB_SETCOLUMNWIDTH |
LBS_MULTIPLESEL |
С помощью клавиши shift или мыши можно выделять |
|
несколько строк в любом месте списка |
LBS_NOINTEGRALHEIGHT |
Высота окна не обязательно кратна высоте строк |
LBS_NOREDRAW |
Не перерисовывать содержимое при добавлении или |
|
удалении строк |
|
Стили списка строк |
LBS_NOSEL |
Окно списка содержит элементы, которые могут |
|
просматриваться, но не выбираться. |
LBS_NOTIFY |
Сообщить о двойном щелчке мыши по строке |
LBS_OWNERDRAWFIXED |
Список строк одинаковой высоты, перерисовывается |
|
родительским окном |
LBS_OWNERDRAWVARIABLE |
Список строк переменной высоты, перерисовывается |
|
родительским окном |
LBS_SORT |
Сортировать строки в алфавитном порядке |
LBS_STANDART |
Комбинация LBS_NOTIFY, LBS_SORT, WS_BORDER, |
|
WS_VSCROLL |
LBS_USETABSTOPS |
При отображении строк преобразовывать символы |
|
табуляции |
LBS_WAITKEYBOARDINPUT |
Родительское окно от списка получает сообщения |
|
WM_KEYTOITEM или WM_CHARTOITEM при работе |
|
со списком при помощи клавиатуры |
Список со стиле LBS_NOTIFY посылает в окно сообщение MW_COMMAND. При этом младшее слово wParam равно идентификатору списка, параметр lParam содержит дескриптор списка.
А старшее слово wParam содержит одно из следующих значений:
LBN_DBLCLK |
Двойной щелчок левой клавишей мыши по строке |
|
списка |
|
|
LBN_ERRSPACE |
Ошибка при попытке заказать дополнительную память |
|
|
LBN_KILLFOCUS |
Список потерял фокус ввода |
|
|
LBN_SELCANCEL |
Пользователь отменил выбор с списке |
|
|
LBN_SELCHANGE |
Изменился номер выбранной строки |
|
|
LBN_SETFOCUS |
Список получил фокус ввода |
|
|
Сообщения для списка строк |
|
LB_ADDSTRING, 0 |
Добавить в список строку lpszStr, возвращает номер |
lParam = lpszStr |
строки |
LB_DELETESTRING, |
Удалить строку с номером nIndex из списка. |
wParam = nIndex, 0L |
Возвращает количество оставшихся в списке строк. |
LB_DIR, wParam = uAttr, |
Заполнить список именами дисков, каталогов и |
lParam = lpszFileSpec |
файлов с атрибутами uAttr по шаблоны lpszFileSpec |
|
из текущего каталога. Возвращает номер |
|
последнего добавленного списка |
LB_FINDSTRING, wParam = |
Начиная со строки с номером nStart искать строку с |
nStart, lParam = lpszStr |
префиксом lpszStr. Возвращает номер или код |
|
ошибки |
LB_FINDSTRINGEXACT, wParam |
Начиная со строки с номером nStart искать строку |
= nStart, lParam = lpszStr |
lpszStr. Возвращает номер или код ошибки |
LB_GETCARETINDEX, 0, 0L |
Определение номера строки, имеющей фокус |
|
ввода. Возвращает номер этой строки или код |
|
ошибки |
LB_GETCOUNT, 0, 0L |
Определить количество строк в списке. Возвращает |
|
количество строк или код ошибки |
|
Сообщения для списка строк |
|
|
|
|
LB_GETCURSEL, 0, 0L |
|
Определение номера выделенной строки. Возвращает |
|
|
номер строки или код ошибки |
|
|
|
LB_GETSEL, wParam = |
|
Определить: выбрана ли строка с номером nIndex. |
nIndex, 0L |
|
Возвращает положительное число – если выбрана, 0 – |
|
|
если нет или код ошибки |
|
|
|
LB_GETSELCOUNT, 0, 0L |
|
Определить количество выбранных строк. Возвращает |
|
|
количество или код ошибки |
|
|
|
LB_GETSELITEMS, |
|
Заполнить буфер lpBuff размера cnt номерами выбранных |
wParam = cnt, lParam = |
|
строк. Возвращает количество записанных в буфер |
(int far *)lpBuff |
|
номеров или код ошибки |
|
|
|
LB_GETTEXT, wParam = |
|
Копировать текст строки с номером nIndex в буфер lpBuff. |
nIndex, lParam = lpBuff |
|
Возвращает длину строки или код ошибки |
|
|
|
LB_GETTEXTLEN, |
|
Определить длину строки с номером nIndex. Возвращает |
wParam = nIndex, 0L |
|
длину или код ошибки |
|
|
|
LB_GETTPOINDEX, 0, 0L |
|
Определить номер первой отображаемой строки. |
|
|
Возвращает номер строки или код ошибки |
|
|
|
Сообщения для списка строк
LB_INSERTSTRING, wParam= |
Вставить строку lpBuff на позицию nIndex в список. |
nIndex, lParam = lpBuff |
Возвращает номер или код ошибки |
|
|
LB_RESETCONTENT, 0, 0L |
Удалить все строки из списка. |
|
|
LB_SELECTSTRING, wParam = |
Начиная с позиции nStart найти и выделить строку с |
nStart, lParam = lpszPrefix |
префиксом lpszPrefix. Возвращает номер строки или |
|
код ошибки |
|
|
LB_SELITEMRANGE, wParam |
Выделить (fSelect=TRUE) или отменить выделение |
= (BOOL)fSelect, lParam = |
(fSelect=FALSE) строк с номерами от wF до wL. |
MAKELPARAM(wF, wL) |
Возвращает код ошибки |
|
|
LB_SETCARETINDEX, wParam |
Передать фокус ввода строке с номером nIndex. fS |
= nIndex, MAKELPARAM(fS, 0) |
управляет сверткой (частично или полностью видна). |
|
Возвращает код ошибки. |
|
|
LB_SETCURSEL, wParam = |
Отменить предыдущий выбор и выбрать строку с |
nIndex, 0L |
номером nIndex. |
|
|
LB_SETTOPINDEX, wParam = |
Сверка списка до тех пор, пока строка с номером |
nIndex, 0L |
nIndex не станет видимой |
|
|
Пример
Программа создает и заполняет простейший одноколоночный список, а также кнопку «ОК», при нажатии на которую в центре экрана выводится MessageBox с сообщением, соответствующим содержанию выбранной строки.
#include <windows.h> |
|
#define ID_LIST 10000 |
// Идентификатор списка |
#define ID_BUTTON 20000 |
// Идентификатор кнопки |
// Прототипы функций BOOL InitApp(HINSTANCE);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
char const szClassName[] = "ListBoxAppClass"; |
// Имя класса окна |
|
char const szWindowTitle[] = "ListBox Demo"; |
// Заголовок окна |
|
HINSTANCE hInst; |
// Идентификатор копии приложения |
int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {
MSG msg; // структура для работы с сообщениями HWND hwnd; // идентификатор главного окна приложения
if(!InitApp(hInstance)) |
// Инициализируем приложение |
return FALSE; |
|
hInst = hInstance; // Сохраняем идентификатор копии приложения // в глобальной переменной
hwnd = CreateWindow(szClassName, szWindowTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, 0, 0, hInstance, NULL);
if(!hwnd) return FALSE; |
|
ShowWindow(hwnd, nCmdShow); |
// Рисуем главное окно |
UpdateWindow(hwnd); |
|
while(GetMessage(&msg, 0, 0, 0)) // Запускаем цикл обработки сообщений
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}