Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП02_Органы управления.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
576 Кб
Скачать

2.6.4. Пример работы с комбинированным списком

Задача. В окне приложения создать однострочный редактор, комбинированный список и кнопку "Добавить". При нажатии на кнопку содержимое редактора записать в список. При двойном щелчке по строке списка сообщить о строке, которая была выбрана.

Листинг 2.8. Работа с комбинированным списком строк.

#include <windows.h>

#define ID_EDIT 1000

#define ID_COMBBOX 1001

#define ID_BUTTON 1002

BOOL RegClass(WNDPROC, LPCTSTR, UINT);

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

HINSTANCE hInstance;

TCHAR szClassName[] = TEXT("ComboList");

TCHAR szTitle[] = TEXT("Работа с комбинированным списком");

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, 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,360, 0, 0, hInstance, NULL)))

return FALSE;

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

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

return msg.wParam;

}

BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)

{

WNDCLASS wc;

wc.style=wc.cbClsExtra=wc.cbWndExtra=0;

wc.lpfnWndProc = Proc;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hbrBackground = (HBRUSH)(brBackground + 1);

wc.lpszMenuName = (LPCTSTR)NULL;

wc.lpszClassName = szName;

return (RegisterClass(&wc) != 0);

}

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

{

static HWND hCombBox, hEdit, hButton, hStatic;

int uItem;

TCHAR Buf[80];

switch (msg)

{

case WM_CREATE:

{

hStatic = CreateWindow(TEXT("static"), TEXT("Введите строку для ввода в список"),

WS_CHILD | WS_VISIBLE | SS_CENTER,

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

hEdit = CreateWindow(TEXT("edit"), NULL,

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOHSCROLL,

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

hCombBox = CreateWindow(TEXT("Combobox"), NULL,

WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_SIMPLE | CBS_SORT,

30, 80, 300, 200, hwnd, (HMENU)ID_COMBBOX, hInstance, NULL);

hButton = CreateWindow(TEXT("button"), TEXT("Добавить"),

WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,

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

SetFocus(hEdit);

return 0;

}

case WM_COMMAND:

{

switch (LOWORD(wParam))

{

case ID_COMBBOX:

{

switch (HIWORD(wParam))

{

case CBN_ERRSPACE:

{

MessageBox(hwnd, TEXT("Мало памяти"), szTitle, MB_OK);

return 0;

}

case CBN_DBLCLK:

{

uItem = (int)SendMessage(hCombBox, CB_GETCURSEL, 0, 0L);

if (uItem != LB_ERR)

{

SendMessage(hCombBox, CB_GETLBTEXT, uItem, (LPARAM)Buf);

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

}

return 0;

}

default: return 0;

}

return 0;

}

case ID_BUTTON:

{

SendMessage(hEdit, WM_GETTEXT, 80, (LPARAM)Buf);

SendMessage(hCombBox, CB_ADDSTRING, 0, (LPARAM)Buf);

SetWindowText(hEdit, TEXT("\0"));

SetFocus(hEdit);

return 0;

}

default: return 0;

}

}

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

}

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

}

Как видим, текст этого приложения от предыдущего отличается только видом используемого списка – вместо простого списка применяется комбинированный список.

Отличия в тексте приложения, как это нетрудно увидеть, связаны с именами класса "Combobox", кодов извещений и сообщений.

В процессе работы со списком тоже появляется одно важное отличие. В процессе выбора строки из списка простой просмотр списка может отнять много времени. Комбинированный список позволяет упростить поиск, если вы знаете хотя бы несколько первых букв префикса искомой строки. Наберите начальные буквы искомой строки в окне редактирования комбинированного списка – и нужная строка окажется перед вашими глазами.

Окна класса "Combobox" завершают изучение определенных в системе Windows классов окон.