Выпадающие списки (класс combobox)



 

Этот класс является комбинацией списка и однострочного редактора, поэтому для комбинированного списка используются стили, коды извещения и сообщения, аналогичные списку ”listbox”, а также некоторые сообщения, специфические для редактора текста класса “edit”.

Базовые стили комбинированного списка

Среди всех стилей комбинированного списка можно выделить три базовых:

Стиль CBS_SIMPLE соответствует списку с окном редактирования (или, как его называют, окном выбора).

Если список имеет стиль CBS_DROPDOWN, в исходном состоянии он состоит из окна редактирования и расположенной справа пиктограммы со стрелкой (кнопкой, предназначенной для отображения списка). Если нажать на эту пиктограмму левой клавишей мыши, под окном редактирования появится список.

Стиль CBS_DROPDOWNLIST аналогичен стилю CBS_DROPDOWN, но окно редактирования можно использовать только для просмотра выделенной строки, а не для редактирования или ввода.

Рассмотрим сообщения от комбинированного списка, посылаемые родительскому окну

Комбинированные списки посылают оконной процедуре родительского окна сообщения WM_COMMAND. Значения параметров сообщения wParam и lParam такие же как и для кнопок. Коды извещения для комбинированного списка имеют символические имена с префиксом CBN_.

Для обработки сообщения от комбинированного списка оконная функция родительского окна может содержать код следующего вида:

     case WM_COMMAND:

     {    UINT idCtl=LOWORD(wParam); // идентификатор дочер. окна

               UINT code=HIWORD(wParam); // код уведомления

               HWND hChild=(HWND)lParam; // дескриптор дочер. окна

               If(idCtrl==ID_combo&&code==CBN_SELCHANGE)

               {

                          // сделан выбор в комбинированном списке

                          . . .

               }

     }; return 0;

Рассмотрим сообщения, посылаемые родительским окном комбинированным спискам

Для управления списком “combobox” используется набор сообщений, аналогичный набору сообщений для списка “listbox” и редактора текста “edit”. Функция SendMessage, посылающая сообщения списку, возвращает значение, которое зависит от выполняемой функции, или коды ошибок.

  • В файле windows.h определены сообщения, специально предназначенные для работы со списком “combobox”. Символические имена этих сообщений имеют префикс CB_.

 

Полосы прокрутки (класс scrollbar)

В отличие от других дочерних окон управления, посылающих родительскому окну сообщения, полосы прокрутки не посылают сообщения WM_COMMAND. Вместо этого они, также как и полосы прокрутки окна, посылают ему сообщения WM_VSCROLL и WM_HSCROLL.

  • При обработке сообщений полос прокрутки приложению с помощью параметра lParam может различать сообщения полос прокрутки окна и полос прокрутки – элементов управления. Для полос прокрутки окна lParam равен NULL, а для полос – элементов управления он является дескриптором этих полос прокрутки, другими словами дескриптором дочернего окна
  • Значения же старшего и младшего слов параметра wParam для полос прокрутки окна и для полос прокрутки – дочерних окон имеют одинаковый смысл.

Замечание. Полосы прокрутки – элементы управления можно сделать любого размера. Для того чтобы создать элементы управления с теми же стандартными размерами, что и полосы прокрутки окна, можно использовать функцию GetSystemMetrics:

  • вызов GetSystemMetrics(SM_CYHSCROLL) выдает высоту горизонтальной полосы прокрутки,
  • а вызов GetSystemMetrics(SM_CXVSCROLL) – ширину вертикальной полосы прокрутки.

Для полос прокрутки – элементов управления также можно установить диапазон и текущее положение с помощью тех же вызовов функция, что и для полос прокрутки окна:

     SetScrollRange(hWndScroll,SB _ CTL,iNewMin,iNewMax,bRedraw);

Полосы прокрутки – элементы управления могут обрабатывать сообщения клавиатуры, но только в том случае, если они имеют фокус ввода. Если необходимо, чтобы полоса прокрутки управления получала фокус ввода, когда на полосе прокрутки происходит щелчок мыши, то следует включить идентификатор WS_TABSTOP в параметр стиля дочернего окна управления при вызове функции CreateWindow.

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

     static int min_sb=1,max_sb=100,pos_sb=20;

     SetScrollRange(hWndScroll,SB_CTL,min_sb,max_sb,TRUE);

     SetScrollPos(hWndScroll,SB_CTL,pos_sb,TRUE);

Рассмотрим фрагмент оконной функции, демонстрирующий возможную обработку действий пользователя с этой вертикальной линейкой прокрутки:

     case WM_VSCROLL:

     {

               // произведенное действие

               int nScrollCode=(int)LOWORD(wParam);

               // текущая позиция

               short int nPos=(short int)HIWORD(wParam);

               // дескриптор полосы просмотра или NULL

               HWND hwndScrollBar=(HWND)lParam;

 

               int old_pos_sb=pos_sb;

               switch(nScrollCode)

               {

                          case SB_PAGEDOWN:     pos_sb+=10; break;

                          case SB_PAGEUP:          pos_sb-=10; break;

                          case SB_LINEDOWN: pos_sb+=1; break;

                          case SB_LINEUP:           pos_sb-=1; break;

                          case SB_THUMBPOSITION: pos_sb=nPos; break;

                          case SB_THUMBTRACK:  pos_sb=nPos; break;

                          default: return 0l;

               }

               if(pos_sb<min_sb) pos_sb=min_sb;

               if(pos_sb>max_sb) pos_sb=max_sb;

               if(old_pos_sb!=pos_sb)

                          SetScrollPos(hWndScroll,SB_CTL,pos_sb,TRUE);

     }; return 0l;

 


Список рекомендуемой литературы

 

1. Гордеев, А.В. Операционные системы : учебник для вузов / А. В. Гордеев ; А.В. Гордеев. - 2-е изд. - СПб. : Питер, 2007. - 416с. : ил. - (Учебник для вузов).

2. Синицын, С.В. Операционные системы : учебник для вузов / С. В. Синицын, А. В. Батаев, Н. Ю. Налютин ; С.В. Синицын, А.В. Батаев, Н.Ю. Налютин. - М. : ИЦ "Академия", 2010. - 304с. -

3. Столлингс, В. Операционные системы : внутреннее устройство и принципы проектирования / В. Столлингс ; В.Столлингс ; пер. с англ.: Д.Я. Иваненко и др. - 4-е изд. - М. ; СПб. ; К. : Вильямс, 2002. - 848с. : ил. - Перевод изд.: Operating Systems. Internals and Design Principles/ W. Stallings.

4. Таненбаум Э.С. Операционные системы: разработка и реализация / Э. С. Таненбаум, А. С. Вудхалл ; Э.С. Таненбаум, А.С. Вудхалл ; пер. с англ. Д. Шинтяков. - СПб. : Питер, 2006.

5. Олифер В.Г. Сетевые операционные системы : учебное пособие для вузов / В. Г. Олифер, Н. А. Олифер ; В.Г. Олифер, Н.А. Олифер. - СПб. : Питер, 2006. - 539с.

6. Таненбаум Э. Современные операционные системы / Э. Таненбаум ; Э. Таненбаум ; Пер. с англ. А. Леонтьева. - 2-е изд. - СПб. : Питер, 2006. - 1038с.

7. Рихтер, Дж. Windows : создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows / Рихтер Дж. ; Дж. Рихтер. - Изд. 4-е. - СПб. : Питер ; М. : Русская редакция, 2003. - 752с.

8. Верма Р.Д. Справочник по функциям Win32 API / Р. Д. Верма ; Р.Д.Верма. - М. : Горячая линия-Телеком, 2002. - 488с.

9. Побегайло А.П. Системное программирование в Windows / А. П. Побегайло ; А.П. Побегайло. - 13 Мб. - СПб. : БХВ-Петербург, 2006.

 

Примечание. Можно использовать также и другую доступную литературу по указанным языкам и средствам программирования.

 


Дата добавления: 2019-09-13; просмотров: 187; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!