- •Диалоговая панель
- •Приложение с модальной диалоговой панелью
- •Создание диалоговой панели с помощью редактора ресурсов.
- •Создание приложения с модальной диалоговой панелью.
- •Обмен данными.
- •Обработка сообщений класса сMyDialog.
- •Приложение с немодальной диалоговой панелью
- •Некоторые функции для работы с диалоговыми панелями.
- •Пример оформления «Технического задания»
- •5. Требования к программной документации
- •1. Введение
- •2. Основание для разработки
- •3. Назначение
- •1. Введение
- •2. Основание для разработки
- •3. Назначение
- •4.2. Требования к надежности
- •6. Этапы разработки
Некоторые функции для работы с диалоговыми панелями.
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