Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ІК (Говорущенко) Методичка.doc
Скачиваний:
6
Добавлен:
23.02.2016
Размер:
762.88 Кб
Скачать

Списки рядків

Створення списку. Списки рядків створюють на базі класу LISTBOX. Рядки в списку нумерує операційна система, і номер першого рядка дорівнює 0. Списки можуть бути одноколонкові та багатоколонкові, з вертикальною (для одноколонкових списків) та горизонтальною (для багатоколонкових списків) смугою перегляду. При створенні списку першим аргументом функції CreateWindow є вказівник на рядок “LISTBOX”, а третій аргумент задають за допомогою таблиці 3.2.

Таблиця 3.2. Список стилів списку рядків

Стиль

Пояснення

1

2

LBS_DISABLENO

SCROLL

Вертикальну смугу перегляду відображати в неактивному стані (але не приховувати), якщо в списку вміщаються всі рядки. Без вказання стилю LBS_DISABLENOSCROLL в аналогічній ситуації вертикальна смуга перегляду щезає. Використовують, якщо небажана зміна зовнішнього вигляду списку

LBS_MULTI

COLUMN

Рядки списку розташовують в декілька стовпців. Ширину стовпців задають повідомленням LB_SETCOLUMNWIDTH

1

2

LBS_EXTENDEDSEL

За допомогою клавіші Shift, миші або спеціальної комбінації клавіш можна виділяти декілька рядків

LBS_HASSTRINGS

Список мітсить рядки. Для одержання рядків можна використовувати повідомлення LB_GETTEXT. Цей стиль встановлений за замовчуванням для всіх списків, крім тих, для яких стиль встановлює батьківське вікно. В останньому випадку цей стиль потрібно вказувати явно

LBS_MULTIPLESEL

Вмикає та/або вимикає вибір рядків за допомогою клавіші Shift, миші або спеціальної комбінації клавіш

LBS_NO

DATA

Порожній список. Цей стиль використовують, якщо кількість рядків перевищує 1000. Комбінують з LBS_OWNERDRAWFIXED, але не можна комбінувати з LBS_SORT або LBS_HASSTRINGS. При цьому список ігнорує будь-які повідомлення

LBS_NOINTEGRALHEIGHT

Висота вікна списку задається батьківським вікном. За замовчуванням висота модифікується кратно висоті рядків

LBS_NO

SEL

Рядки відображати, але їх не можна обирати

LBS_NOTIFY

Сповіщувати баткьівське вікно про клацання мишею по рядку

LBS_OWNERDRAW

FIXED

Батьківське вікно відповідає за відображення вмсту списку, всі елементи списку однакової висоти. Батьківське вікно одержує повідомлення WM_MEASUREITEM при створенні списку та повідомлення WM_DRAWITEM при зміні списку

LBS_OWNERDRAW

VARIABLE

Подібний до стилю LBS_OWNERDRAWFIXED, але елементи списку можуть мати різну висоту

LBS_SORT

Сортувати рядки в алфавітному порядку

LBS_STANDARD

Комбінація стилів LBS_NOTIFY, LBS_SORT, WS_BORDER, WS_VSCROLL

LBS_USE

TABSTOPS

Враховувати символи табуляції. За замовчуванням один символ табуляції зміщує текст на 32 одиниці ширини діалогових панелей (8 одиниць середньої ширини поточного шрифта)

LBS_NOREDRAW

Не перемальовувати список при додаванні або видаленні рядків. Для перемалювання надсилають повідомлення WM_SETREDRAW

Наприклад:

hListBox=CreateWindow("LISTBOX", NULL,

WS_CHILD|WS_VISIBLE|LBS_STANDARD|LBS_WANTKEYBOARDINPUT,

30, 30, 200, 100, hwnd, (HMENU)ID_LIST, hInst, NULL);

Другий аргумент функції повинен бути вказаний як NULL. Додатково до стилів вікна WS_CHILD та WS_VISIBLE вказують стилі списку, імена яких мають префікс LBS_

Повідомлення від списку. Список зі стилем LBS_NOTIFY надсилає в функцію батьківського вікна сповіщувальне повідомлення WM_COMMAND. При цьому молодше слово параметру wParam дорівнює ідентифікатору списка. Параметр lParam містить дескриптор списку. Старше слово параметра wParam мітсить один з кодів сповіщення.

Повідомлення для списку. Додаток може надсилати списку повідомлення, викликаючи функцію SendMessage. Символічні імена цих повідомлень мають префікс LB_

Приклад роботи зі списком.

Задача. У вікні додатку створитти однорядковий редактор, список і кнопку “Добавити”. При натисканні на кнопку вміст редактора записати в список. При подвійному клацанні по рядку списку повідомити про рядок, який був обраний.

Розвязок.

#include "Functions.h"

#define ID_EDIT 1000

#define ID_LISTBOX 1001

#define ID_BUTTON 1002

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE hInstance;

char szClassName[]="ListDir";

char szTitle[]="Приклад";

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, PSTR, INT nCmdShow)

{ MSG msg; HWND hwnd; hInstance=hInst;

if (!RegClass(WndProc, szClassName, COLOR_WINDOW)) return FALSE;

if(!(hwnd=CreateWindow(szClassName, szTitle,

WS_OVERLAPPEDWINDOW|WS_VISIBLE, 100, 50, 364, 260,

0, 0, hInst, NULL))) return FALSE;

while (GetMessage(&msg, NULL, 0, 0))

{ TranslateMessage(&msg);DispatchMessage(&msg);}

return msg.wParam; }

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{ static HWND hListBox, hEdit, hButton, hStatic; int uItem; char Buf[80];

switch(msg)

{ case WM_CREATE:

{ hStatic=CreateWindow( "STATIC", "Введіть рядок для введення в список",

WS_CHILD|WS_VISIBLE|SS_CENTER,

30, 10, 300, 20, hwnd, (HMENU)0, hInstance, NULL);

hEdit=CreateWindow("EDIT", NULL,

WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT|ES_AUTOSCROLL,

30, 40, 300, 30, hwnd, (HMENU)ID_EDIT, hInstance, NULL);

SendMessage(hEdit, EM_LIMITTEXT, 35, 0L);

HListBox=CreateWindow("LISTBOX", NULL,

WS_CHILD|WS_VISIBLE|LBS_STANDARD,

30, 80, 300, 100, hwnd, (HMENU)ID_LISTBOX, hInstance, NULL);

hButton=CreateWindow("BUTTON", "Додати",

WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,

130, 85, 100, 30, hwnd, (HMENU)ID_BUTTON, hInstance, NULL);

SetFocus(hEdit); return 0; }

case WM_COMMAND:

{ switch (LOWORD (wParam))

{ case ID_LISTBOX:

{switch (HIWORD(wParam))

{case LBN_ERRSPACE:

{MessageBox(hwnd, "Мало пам'яті",

szTitle, MB_OK);

return 0; }

case LBN_DBLCLK:

{uItem=(int)SendMessage(hListBox,

LB_GETCURSEL, 0, 0L);

If (uItem!=LB_ERR)

{SendMessage(hListBox,LB_GETTEXT,

uItem, (LPARAM)Buf);

MessageBox(hwnd, Buf, szTitle, MB_OK); }

return 0; }

default: return 0; }

return 0; }

case ID_BUTTON:

{SendMessage(hEdit,EM_GETLINE, 0, (LPARAM)Buf);

SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)Buf);

SetWindowText(hEdit, "\0");

SetFocus(hEdit); return 0; }

default: return 0; } }

case WM_DESTROY: {PostQuitMessage(0); return 0; }

} return DefWindowProc(hwnd, msg, wParam, lParam); }