Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

class CMyListBox : public CListBox {

protected:

afx_msg void OnDoubleClick();

DECLARE_MESSAGE_MAP()

};

BEGIN_MESSAGE_MAP( CMyListBox, CListBox )

ON_CONTROL_REFLECT( LBN_DBLCLK, OnDoubleClick )

END_MESSAGE_MAP()

void CMyListBox::OnDoubleClick()

{

CString string;

int nIndex = GetCurSel();

GetText( nIndex, string );

MessageBox( string );

}

Макрос ON_CONTROL_REFLECT говорит MFC, что надо вызывать CMyListBox::OnDoubleClick каждый раз, когда список посылает уведомление LBN_DBLCLK своему родительскому окну. Важно отметить, что отражение работает только тогда, когда родительское окно само не обрабатывает уведомление – т. е. в карте сообщения родительского окна не должно быть записи ON_LBN_DBLCLK для данного списка. Родительское окно при обработке уведомления имеет больший приоритет. Это объясняется тем, что Windows ожидает выполнения обработки уведомления от ЭУ в его родительском окне, а не в самом ЭУ.

3. Упражнения

8)  Изучите англо-русский словарь терминов по теме 7-й лекции (см. CD-ROM).

9)  Выполните лабораторную работу №4, "Использование стандартных элементов управления" (см. CD-ROM).

Лекция 8. Диалоговые окна

В большинстве приложений элементы управления используются не в окнах верхнего уровня, а в диалоговых окнах. Диалоговое окно (dialog box), или, диалог – это окно, обычно появляющееся на короткий промежуток времени для получения данных от пользователя. Диалоговые окна создавать гораздо проще, чем окна верхнего уровня, т. к. шаблон диалогового окна с расположением всех его ЭУ можно разработать в интерактивном режиме, поместить в RC-файл, а затем во время выполнения программы создать диалоговое окно на основе шаблона.

НЕ нашли? Не то? Что вы ищете?

Есть две основных разновидности диалоговых окон: модальные и немодальные. Модальные окна запрещают во время работы свое окно-владельца. Немодальное окно больше похоже на обычное окно верхнего уровня (например, окно контекстного поиска и замены в MS Word). Во время работы такого окна пользователь может работать и с его окном-владельцем. Чаще в приложениях используются модельные окна, поэтому далее будут подробно рассматриваться именно они.

В MFC диалоговые окна представлены классом CDialog. Также в MFC есть удобные классы-оболочки для работы со стандартными диалоговыми окнами Windows (для открытия/сохранения файлов, диалоговые окна печати и др.).

Особым видом диалоговых окон являются окна свойств (окна с закладками, property sheet). Это окно выглядит как окно с закладками, каждая из которых является отдельным диалоговым окном. Окна свойств позволяют компактно представить большое количество элементов управления. Они хорошо подходят для разработки объектно-ориентированного пользовательского интерфейса, в котором интенсивно используются контекстные меню. В MFC для работы с окнами свойств есть классы CPropertySheet и CPropertyPage.

1. Модальные диалоговые окна и класс CDialog

В процессе создания модального диалогового окна выделяются три этапа:

1)  Разработка шаблона диалогового окна, описывающего внешний вид окна и его элементов управления.

2)  Создание объекта класса или подкласса CDialog, являющегося оболочкой для шаблона диалогового окна.

3)  Вызов функции-члена CDialog::DoModal для вывода окна на экран.

Для простых диалоговых окон можно непосредственно пользоваться классом CDialog. Однако более часто наследуется подкласс CDialog, в котором реализуется поведение конкретного окна. Сначала рассмотрим отдельные компоненты диалогового окна, а затем создание подклассов CDialog.

1.1 Шаблон диалогового окна

Первый шаг в создании диалогового окна – разработка шаблона. В нем описываются основные характеристики окна, начиная от его размеров, до свойств элементов управления. Хотя можно создавать шаблон окна программно, обычно они хранятся в виде ресурсов приложения, скомпилированных по содержимому RC-файла.

Ниже в качестве примера приведен шаблон диалогового окна с идентификатором ресурса IDD_MYDIALOG. В этом окне есть 4 ЭУ: строка ввода, статический элемент-метка строки ввода, кнопка OK и кнопка Отмена:

IDD_MYDIALOG DIALOG 0, 0, 160, 68

STYLE DS_MODALFRAME ¦ WS_POPUP ¦ WS_VISIBLE ¦ WS_CAPTION ¦ WS_SYSMENU

CAPTION "Введите свое имя"

FONT 8, "MS Sans Serif"

BEGIN

LTEXT "&Имя", -1, 8, 14, 24, 8

EDITTEXT IDC_NAME, 34, 12, 118, 12, ES_AUTOHSCROLL

DEFPUSHBUTTON "OK", IDOK, 60, 34, 40, 14, WS_GROUP

PUSHBUTTON "Отмена", IDCANCEL, 112, 34, 40, 14, WS_GROUP

END

Все координаты и размеры задаются в единицах диалогового окна (dialog box units). Горизонтальная единица равна четверти средней ширины символа шрифта диалога. Вертикальная единица равна одной восьмой высоты символа. Т. к. высота символов с среднем в 2 раза больше ширины, то эти единицы примерно равны. Использование таких единиц позволяет описать окно независимо от экранного разрешения.

В шаблоне окна можно вместо служебных слов вроде LTEXT или EDITTEXT пользоваться словом CONTROL и указывать имя оконного класса элемента управления явно, например:

IDD_MYDIALOG DIALOG 0, 0, 160, 68

STYLE DS_MODALFRAME ¦ WS_POPUP ¦ WS_VISIBLE ¦ WS_CAPTION ¦ WS_SYSMENU

CAPTION "Введите свое имя"

BEGIN

CONTROL "&Имя", -1, "STATIC", SS_LEFT, 8, 14, 24, 8

CONTROL "", IDC_NAME, "EDIT", WS_BORDER ¦ ES_AUTOHSCROLL ¦

ES_LEFT ¦ WS_TABSTOP, 34, 12, 118, 12

CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON ¦

WS_TABSTOP ¦ WS_GROUP, 60, 34, 40, 14

CONTROL "Отмена", IDCANCEL, "BUTTON", BS_PUSHBUTTON ¦

WS_TABSTOP ¦ WS_GROUP, 112, 34, 40, 14

END

Вручную такие описания диалоговых окон делаются очень редко. В среде Visual C++ команда меню InsertÞResource позволяет добавить в проект пустой шаблон диалогового окна и затем отредактировать его в редакторе ресурсов. На рис. 8.1 показано окно редактора диалоговых окон, встроенного в Visual C++. Элементы управления можно выбирать в панели инструментов Controls и "рисовать" их в диалоговом окне (если панель инструментов Controls отсутствует на экране, ее можно включить командой меню ToolsÞCustomizeÞToolbars). Свойства диалогового окна (заголовок, шрифт, стиль) и свойства ЭУ доступны в окнах свойств, вызываемых командой Properties из контекстных меню.

Рис. 8.1. Редактор диалоговых окон Visual C++.

1.1.1 Клавиатурный интерфейс диалогового окна

В Windows каждому диалоговому окну обеспечивается клавиатурный интерфейс, позволяющий пользователю перемещать фокус ввода по очереди между всеми ЭУ клавишей Tab, циклически перемещаться внутри группы ЭУ клавишами курсора, выбирать ЭУ нажатием его клавиши быстрого выбора (подчеркнутого символа в тексте метки). На клавиатурный интерфейс влияют следующие компоненты шаблона диалогового окна:

·  порядок создания элементов управления;

·  использование символов амперсанда (&) в тексте меток для обозначения клавиш быстрого выбора;

·  использование стиля WS_GROUP для объединения ЭУ в группы;

·  использование стиля DEFPUSHBUTTON для обозначения нажимаемой кнопки, выбираемой по умолчанию (по нажатию Enter).

Порядок создания ЭУ задает очередность передачи меду ними фокуса ввода клавишей Tab или Shift-Tab (tab order). В большинстве редакторов диалогов этот порядок можно задать визуально.

Важным вопросом клавиатурного интерфейса, особенно для кнопок с зависимой фиксацией, является объединение ЭУ в группы. Кнопки со стилем BS_AUTORADIOBUTTON должны быть сгруппированы, чтобы Windows могла автоматически перемещать отметку между кнопками этой группы. Чтобы объединить кнопки (или другие ЭУ) в группу, надо сначала расположить их последовательно в порядке обхода клавишей Tab, затем первой из этих кнопок в окне свойств присвоить стиль WS_GROUP, а также присвоить этот стиль первому ЭУ, которой располагается после создаваемой группы.

Все компоненты клавиатурного интерфейса можно задать в редакторе диалогов Visual C++. Порядок обхода клавишей Tab задается после выбора команды LayoutÞTab Order, последовательными щелчками мыши на всех ЭУ. В диалоговом редакторе порядок обхода показывается в виде прямоугольников с порядковыми числами (рис. 8.2).

Рис. 8.2. Редактор диалогов Visual C++ в режиме задания порядка обхода ЭУ по клавише Tab.

1.2 Класс CDialog

Для всех, за исключением самых примитивных, диалоговых окон, кроме разработки шаблона требуется описать класс-оболочку как подкласс CDialog. В этом подклассе надо реализовать поведение конкретного окна. В целом, у подклассов CDialog часто перегружаются три виртуальные функции: инициализация элементов управления (OnInitDialog) и обработчики кнопок OK (OnOK) и Отмена (OnCancel). Хотя каждая из этих функций соответствует определенному сообщению диалогового окна, для их обработки не требуется карта сообщений – она скрыта внутри CDialog и обработчики реализованы в виде обычных виртуальных функций. У CDialog есть версии этих функций "по умолчанию", поэтому иногда можно обойтись без их перегрузки, а для обмена данными с ЭУ пользоваться механизмом обмена данными диалоговых окон MFC (Dialog Data Exchange and Dialog Data Validation).

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32