Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

 

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

Стиль Пояснення
   
LBS_DISABLENO SCROLL Вертикальну смугу перегляду відображати в неактивному стані (але не приховувати), якщо в списку вміщаються всі рядки. Без вказання стилю LBS_DISABLENOSCROLL в аналогічній ситуації вертикальна смуга перегляду щезає. Використовують, якщо небажана зміна зовнішнього вигляду списку
LBS_MULTI COLUMN Рядки списку розташовують в декілька стовпців. Ширину стовпців задають повідомленням LB_SETCOLUMNWIDTH
   
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); }






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.