Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Razoryonov_2008_full.doc
Скачиваний:
0
Добавлен:
26.12.2019
Размер:
1.34 Mб
Скачать

15 Функции создания диалога

Модальный диалог:

DialogBox(

hInst, //дескриптор приложения

(LPCTSTR)IDD_MODAL_DIALOG, //шаблон ресурса диалога

hWnd, // дескриптор родительского окна

(DLGPROC)ModalDialogDlgProc); //диалоговая процедура

Немодальный диалог:

CreateDialog(

hInst, //дескриптор приложения

(LPCTSTR)IDD_NONMODAL_DIALOG, //шаблон ресурса диалога

hWnd, // дескриптор родительского окна

(DLGPROC)NonmodalDialogDlgProc); //диалоговая процедура

16 Взаимодействие между элементами управления

Можно создавать свои собственные дочерние окна управления, но есть также возможность использовать преимущества нескольких уже определенных классов окна (и оконных процедур), с помощью которых ваша программа может создавать стандартные дочерние окна управления, которые вы, несомненно, уже наблюдали в других программах для Windows. Такие дочерние окна имеют вид кнопок (buttons), флажков (check boxes), окон редактирования (edit boxes), списков (list boxes), комбинированных списков (combo boxes), строк текста (text strings) и полос прокрутки (scroll bars).

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

Оконная процедура родительского окна посылает сообщения дочерним окнам управления, а дочерние окна управления посылают сообщения обратно оконной процедуре.

Для создания обычного окна приложения, во-первых, определите класс окна и зарегистрируйте его в Windows с помощью функции RegisterClassEx. Затем с помощью функции CreateWindow создайте окно на основе этого класса. Однако, если вы используете одно из предопределенных дочерних окон управления, то для этого дочернего окна класс окна регистрировать не надо. Такой класс уже существует в Windows и имеет одно из следующих имен: "button" (кнопка), "static" (статическое), "scrollbar" (полоса прокрутки), "edit" (окно редактирования), "listbox" (окно списка) или "combobox" (окно комбинированного списка). Вы просто используете имя в качестве параметра класса окна в функции CreateWindow. Параметр стиля окна функции CreateWindow более точно определяет вид и свойства дочернего окна управления. Windows включает в себя оконные процедуры, обрабатывающие сообщения тех дочерних окон, которые созданы на основе перечисленных классов.

Когда вы щелкаете мышью на дочернем окне управления, оно посылает сообщение WM_COMMAND своему родительскому окну. Программа обрабатывает сообщение WM_COMMAND которое содержит 2 параметра wParam и lParam. Здесь приведен их смысл:

LOWORD (wParam) Идентификатор дочернего окна

HIWORD (wParam) Код уведомления

lParam Описатель дочернего окна

Идентификатор дочернего окна — это значение, передаваемое функции CreateWindow, когда создается дочернее окно.

Описатель дочернего окна — это значение, которое Windows возвращает при вызове функции CreateWindow.

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

Класс кнопок

Пять специальных сообщений для кнопок определены в заголовочных файлах Windows; каждое из которых начинается с префикса "BM", что означает "button message" (сообщение кнопки). Вот эти сообщения:

BM_GETCHECK

BM_SETCHECK

BM_GETSTATE

BM_SETSTATE

BM_SETSTYLE

Сообщения BM_GETCHECK и BM_SETCHECK посылаются родительским окном дочернему окну управления для установки и снятия контрольных меток флажков (check boxes) и переключателей (radio buttons). Сообщения BM_GETSTATE и BM_SETSTATE касаются обычного или "нажатого" состояния окна при щелчке мышью или нажатии клавиши <Spacebar>. Сообщение BM_SETSTYLE позволяет вам изменять стиль кнопки после ее создания.

Класс статических дочерних окон

Вы можете создать статическое дочернее окно управления, используя класс окна "static" при вызове функции CreateWindow. Это совершенно обычные дочерние окна. Они не получают информации от клавиатуры или мыши, и они не посылают сообщений WM_COMMAND обратно родительскому окну. (Когда вы перемещаете мышь или щелкаете мышью над статическим дочерним окном, дочернее окно обрабатывает сообщение WM_NCHITTEST и возвращает в Windows значение HTTRANSPARENT. Это заставляет Windows послать то же сообщение WM_NCHITTEST расположенному внизу окну, которым обычно является родительское окно. Родительское окно, как правило, передает сообщение в DefWindowProc, где оно преобразуется в сообщение мыши рабочей области.)

Класс полос прокрутки

Вы создаете полосы прокрутки, являющиеся дочерними окнами управления, используя предопределенный класс окна "scrollbar", и один из двух стилей для полос прокрутки: SBS_VERTS и BS_HORZ. В отличие от кнопок — элементов управления, полосы прокрутки — элементы управления не посылают родительскому окну сообщений WM_COMMAND. Вместо этого они, также как и полосы прокрутки окна, посылают ему сообщения WM_VSCROLL и WM_HSCROLL. При обработке сообщений полос прокрутки с помощью параметра lParam вы можете различать сообщения полос прокрутки окна и полос прокрутки — элементов управления. Для полос прокрутки окна lParam равен 0, а для полос прокрутки — элементов управления он является описателем этих полос прокрутки или описателем дочернего окна управления — полосы прокрутки. Что же касается параметра wParam, то значения его старшего и младшего слова для полос прокрутки окна и для полос прокрутки — элементов управления имеют одинаковый смысл.

Сообщения управляющему окну редактирования

Эти сообщения позволяют вам удалять, копировать или очищать текущую выделенную часть текста. Пользователь выделяет текст для обработки, используя мышь или клавишу <Shift> с нужной клавишей управления курсором, выбранный текст подсвечивается в окне редактирования:

SendMessage(hwndEdit, WM_CUT, 0, 0);

SendMessage(hwndEdit, WM_COPY, 0, 0);

SendMessage(hwndEdit, WM_CLEAR, 0, 0);

Сообщение WM_CUT удаляет выделенный текст из окна редактирования и посылает его в папку обмена.

Сообщение WM_COPY копирует выделенный текст в папку обмена, оставляя его неизменным в окнередактирования. Сообщение WM_CLEAR удаляет выделенный текст из окна редактирования без копирования его в папку обмена.

Вы также можете вставить текст из папки обмена в месте, соответствующем позиции курсора в окне редактирования:

SendMessage(hwndEdit, WM_PASTE, 0, 0);

Вы можете получить начальное и конечное положения текущего выделения:

SendMessage(hwndEdit, EM_GETSEL,(WPARAM) &iStart,(LPARAM) &iEnd);

Конечным положением фактически является положение последнего выделенного символа плюс 1.

Вы можете выделить текст:

SendMessage(hwndEdit, EM_SETSEL, iStart, iEnd);

Вы также можете заменить текущий выделенный текст другим текстом:

SendMessage(hwndEdit, EM_REPLACESEL, 0,(LPARAM) szString);

Для многострочных окон редактирования вы можете получить число строк:

iCount = SendMessage(hwndEdit, EM_GETLINECOUNT, 0, 0);

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

iOffset = SendMessage(hwndEdit, EM_LINEINDEX, iLine, 0);

Строки нумеруются, начиная с 0. При значении iLine равном —1 функция возвращает смещение строки, содержащей курсор. Длину строки можно получить из:

iLength = SendMessage(hwndEdit, EM_LINELENGTH, iLine, 0);

и копировать саму строку в буфер можно таким образом:

iLength = SendMessage(hwndEdit, EM_GETLINE, iLine,(LPARAM) szBuffer);

Класс окна списка

Список — это набор текстовых строк, который выводится на экран в виде прокручиваемого в прямоугольнике столбца текста. Программа может добавлять или удалять строки в списке путем посылки сообщений оконной процедуре списка. Окно списка посылает сообщения WM_COMMAND своему родительскому окну, когда в списке выбирается какой-либо пункт. Родительское окно может определить, какой пункт списка был выбран.

Когда пользователь щелкает мышью над окном списка, окно списка получает фокус ввода. Родительское окно может предоставить управляющему (listbox control) окну списка фокус ввода с помощью вызова функции:

SetFocus(hwndList);

Если окно списка имеет фокус ввода, то для выбора пунктов списка также могут использоваться клавиши управления курсором, буквенные клавиши и клавиша <Spacebar>. Управляющее окно списка посылает сообщения WM_COMMAND своему родительскому окну. Значение параметров сообщения lParam и wParam то же, что и для кнопок управления и управляющих окон редактирования:

LOWORD (wParam) Идентификатор дочернего окна

HIWORD (wParam) Код уведомления

lParam Описатель дочернего окна

Ниже перечисляются коды уведомления и их значения:

LBN_ERRSPACE -2

LBN_SELCHANGE 1

LBN_DBLCLK 2

LBN_SELCANCEL 3

LBN_SELFOCUS 4

LBN_KILLFOCUS 5

Окно списка посылает своему родительскому окну коды LBN_SELCHANGE и LBN_DBLCLK только в том случае, если в стиль дочернего окна включен идентификатор LBS_NOTIFY. Код LBN_ERRSPACE показывает, что превышен размер памяти, отведенный для списка. Код LBN_SELCHANGE показывает, что был изменен текущий выбор; эти сообщения имеют место, когда пользователь перемещает подсветку по списку, изменяет состояние выборки с помощью клавиши <Spacebar> или выбирает нужный элемент списка с помощью щелчка мыши. Код LBN_DBLCLK показывает, что на данном пункте списка имел место двойной щелчок мыши. (Значение кодов уведомления для LBN_SELCHANGE и LBN_DBLCLK соответствует количеству щелчков мыши.)

Если вы используете стиль LBS_SORT (или, если вы располагаете строки в списке в том порядке, в котором вы хотите, чтобы они появлялись), то простейшим способом заполнить список будет использование сообщения LB_ADDSTRING:

SendMessage(hwndList, LB_ADDSTRING, 0,(LPARAM) szString);

Если вы не используете стиль LBS_SORT, то можете вставить строку в ваш список, задав индекс и используя сообщение LB_INSERTSTRING:

SendMessage(hwndList, LB_INSERTSTRING, iIndex,(LPARAM) szString);

Удалить строку из списка можно с помощью сообщения LB_DELETESTRING, указав значение индекса:

SendMessage(hwndList, LB_DELETESTRING, iIndex, 0);

Полностью очистить список можно с помощью сообщения LB_RESETCONTENT:

SendMessage(hwndList, LB_RESETCONTENT, 0, 0);

Оконная процедура окна списка обновляет окно, если к списку добавляется или из списка удаляется элемент. Если вам известно число строк, которые необходимо добавить или удалить, то вам может понадобиться временно приостановить это обновление, сбросив флаг обновления окна:

SendMessage(hwndList, WM_SETREDRAW, FALSE, 0);

После окончания работы по изменению списка, вам следует восстановить флаг обновления окна:

SendMessage(hwndList, WM_SETREDRAW, TRUE, 0);

После того, как вы вставили в список несколько элементов, вы можете определить количество элементов в списке:

iCount = SendMessage(hwndList, LB_GETCOUNT, 0, 0);

Некоторые другие вызовы различаются для списков с единичной выборкой и для списков с множественной выборкой. Сначала рассмотрим список с единичной выборкой. Обычно вы разрешаете пользователю выбирать из списка. Но если вы хотите выделить элемент, выбираемый по умолчанию, то можете использовать такой вызов:

SendMessage(hwndList, LB_SETCURSEL, iIndex, 0);

При установки в качестве iIndex значения —1, выборка для всех элементов отменяется. Вы также можете выбирать элемент списка на основе его первых символов:

iIndex = SendMessage(hwndList, LB_SELECTSTRING, iIndex,(LPARAM) szSearchString);

Величина iIndex, заданная в качестве параметра lParam функции SendMessage, является номером пункта, с которого начинается поиск пункта, начальные символы которого заданы в szSearchString. При значении iIndex равном —1, поиск начинается с начала списка. Возвращаемым значением функции SendMessage является индекс выбранного элемента или LB_ERR, если в списке нет элементов, с начальными символами из строки szSearchString.

Когда вы получаете от окна списка сообщение WM_COMMAND (или в любое другое время), с помощью сообщения LB_GETCURSEL вы можете определить индекс текущего выбранного элемента: iIndex = SendMessage(hwndList, LB_GETCURSEL, 0, 0); Если возвращаемое значение функции SendMessage равно LB_ERR, то это означает отсутствие выбранных элементов.

Вы можете определить длину строки любого элемента списка:

iLength = SendMessage(hwndList, LB_GETTEXTLEN, iIndex, 0);

Копировать выбранную строку в буфер можно следующим образом:

iLength = SendMessage(hwndList, LB_GETTEXT, iIndex,(LPARAM) szBuffer);

Больщинство сообщений от элементов управления получает само диалоговое окно и их необходимо как-либо обрабатывать. Из этого следует, что у диалогового окна должна быть своя оконная функция. Пример взаимодействия между элементами управления:

if(SendMessage(hCType, CB_GETCURSEL, 0, 0) != 0)

EnableWindow(GetDlgItem(hDlg, IDC_BSetData), TRUE);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]