Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб 5.doc
Скачиваний:
3
Добавлен:
08.05.2019
Размер:
462.34 Кб
Скачать

Некоторые функции для работы с диалоговыми панелями.

CWnd* CWnd::GetDlgItem( int nID ) const;

void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;

Функции по идентификатору элемента управления, заданному при создании элемента в редакторе ресурсов, возвращают указатель на оконный объект или дескриптор окна этого элемента.

void CDialog::GotoDlgCtrl( CWnd* pWndCtrl );

Переводит фокус на другой элемент в диалоге.

void CDialog::NextDlgCtrl( ) const;

Переводит фокус на следующий элемент управления. Порядок перехода может быть задан при создании диалога в редакторе ресурсов ( найдите, как это делается )

void CDialog::PrevDlgCtrl( ) const;

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

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

DWORD CDialog::GetDefID( );

void CDialog::SetDefID( UINT nID );

Функция GetDefID возвращает в младшем слове идентификатор кнопки по умолчанию. Старшее слово при этом содержит значение DC_HASDEFID.

Порядок выполнения работы.

1. Реализовать задание к третьей лабораторной работе в виде приложения windows MFC.

2. Реализовать дополнительное диалоговое окно для ввода данных.

3. В диалоговом окне About вывести данные о разработчике (студенте: ФИО, группа, название дисциплины).

4. Вывод объектов иерархии организовать в главном окне программы в виде таблицы.

5. Для управления программой использовать управляющие компоненты.

Содержание отчета.

1. Титульный лист.

2. Техническое задание (согласно приложения №2).

3. Иерархия классов.

4. Иерархия объектов.

5. Диаграмма классов (концептуальная модель)

6. Интерфейс и реализация классов (при описании обязательно комментарии).

7. В приложении привести несколько скриншотов ключевых моментов работы программы.

Приложение 1.

Описание классов стандартных элементов Windows.

Рассмотрим некоторые классы элементов управления Windows:

Класс

Элемент управления

CStatic

Статический текст или изображение

CButton

Командные кнопки

CListBox

Список

CComboBox

Комбинированный список

CEdit

Поле редактирования

CScrollBar

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

Создание элементов

Все элементы управления могут быть созданы с помощью редактора ресурсов или динамически во время выполнения приложения. Создание элементов с использованием редактора ресурсов и связь их с переменными класса диалоговой. При создании элементов задаются стили и их комбинации через логическую функцию |. Для каждого вида элемента наборы стилей свои, хотя есть стили, общие для всех окон, например, WS_VISIBLE или WS_DISABLE.

Для создания элемента динамически сначала создается объект данного класса, а затем вызывается функция-член его Create. Для диалога это действие выполняется в функции OnInitDialog. Ниже приводится пример создания элемента поле редактирования в диалоге. Текст вводится вручную в файлы, созданные AppWizard и ClassWizard.

class CMyDialog:public CDialog

{

protected:

CEdit m_Edit;

public:

BOOL OnInitDialog();

}

BOOL CMyDialog::OnInitDialog()

{

CDialog::OnInitialog();

CRect rect(20,20,100,50);

m_Edit.Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL|

WS_BORDER,rect,this,IDC_EDIT);

m_Edit.SetFocus();

return FALSE;//так как выполнена установка фокуса, то должно

//возвращаться значение FALSE

}

Элемент статического типа - CStatic.

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

Конструктор не создает объект Windows: CStatic::CStatic();

Инициализация выполняется функцией Create:

BOOL CStatic::Create(LPCTSTR lpszText, // текст в элементе управления

DWORD dwStyle, // стиль статического элемента

const RECT & rect, // положение и размер элемента

CWnd *pParentWnd, // родительское окно, не равен NULL

UINT nID=0xffff); // идентификатор для ссылки на него

Стиль статического элемента

Описание

WS_CHILD

Указывается всегда, т.к. элемент не может быть окном верхнего уровня

WS_VISIBLE

Чтобы элемент был виден сразу же после создания

WS_DISABLE

Элемент недоступен для использования

SS_BLACKFRAME

Прямоугольник цвета рамки окна

SS_BLACKRECT

Закрашенный прямоугольник с цветом рамки окна

SS_CENTER

Определяет прямоугольник и выводит текст в центре

SS_GRAYFRAME

Прямоугольник с рамкой цвета фона клиентской области родительского окна

SS_GRAYRECT

Закрашенный прямоугольник с цветом фона клиентской области родительского окна

SS_ICON

Задает пиктограмму для отображения, lpszText - имя пиктограммы из файла ресурсов

SS_LEFT

Определяет прямоугольник и выводит текст по левому краю

SS_LEFTNOWORDWRAP

Словы не переносятся на следующую строку

SS_NOPREFIX

Если этот стиль не определен, то за знаком & идет символ-акселератор, тогда при выводе текста символ подчеркивается, при этом стиле символ & выводится

SS_RIGHT

Определяет прямоугольник и выводит текст по правому краю

SS_SIMPLE

Определяет прямоугольник и выводит текст по левому краю

SS_USERITEM

Элемент определяется пользователем

SS_WHITEFRAME

Прямоугольник с рамкой белого цвета

SS_WHITERECT

Закрашенный прямоугольник белого цвета

SS_BITMAP

Для битового массива

SS_ICON

Для курсоров и пиктограмм

SS_ENHMETAFILE

Для расширенных метафайлов

SS_CENTERIMAGE

Для трех предыдущих расположение в центре

Если элемент создается в редакторе ресурсов, то функция Create не вызывается пользователем, но все стили можно задать в диалоге свойств элемента.

Некоторые функции для работы со статическим элементом.

HICON CStatic::SetIcon(HICON hIcon);- вывод пиктограммы с идентификатором hIcon. Возвращает NULL или прежний идентификатор пиктограммы.

HICON CStatic::GetIcon();- возврат идентификатора пиктограммы, связанной с элементом.

Если идентификатор статического элемента, созданного в редакторе ресурсов и предназначенного для отображения пиктограммы - ID_MYICON, а идентификатор иконки, созданной там же - IDR_MYICON, то для загрузки пиктограммы можно применить код в одном из методов диалогового родительского класса:

CStatic * pWnd = (CStatic *)GetDlgItem(ID_MYICON);

pWnd->SetIcon(IDR_MYICON);

HBITMAP CStatic::SetBitmap( HBITMAP hBitmap ); указывает идентификатор битового массива, созданного, например, в редакторе ресурсов.

HBITMAP CStatic::GetBitmap( ) const; возаращает идентификатор битового массива, связанного с данным элементом.

Кнопки - CButton

Кнопки определяют и командные кнопки (PUSHBUTTON), и кнопки - флажки (CHECKBUTTON), и кнопки - переключатели (RADIOBUTTON), и кнопки с изображениями, и т. д.

Стили кнопок могут быть заданы при создании кнопки.

Стиль кнопки

Описание

WS_CHILD

Всегда задается при создании кнопки

WS_VISIBLE

Следует указывать, чтобы кнопка сразу отображалась, иначе для нее надо будет вызывать ShowWindow()

WS_DISABLED

Кнопка изначально недоступна

WS_GROUP

Объединение кнопок в группу, обязательно применяется для первого переключателя и после последнего в группе, переход от кнопки к кнопке при помощи клавиш перемещения курсора

WS_TABSTOP

Переход от кнопки к кнопке по клавише TAB

BS_PUSHBUTTON

Простая кнопка, посылает сообщение WM_COMMAND окну- владельцу

BS_CHECKBOX

Определяет флажок с двумя состояниями

BS_RADIOBUTTON

Определяет переключатель для выбора из нескольких кнопок

BS_GROUPBOX

Прямоугольная рамка для объединения других кнопок

BS_DEFPUSHBUTTON

Кнопка "по умолчанию" для диалога, именно она посылает сообщение по нажатии клавиши ENTER

BS_AUTOCHECKBOX

то же самое, что и BS_CHECKBOX, но смена состояния производится автоматически при выборе кнопки

BS_AUTORADIOBUTTON

то же самое, что и BS_RADIOBUTTON, но смена состояния производится автоматически при выборе кнопки

BS_3STATE

то же самое, что и BS_CHECKBOX, но элемент имеет 3 состояния

BS_AUTO3STATE

то же самое, что и BS_3STATE, но смена состояния производится автоматически при выборе кнопки

BS_LEFTTEXT

Расположение текста слева от кнопки, применяется вместе сос стилями BS_CHECKBOX и BS_RADIOBUTTON

BS_OWNERDRAW

Кнопка рисуется пользователем, для этого надо переопределить CButton::DrawItem

BS_TEXT

Кнопка с текстом

BS_ICON

Кнопка с иконкой или курсором

BS_BITMAP

Кнопка с рисунком

BS_LEFT

Выравнивание по левому краю

BS_RIGHT

Выравнивание по правому краю

BS_CENTER

Выравнивание по центру

BS_TOP

Выравнивание по верхнему краю

BS_BUTTOM

Выравнивание по нижнему краю

BS_VCENTER

Выравнивание по центру по вертикали

BS_PUSHLIKE

Кнопка отображается как обычная, но для переключателей и флажков

BS_MULTILINE

Текст может занять несколько строк

BS_NOTIFY

Кнопка посылает сообщение уведомление родительскому окну. Стиль не важен для MFC

BS_FLAT

Кнопка отображается плоской

BS_RIGHTBUTTON

Расположение текста справа от кнопки, применяется вместе сос стилями BS_CHECKBOX и BS_RADIOBUTTON

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

ON_BN_CLICKED - одинарное нажатие на кнопку,

ON_BN_DOUBLECLICKED - двойное нажатие на кнопку.

Некоторые функции для работы с кнопками.

Инициализация выполняется функцией Create:

BOOL CButton::Create(LPCTSTR lpszCaption, // текст на кнопке

DWORD dwStyle, // стиль кнопки

const RECT & rect, // положение и размер кнопки

CWnd *pParentWnd, // родительское окно, не равен NULL

UINT nID); // идентификатор кнопки

Определение состояния кнопок выполняется функциями:

UINT CButton::GetState( ) const; - возвращает состояние кнопки.

Полученное значение надо обработать через маску:

0003 - кнопка включена - 1, нет - 0, неопределенное состояние - 2

0004 - выделена кнопка - 1 или нет - 0

0008 - имеет ли кнопка фокус

void CButton::SetState( BOOL bHighlight ); - выделяет кнопку, параметр принимает значения: TRUE - выдеоить, FALSE - нет.

int CButton::GetCheck( ); - состояние кнопки типа флажок и переключатель:

0 - не выбрана;

1 - выбрана;

2 - не определено.

void CButton::SetCheck(int nCheck ); - состояние кнопки типа флажок и переключатель

Изменение стиля кнопки производится функциями:

UINT CButton::GetButtonStyle( );

void CButton::SetButtonStyle(UINT nStyle, BOOL bRedraw=TRUE);

Параметр nStyle задает стиль кнопки, а bRedraw-указывает, надо ли перерисовывать кнопку сразу же.

Для кнопок со стилями BS_ICON, BS_BITMAP, возможна установка пиктограмм, курсоров и битовых массивов. Изображение на кнопке при нажатии на нее сдвигается вниз и вправо.

HICON CButton::GetIcon( ) const;

HICON CButton::SetIcon( HICON hIcon );

HBITMAP CButton::GetBitmap( ) const;

HBITMAP CButton::SetBitmap( HBITMAP hBitmap );

HCURSOR CButton::GetCursor( );

HCURSOR CButton::SetCursor( HCURSOR hCursor );

Если кнопка имеет стиль BS_OWNERDRAW, то требуется обязательное создание класса на основе CButton с переопределенной функцией DrawItem. В файле triangle_button.zip приводится пример, позволяющий нарисовать треугольные кнопки с разными направлениями.

Когда вы связываете элемент типа кнопка с переменной диалогового класса, то тип переменной определяется стилем кнопки: для кнопки - флажка - тип значения -BOOL, а для типа переключатель значение устанавливается типа int, причем значение задает индекс ( начиная с нуля ) выбранного переключателя.

Поле редактирования CEdit.

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

Сообщение

Описание

ON_EN_CHANGE

Изменился текст в окне

ON_EN_ERRSPACE

Не хватает памяти для размещения текста

ON_EN_HSCROLL

Пользователь сделал горизонтальную прокрутку

ON_EN_KILLFOCUS

Редактор потерял фокус

ON_EN_MAXTEXT

Текст превысил максимально допустимую длину

ON_EN_SETFOCUS

Редактор получил фокус ввода

ON_EN_UPDATE

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

ON_EN_VSCROLL

Пользователь выполнил вертикальную прокрутку

Стили элемента редактирования показаны в таблице.

Стиль элемента редактирования

Описание

WS_CHILD

Всегда задается при создании кнопки

WS_VISIBLE

Следует указывать, чтобы кнопка сразу отображалась, иначе для нее надо будет вызывать ShowWindow()

WS_DISABLED

Кнопка изначально недоступна

WS_GROUP

Объединение кнопок в группу, обязательно применяется для первого переключателя и после последнего в группе, переход от кнопки к кнопке при помощи клавиш перемещения курсора

WS_TABSTOP

Переход от кнопки к кнопке по клавише TAB

ES_AUTOHSCROLL

Автоматическая прокрутка текста вправо

ES_AUTOVSCROLL

автоматическая прокрутка текста на одну строку вверх

ES_CENTER

Центрирует текст

ES_LEFT

Выравнивание по левому краю

ES_LOWERCASE

Все символы преобразуются в строчные

ES_MULTILINE

Задает многострочный редактор

ES_NOHIDESEL

Редактор снимает выделение с текста при потере фокуса и устанавливает при получении, стиль снимает эту возможность

ES_OEMCONVERT

Текст конвертируется в набор OEM

ES_PASSWORD

Выводимые символы заменяются на *. Символ можно заменить, используя функцию SetPasswordChar()

ES_RIGHT

Выравнивание по правому краю

ES_UPPERCASE

Все символы преобразуются в прописные

ES_READONLY

Текст нельзя редактировать

ES_WANTRETURN

Отсутствие этого стиля приведет при нажатии на ENTER к выполнению команды, связанной с кнопкой по умолчапнию для диалога

Некоторые функции для работы с элементом редактирования.

Инициализация выполняется функцией Create:

BOOL CEdit::Create(DWORD dwStyle, // стиль элемента

const RECT & rect, // положение и размер кнопки

CWnd *pParentWnd, // родительское окно, не равен NULL

UINT nID); // идентификатор кнопки

DWORD CEdit::GetSel( ) const;

void CEdit::GetSel( int& nStartChar, int& nEndChar ) const; эти функции возвращают позиции выделенного фрагмента.

void CEdit::ReplaceSel( LPCTSTR lpszNewText, BOOL bCanUndo = FALSE ); - функция выполняут замену выделенного фрагмента на указанный в качестве параметра текст.

Для замены всего текста лучше пользоваться функцией CWnd::SetWindowText().

void CEdit::SetSel( DWORD dwSelection, BOOL bNoScroll = FALSE );

void CEdit::SetSel( int nStartChar, int nEndChar, BOOL bNoScroll = FALSE );- функции изменяют выделение текста. Если начальная позиция 0, а конечная -1, то выделяется весь текст, если же начальная позиция -1, то выделение снимается.

void CEdit::Clear( ); - удаление выделенного текста.

void CEdit::Copy( ); - копирование выделенного текста в буфер обмена.

void CEdit::Cut( ); - вырезание выделенного текста в буфер обмена.

void CEdit::Paste( ); - вставка текста из буфера обмена.

BOOL CEdit::Undo( ); - восстановление удаленного текста и отмена последней операции с текстом.

BOOL CEdit::CanUndo( ) const; - определяет, можно ли отменить почледнюю операцию.

void CEdit::EmptyUndoBuffer( ); - отмена действия отмены последней операции.

BOOL CEdit::GetModify( ) const; - возвращает TRUE, если содержимое редактора изменилось.

void CEdit::SetModify( BOOL bModified = TRUE ); - устанавливает или сбрасывает флаг модификации текста.

BOOL CEdit::SetReadOnly( BOOL bReadOnly = TRUE ); - устанавливает режим "только чтение"

TCHAR CEdit::GetPasswordChar( ) const;

void CEdit::SetPasswordChar( TCHAR ch ); - функции для управления символом, выводимым в поле пароля.

int CEdit::GetFirstVisibleLine( ) const; - функция возвращает индекс самой первой видимой строки.

int CEdit::LineLength( int nLine = –1 ) const; возвращает длину указанной строки.

void CEdit::LineScroll( int nLines, int nChars = 0 ); - прокручивает текст в редакторе, nLines - число строк, nChars - число позиций по горизонтали. Параметры могут иметь разные знаки: - -прокпутка вверх и влево, + - вниз и вправо.

int CEdit::LineFromChar( int nIndex = –1 ) const; - получить номер строки, где содержится символ с указанным от начала текста индексом. Если параметр -1, то возвращается номер строки, где содержится первый выделенный символ.

void CEdit::GetRect( LPRECT lpRect ) const; - получить границы форматирования редактора.

void CEdit::LimitText( int nChars = 0 ); - устанавливает максимальную длину текста. При параметре, равном -1, длина текста равна UINT_MAX.

int CEdit::GetLineCount( ) const; возвращает общее число строк в редакторе.

int CEdit::GetLine( int nIndex, LPTSTR lpszBuffer ) const;

int CEdit::GetLine( int nIndex, LPTSTR lpszBuffer, int nMaxLength ) const; эти функции возвращают число символов в текущей строке и саму строку в указанный буфер.

int CEdit::LineIndex( int nLine = –1 ) const; возвращает индекс текущей строки.

BOOL CEdit::FmtLines( BOOL bAddEOL );

void CEdit::SetTabStops( );

BOOL CEdit::SetTabStops( const int& cxEachStop );

BOOL CEdit::SetTabStops( int nTabStops, LPINT rgTabStops );

void CEdit::SetRect( LPCRECT lpRect ); - изменить размеры прямоугольника, в котором форматируется текст.

DWORD CEdit::GetMargins( ) const; - получить границы полей редактора в пикселах для левого и правого краев.

void CEdit::SetMargins( UINT nLeft, UINT nRight ); - установить границы полей редактора в пикселах.

UINT CEdit::GetLimitText( ) const; - получить значение максимальной длины текста.

void CEdit::SetLimitText( UINT nMax ); - установить максимальную длину текста.

int CEdit::CharFromPos( CPoint pt ) const; - возвращает номер символа ( в младшем слове )и номер строки (в старшем слове ) по указанным координатам.

CPoint CEdit::PosFromChar( UINT nChar ) const; - но номеру символа возвращает его координаты.

Список CListBox.

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

Сообщение

Описание

ON_LBN_DBLCLK

Обработчик двойного щелчка

ON_LBN_SELCANCEL

Обработчик снятия выбора из списка

ON_LBN_SELCHANGE

Обработчик смены выбора из списка

ON_LBN_SETFOCUS

Обработчик получения фокуса списком

ON_WM_CHARTOITEM

Обработчик сообщения для owner-draw списков, не имеющих строковых элементов при получении сообщения WM_CHAR

ON_WM_VKEYTOITEM

Обработчик сообщения для списков со стилем LBS_WANTKEYBOARDINPUT при получении сообщения WM_KEYDOWN

ON_LBN_ERRSPACE

Обработчик сообщения о нехватке памяти

ON_LBN_KILLFOCUS

Обработчик при потере фокуса списком

Стили списка показаны в таблице.

Стиль списка

Описание

WS_CHILD

Всегда задается при создании кнопки

WS_VISIBLE

Следует указывать, чтобы кнопка сразу отображалась, иначе для нее надо будет вызывать ShowWindow()

WS_DISABLED

Кнопка изначально недоступна

WS_GROUP

Объединение кнопок в группу, обязательно применяется для первого переключателя и после последнего в группе, переход от кнопки к кнопке при помощи клавиш перемещения курсора

WS_TABSTOP

Переход от кнопки к кнопке по клавише TAB

WS_HSCROLL

Добавление горизонтальной полосы прокрутки

WS_VSCROLL

Добавление вертикальной полосы прокрутки

LBS_EXTENDESEL

Можно выбирать несколько записей по клавишам Shift и мышке

LBS_HASSTRINGS

Список содержит произвольные строки. Для получения строк можно использовать функцию GetText()

LBS_MULTICOLUMN

Список отображается в несколько столбцов. Ширина столбцов задается функцией SetColumnWidth()

LBS_MULTIPLESEL

Список множественного выбора

LBS_NOINTEGRALHEIGHT

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

LBS_NOREDRAW

Изменения в списке не отображаются автоматически. Стиль может быть изменен посылкой сообщения WM_SETREDRAW

LBS_NOTIFY

Родителбское окно будет получать извещения при некоторых событиях

LBS_OWNERDRAWFIXED

Элементы списка имеют одинаковую ширину, но отрисовка возлагается на родительское окно

LBS_OWNERDRAWVARIABLE

Элементы списка могут иметь разную высоту но отрисовка возлагается на родительское окно

LBS_SORT

Строки списка сортируются по алфавиту

LBS_STANDARD

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

LBS_USETABSTOPS

При отображении строк можно использовать символы табуляции

LBS_WANTKEYBOARDINPUT

Родительское окно получает сообщение WM_VKEYTOITEM или WM_CHARTOITEM, если пользователь нажимает клавишу при фокусу на списке

LBS_DISABLENOSCROLL

Список показывает вертикальную полосу прокрутки всегда, даже если строк немного

Некоторые функции для работы с элементом списка.

С каждой строкой списка можно связать не только текст, но и некоторое численное значение типа DWORD. Можно также связать с каждой строкой (элементом списка) не только численное значение, но и элемент любого типа, но тогда сохраняется указатель на этот элемент. Для этого применяются функции GetItemData и SetItemData, GetItemDataPtr и SetItemDataPtr.

Некоторые функции в случае неудачного выполнения возвращают код ошибки -LB_ERR.

Инициализация выполняется функцией Create:

BOOL CListBox::Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

int CListBox::GetCount( ) const; - возвращает число строк в списке

int CListBox::GetHorizontalExtent( ) const;- возвращает ширину списка в пикселах, в пределах которой он может прокручиваться

void CListBox::SetHorizontalExtent( int cxExtent ); - устанавливает ширину списка в пикселах, в пределах которой он может прокручиваться

int CListBox::GetTopIndex( ) const;- возвращает индекс первой отображаемой строки в списке, индекс меняется от 0

int CListBox::SetTopIndex( int nIndex ); - устанавливает первой отображаемой в списке строку с заданным индексом.

DWORD CListBox::GetItemData( int nIndex ) const; - получить численное значение, связанное с указанной строкой

void* CListBox::GetItemDataPtr( int nIndex ) const; - - получить численное значение, связанное с указанной строкой как указатель на void

int CListBox::SetItemData( int nIndex, DWORD dwItemData ); - связать с указанной строкой значение dwItemData

int CListBox::SetItemDataPtr( int nIndex, void* pData ); - связать с указанной строкой значение указателя на void

int CListBox::GetItemRect( int nIndex, LPRECT lpRect ) const; - в lpRect возвращается размер и координаты прямоугольника, ограничивающего запись с индексом nIndex

UINT CListBox::ItemFromPoint( CPoint pt, BOOL& bOutside ) const; - возвращает индекс ближайшего элемента списка по отношению к точке pt в клиентской зоне списка. bOutside устанавливается в TRUE, если точка лежит вне области списка.

int CListBox::SetItemHeight( int nIndex, UINT cyItemHeight ); - если список имеет тип LBS_OWNERDRAWVARIABLE, то эта функция устанавливает высоту строки в пикселах cyItemHeight с индексом nIndex.

int CListBox::GetItemHeight( int nIndex ) const; - функция, "обратная" предыдущей.

int CListBox::GetSel( int nIndex ) const; - возвращает не 0, если указанная строка с индексом nIndex выбрана.

int CListBox::GetText( int nIndex, LPTSTR lpszBuffer ) const; - пересылает в буфер lpszBuffer содержимое текста в строке с индексом nIndex.

void CListBox::GetText( int nIndex, CString& rString ) const; - функция выполняет те же действия, что и предыдущая, но текст пересылается в объек типа CString.

int CListBox::GetTextLen( int nIndex ) const; - возврвщает длину текста в строке с индексом nIndex.

void CListBox::SetColumnWidth( int cxWidth ); - устанавливает ширину столбцов для списка со стилем LBS_MULTICOLUMN.

void CListBox::SetTabStops( ); - задает позиции табуляции в списке с шагом 32.

BOOL CListBox::SetTabStops( const int& cxEachStop ); - изменяет позиции табуляции на новое значение cxEachStop.

BOOL CListBox::SetTabStops( int nTabStops, LPINT rgTabStops ); - позиции табуляции устанавливаются из массива значений rgTabStop, размер массива - nTabStop.

LCID CListBox::GetLocale( ) const; - для правильной обработки списка, например, сортировки, задается 32-битовое значение - параметр локализации. По умолчанию этот параметр задается операционной системой. Это значение может меняться средствами операционной системы ( установка языка ) или программно. Данная функция возвращает значение этого параметра.

LCID CListBox::SetLocale( LCID nNewLocale ); - функция устанавливает значение параметра локализации.

int CListBox::GetCurSel( ) const; - возвращается индекс выбранной строки.

int CListBox::SetCurSel( int nSelect ); - сделать строку с индексом nSelect выбранной.

int CListBox::SetSel( int nIndex, BOOL bSelect = TRUE ); - устанавливает строку с индексом nIndex в выбранное состояние, если bSelect равен TRUE, и в невыбранное, если bSelect равен FALSE.

int CListBox::GetCaretIndex( ) const; - возвращает индекс строки, на которой установлен фокус в списке.

int CListBox::SetCaretIndex( int nIndex, BOOL bScroll = TRUE ); - устанавливает фокус на строку списка с индексом nIndex. Если bScroll равен 0, то строка прокручивается до полной видимости.

int CListBox::GetSelCount( ) const; - возвращает, сколько выбранных строк в списке со стилем LBS_MULTIPLESEL.

int CListBox::GetSelItems( int nMaxItems, LPINT rgIndex ) const; - заполняет буфер rgIndex индексами строк, выбранных в списке. Размер буфера указан в первом параметре функции, уфер должен быть достаточно большой, чтобы вместить все индексы.

int CListBox::SelItemRange( BOOL bSelect, int nFirstItem, int nLastItem ); - позволяет установить диапазон строк от индекса nFirstItem до nLastItem в состояние выбранных, если bSelect равен TRUE, и в состояние невыбранности, если bSelect равен FALSE.

void CListBox::SetAnchorIndex( int nIndex ); - устанавливает точку отсчета ( первую или последнюю строку ) при выборе диапазона строк.

int CListBox::GetAnchorIndex( ) const; - возвращает ранее установленную точку отсчета.

int CListBox::AddString( LPCTSTR lpszItem ); - вставляет элемент списка с текстом lpszItem в конец списка, возвращает индекс этой строки в списке. Если список имеет стиль LBS_SORT, то список при этом сортируется.

int CListBox::DeleteString( UINT nIndex ); - удаляет элемент списка с индексом nIndex.

int CListBox::InsertString( int nIndex, LPCTSTR lpszItem ); - вставка элемента списка в заданную позицию. Если список сортируется, то возвращается новый индекс строки.

void CListBox::ResetContent( ); - очистить список.

int CListBox::Dir( UINT attr, LPCTSTR lpszWildCard ); - список заполняется содержимым текущего каталога файлов. Первый параметр задает атрибуты выбираемых файлов ( как принято в MS_DOS ), второй параметр - задает строку для выбора, например, *.*. Возвращается индекс последнего добавленного элемента.

int CListBox::FindString( int nStartAfter, LPCTSTR lpszItem ) const; - осуществляет поиск строки в списке, начиная с элемента с индексом nStartAfter. Поиск не зависит от регистра текста.

int CListBox::FindStringExact( int nIndexStart, LPCTSTR lpszFind ) const;- , то же, что и функция выше. Если список имеет стиль самоотображаемого, но без стиля LBS_HASSTRING, то выполняется поиск 32-битового значения, соответствующего lpszFind.

int CListBox::SelectString( int nStartAfter, LPCTSTR lpszItem ); - выполняет поиск строки в списке и делает ее выделенной. При необходимости выполняется прокрутка списка.

virtual int CListBox::VKeyToItem( UINT nKey, UINT nIndex ); - Эта функция вызывается, когда обрабатывается родительским окном сообщение WM_VKEYTOITEM, получаемое от списка, когда он получает сообщение WM_KEYDOWN. По стандартным действиям выполняется изменение фокуса, прокрутка строк и т.д. Если же список имеет стиль LBS_WANTKEYBOARDINPUT и хотя бы одну строку.

virtual int CListBox::CharToItem( UINT nKey, UINT nIndex ); - - Эта функция вызывается, когда обрабатывается родительским окном сообщение WM_CHARTOITEM, получаемое от списка, когда он получает сообщение WM_CHAR. Список должен быть самоотображаемым, при этом не иметь атрибут LBS_HASSTRINGS, и иметь хотя бы однин элемент.

virtual void CListBox::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ); - Эта функция вызывается, когда надо перерисовывать список со стилем LBS_OWNERDRAWFIXED или LBS_OWNERDRAWVARIABLE. Внешний вид списка определяется структурой, передаваемой в качестве параметра.

Структура DRAWITEMSTRUCT имеет следующий вид:

typedef struct tagDRAWITEMSTRUCT {

UINT CtlType; //тип отображаемого элемента:

//ODT_BUTTON, ODT_COMBOBOX, ODT_LISTBOX или

//ODT_MENU. Для списка ODT_LISTBOX.

UINT CtlID; //идентификатор элемента

UINT itemID; //индекс записи в списке или меню

UINT itemAction; //как выполнять перерисовку:

// ODA_DRAWENTIRE - весь элемент перерисовать

// ODA_FOCUS - установлен, когда элемент

//потерял фокус, надо анализировать для строк

// itemState

// ODA_SELECT - установлен, когда сделан выбор

//в элементе, надо анализировать для строк

// itemState

UINT itemState; //определяет состояние строки после перерисовки:

//ODS_DISABLED - строка недоступна после

//перерисовки

//ODS_FOCUS - строка имеет фокус ввода

//ODS_SELECTED - строка выбрана

HWND hwndItem; //дескриптор окна элемента управления

HDC hDC; //контекст устройства вывода

RECT rcItem; //прямоугольник для перерисовки

DWORD itemData; //связанное с элементом списка значение

} DRAWITEMSTRUCT;

virtual void CListBox::MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct); - Эта функция вызывается, когда надо перерисовывать список со стилем LBS_OWNERDRAWFIXED или LBS_OWNERDRAWVARIABLE. Функция задает размеры для перерисовки. Размеры элемента списка определяются структурой, передаваемой в качестве параметра.

Структура MEASUREITEMSTRUCT имеет следующий вид:

typedef struct tagMEASUREITEMSTRUCT {

UINT CtlType; //тип элемента управления (см. в предыдущей

//функции)

UINT CtlID; //идентификатор элемента управления

UINT itemID; //индекс элемента в списке для списков с разной

//высотой элементов

UINT itemWidth; //ширина элемента в меню ( для списков не

//применяется

UINT itemHeight; //высота элемента в списке ( максимум равен 255)

DWORD itemData //то же самое, что и в предыдущей функции

} MEASUREITEMSTRUCT; //

virtual int CListBox::CompareItem( LPCOMPAREITEMSTRUCT lpCompareItemStruct); - Эта функция вызывается для сортировки списка, когда он имеет стиль отображаемого пользователем и сортируемого. Параметр указывает, как выполняется сравнение элементов списка.

Функция возвращает следующие значения:

-1, первый элемент меньше второго,

0, первый элемент равен второму

1, первый элемент больше второго

Структура COMPAREITEMSTRUCT имеет следующий вид:

typedef struct tagCOMPAREITEMSTRUCT {

UINT CtlType; // тип элемента управления (см. в предыдущей

//функции)

UINT CtlID; // идентификатор элемента управления

HWND hwndItem; // дескриптор окна элемента управления

UINT itemID1; //индекс в списке первого элемента

DWORD itemData1; //информациия, связанная с первым элементом

UINT itemID2; // индекс в списке второго элемента

DWORD itemData2; // информациия, связанная с первым элементом

} COMPAREITEMSTRUCT;

virtual void CListBox::DeleteItem( LPDELETEITEMSTRUCT lpDeleteItemStruct ); - функция вызывается, когда пользователь удаляет элемент для самоотображаемого списка. Параметр определяет информацию об удаляемой записи.

typedef struct tagDELETEITEMSTRUCT { /* ditms */

UINT CtlType; //// тип элемента управления (см. в предыдущей

//функции)

UINT CtlID; // идентификатор элемента управления

UINT itemID; // индекс в списке удаляемого элемента

HWND hwndItem; // дескриптор окна элемента управления

UINT itemData; // информациия, связанная с удаляемым элементом

} DELETEITEMSTRUCT;

Комбинированный список CComboBox.

Комбинированный список объединяет в себе свойства CEdit и CListBox. Часть списка может выводиться на экран постоянно (CBS_SIMPLE) или выпадает из окна (CBS_DROPDOWN или CBS_DROPDOWNLIST). Выбранная запись выводится в окне. Эту запись можно редактировать (CBS_SIMPLE или CBS_DROPDOWN), или же она недоступна для редактирования (CBS_DROPDOWNLIST). Уведомляющие сообщения, посылаемые родительскому окну, имеют вид:

Сообщение

Описание

ON_CBN_CLOSEUP

Окно списка закрыто, для списка CBS_SIMPLE не посылается

ON_CBN_DBLCLK

Двойной щелчок на элементе списка, для списка CBS_SIMPLE посылается.

ON_CBN_DROPDOWN

Окно списка развернуто, для списка CBS_SIMPLE не посылается

ON_CBN_EDITCHANGE

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

ON_CBN_EDITUPDATE

Пользователь изменил строку, но текст еще не выведен на экран, сообщение не посылается для списка CBS_DROPDOWNLIST

ON_CBN_ERRSPACE

Не хватает памяти для выполнения запроса

ON_CBN_SELENDCANCEL

Выбор пользователя игнорируется

ON_CBN_SELENDOK

Пользователь выбрал строку списка

ON_CBN_SELCHANGE

Выбор в списке изменился

ON_CBN_SETFOCUS

Элемент получил фокус ввода

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

Стиль списка

Описание

WS_CHILD

Всегда задается при создании кнопки

WS_VISIBLE

Следует указывать, чтобы кнопка сразу отображалась, иначе для нее надо будет вызывать ShowWindow()

WS_DISABLED

Кнопка изначально недоступна

WS_GROUP

Объединение кнопок в группу, обязательно применяется для первого переключателя и после последнего в группе, переход от кнопки к кнопке при помощи клавиш перемещения курсора

WS_TABSTOP

Переход от кнопки к кнопке по клавише TAB

CBS_AUTOHSCROLL

Текст в элементе может прокручиваться по горизонтали

CBS_SIMPLE

Список отбражается в раскрытом виде все время

СBS_DROPDOWN

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

СBS_DROPDOWNLIST

Список похож на предыдущий, но строку нельзя редактировать

CBS_HASSTRINGS

Список содержит произвольные строки. Для получения строк можно использовать функцию GetText()

CBS_OEM_CONVERT

Вводимые сиволы конвертируются в OEM код.

CBS_OWNERDRAWFIXED

Элементы списка имеют одинаковую ширину, но отрисовка возлагается на родительское окно

CBS_OWNERDRAWVARIABLE

Элементы списка могут иметь разную высоту но отрисовка возлагается на родительское окно

CBS_SORT

Строки списка сортируются по алфавиту

CBS_DISABLENOSCROLL

Список показывает вертикальную полосу прокрутки всегда, даже если строк немного

CBS_NOINTEGRALHEIGHT

Список будет иметь размер точно равный, заданному при создании, обычно этот размер изменяется так, чтобы последняя строка была видна целиком

Некоторые функции для работы с элементом комбинированного списка.

BOOL CComboBox::Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); - выполняет инициализацию элемента

Многие функции комбинированного списка совпадают с функциями CEdit и CListBox, поэтому ниже приводится только перечень таких функций.

int CComboBox::GetCount( ) const; - как в CListBox.

int CComboBox::GetCurSel( ) const; - как в CListBox.

int CComboBox::GetCurSel( ) const; - как в CListBox.

DWORD CComboBox::GetEditSel( ) const; - как в CEdit.

BOOL CComboBox::SetEditSel( int nStartChar, int nEndChar ); - как в CEdit.

int CComboBox::SetItemData( int nIndex, DWORD dwItemData ); - как в CListBox.

int CComboBox::SetItemDataPtr( int nIndex, void* pData ); - как в CListBox.

DWORD CComboBox::GetItemData( int nIndex ) const; - как в CListBox.

void* CComboBox::GetItemDataPtr( int nIndex ) const; - как в CListBox.

int CComboBox::GetTopIndex( ) const; - как в CListBox.

int CComboBox::SetTopIndex( int nIndex ); - как в CListBox.

void CComboBox::SetHorizontalExtent( UINT nExtent ); - как в CEdit.

UINT CComboBox::GetHorizontalExtent( ) const; - как в CEdit.

void CComboBox::Clear( ); - удаление выделенного текста, как в CEdit.

void CComboBox::Copy( ); - копирование выделенного текста в буфер обмена, - как в CEdit.

void CComboBox::Cut( ); - вырезание выделенного текста в буфер обмена, - как в CEdit..

void CComboBox::Paste( ); - вставка текста из буфера обмена, - как в CEdit.

BOOL CComboBox::LimitText( int nMaxChars ); - как в CEdit.

int CComboBox::SetItemHeight( int nIndex, UINT cyItemHeight ); - как в CListBox.

int CComboBox::GetItemHeight( int nIndex ) const; - как в CListBox.

LCID CComboBox::GetLocale( ) const; - как в CListBox.

LCID CComboBox::SetLocale( LCID nNewLocale ); - как в CListBox.

int CComboBox::AddString( LPCTSTR lpszString ); - как в CListBox.

int CComboBox::DeleteString( UINT nIndex ); - как в CListBox.

int CComboBox::InsertString( int nIndex, LPCTSTR lpszString ); - как в CListBox.

void CComboBox::ResetContent( ); - как в CListBox.

int CComboBox::Dir( UINT attr, LPCTSTR lpszWildCard ); - как в CListBox.

int CComboBox::FindString( int nStartAfter, LPCTSTR lpszString ) const; - как в CListBox.

int CComboBox::FindStringExact( int nIndexStart, LPCTSTR lpszFind ) const; - как в CListBox.

int CComboBox::SelectString( int nStartAfter, LPCTSTR lpszString ); - как в CListBox.

virtual void CComboBox::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ); - как в CListBox.

virtual void CComboBox::MeasureItem( LPMEASUREITEMSTRUCT - как в CListBox.lpMeasureItemStruct );

virtual int CComboBox::CompareItem( LPCOMPAREITEMSTRUCT lpCompareItemStruct ); - как в CListBox.

virtual void CComboBox::DeleteItem( LPDELETEITEMSTRUCT lpDeleteItemStruct ); - как в CListBox.

Некоторые функции специфичны только для CComboBox:

int CComboBox::SetDroppedWidth( UINT nWidth ); - устанавливает минимальную ширину раскрывающегося списка (в пикселах).

int CComboBox::GetDroppedWidth( ) const; - возврашщает минимальную ширину раскрывающегося списка в пикселах.

int CComboBox::GetLBText( int nIndex, LPTSTR lpszText ) const;

void CComboBox::GetLBText( int nIndex, CString& rString ) const;- эти функции возвращают строку из списка с указанным индексом nIndex.

int CComboBox::GetLBTextLen( int nIndex ) const; - возвращает длину строки с индексом nIndex.

void CComboBox::ShowDropDown( BOOL bShowIt = TRUE ); - делает видимым (если bShowIt равен TRUE ) или невидимым список.

void CComboBox::GetDroppedControlRect( LPRECT lprect ) const; - возвращает экранные координаты раскрывающегося списка.

BOOL CComboBox::GetDroppedState( ) const; - определяет, видим ли список.

Для раскрывающегося списка могут быть использованы два типа интерфейса: стандартный или расширенный. Расширенный интерфейс позволяет:

при щелчке мышью на поле списка раскрывает список;

принажатии клавиши на клавиатуре список раскрывается.

int CComboBox::SetExtendedUI( BOOL bExtended = TRUE ); - устанавливает расширенный интерфейс списка при bExtended. равном TRUE.

BOOL CComboBox::GetExtendedUI( ) const; - возвращает, имеет ли список расширенный интерфейс.

Приложение №2