Порядок выполнения работы. Создать указанное в задании приложение с использованием модального диалога с
Создать указанное в задании приложение с использованием модального диалога с запуском его из главного меню. Оттранслируйте и постройте задачу, запустите ее. Проанализируте полученный код. Обратите внимание на таблицу сообщений. Найдите макросы DECLARE_MESSAGE и таблицы сообщений. Добавьте проверку данных, вводимых в диалоге. Добавьте новый диалог. Используя новый пункт меню, запустите его как немодальный. Добавьте возможность в программе запускать несколько немодальных диалогов одновременно. Исправьте диалог About. Замените иконку, а также выводимый текст. Поэкспериментируйте с различными диалоговыми элементами, применяемыми в диалогах. Добейтесь обмена данными между диалоговыми элементами и переменными и покажите значения переменных, используя AfxMessage. Попробуйте добавить динамически один из элементов Windows. Вопросы для самопроверки. Как строятся диалоговые окна с использованием Visual C++? Какие существуют типы диалоговых панелей? Какие классы MFC обеспечивают работу (представляют) эти дилоговые панели? Чем отличаются модальные и немодальные диалоговые окна? Каковы этапы создания и отображения модальной диалоговой панели? Каковы этапы создания и отображения немодальной диалоговой панели? Для чего предназначен механизм автоматического обмена данными (DDX) и механизм автоматической проверки данных (DDV)? Какой виртуальный метод класса CDialog должен быть переопределен для реализации механимов DDX и DDV? Имеет ли право приложение напрямую вызывать метод DoDataExchange? Как обеспечить обмен данными между элементами управления диалоговой панели и переменными класса, представляющего эту диалоговуюпанель? Вызов какого метода (и с каким параметром) обеспечивает инициализацию диалоговой панели, при которой информация из переменных класса отображается в элементах управления диалоговой панели? Вызов какого метода (и с каким параметром) обеспечивает копирование информации из элементов управления диалоговой панели в переменные класса? Создается ли Windows-окно диалога при создании объекта класса CDialog? Каким методом создается Windows-окно модального диалога и когда этот метод возвращает управление? Удаляется ли при этом: 1) Windows-окно диалога, 2) объект класса CDialog? Каким методом создается Windows-окно немодального диалога? Что необходимо сделать для удаления (для закрытия) этого окна? Удаляется ли при этом объект класса CDialog? Для чего предназначены следующие средства автоматизации разработки приложения: 1) MFC AppWizard, 2) MFC ClassWizard, 3) редактор ресурсов? Какой класс является родительским для всех классов диалоговых панелей? Какие параметры передаются констуктору класса диалоговой панели? В какой блок констуктора средство ClassWizard добавляет код инициализации переменных класса диалога, присоединенных к элементам управления панели? Где размещаются вызовы методов, обеспечивающих процесс обмена и проверки данных Вызов каких методов класса диалога приводит к созданию Windows-окна диалога? Какой метод класса диалога вызывается в ответ на создание Windows-окна панели диалога? Когда это происходит? Как с помощью средства ClassWizard можно: 1) создать новый класс, 2) добавить в класс новые методы, 3) включить в класс новые переменные, связанные с элементами управления панели диалога? Какие классы создает средство AppWizard при создании приложения, основанного на диалоге? В каких файлах проекта располагаются их объявление и реализация? Почему метод InitInstance класса приложения, основанного на диалоге, возвращает значение FALSE? Как разрешить использование русского текста в меню и диалогоах? Какие стандартные элементы Windows вы научились использовать в диалогах? Как создать переключатель? Как динамически задать появление элемента в диалоге? 6 Приложение I 6.1 Описание классов стандартных элементов Windows. Рассмотрим некоторые классы элементов управления Windows:
6.2 Создание элементов Все элементы управления могут быть созданы с помощью редактора ресурсов ( см. лаб. раб. № 3,4) или динамически во время выполнения приложения. Создание элементов с использованием редактора ресурсов и связь их с переменными класса диалоговой панели рассмотрено подробно в теоретических сведениях к лаб. раб. 3,4. При создании элементов задаются стили и их комбинации через логическую функцию |. Для каждого вида элемента наборы стилей свои, хотя есть стили, общие для всех окон, например, 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 } 6.3 Элемент статического типа - CStatic.
Класс CStatic позволяет выводить текст, пиктограммы, курсоры, битовые массивы. Обычно статические элементы не требуют ввода, но они могут уведомлять родительское окно о нажатии клавиши, но вэтом случае при их создании должен быть установлен стиль SS_NOTIFY. Конструктор не создает объект Windows: CStatic::CStatic(); Инициализация выполняется функцией Create: BOOL CStatic::Create(LPCTSTR lpszText, // текст в элементе управления DWORD dwStyle, // стиль статического элемента const RECT & rect, // положение и размер элемента CWnd *pParentWnd, // родительское окно, не равен NULL UINT nID=0xffff); // идентификатор для ссылки на него
Если элемент создается в редакторе ресурсов, то функция Create не вызывается пользователем, но все стили можно задать в диалоге свойств элемента. 6.3.1 Некоторые функции для работы со статическим элементом. 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; возаращает идентификатор битового массива, связанного с данным элементом. 6.4 Кнопки - CButton
Кнопки определяют и командные кнопки (PUSHBUTTON), и кнопки - флажки (CHECKBUTTON), и кнопки - переключатели (RADIOBUTTON), и кнопки с изображениями, и т. д. Стили кнопок могут быть заданы при создании кнопки.
Кнопки посылают два вида сообщений родительскому окну: ON_BN_CLICKED - одинарное нажатие на кнопку, ON_BN_DOUBLECLICKED - двойное нажатие на кнопку. 6.4.1 Некоторые функции для работы с кнопками. Инициализация выполняется функцией 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, причем значение задает индекс ( начиная с нуля ) выбранного переключателя.
6.5 Поле редактирования CEdit.
Обычно этот элемент используется для реализации поля ввода. Элемент может включать как одну, так и несколько строк. Приложение не контролирует процесс ввода информации. Но можно добавить обработчики в родительское окно для следующих уведомляющих сообщений:
Стили элемента редактирования показаны в таблице.
6.5.1 Некоторые функции для работы с элементом редактирования. Инициализация выполняется функцией 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; - но номеру символа возвращает его координаты.
6.6 Список CListBox.
Список - элемент, включающий несколько строк текста, позволяющий выбрать из них одну или несколько. Список посылает родительскому окну различные сообщения-извещения. Для них предусмотрены макросы, добавляемые в карту сообщений. Большинство сообщений посылается родительскому окну тогда, когда список является текущим элементом управления. Первые три макроса будут обеспечивать вызов соответствующих функция только, если стиль элемента списка - LBS_NOTIFY.
Стили списка показаны в таблице.
6.6.1 Некоторые функции для работы с элементом списка. С каждой строкой списка можно связать не только текст, но и некоторое численное значение типа 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; 6.7 Комбинированный список CComboBox.
Комбинированный список объединяет в себе свойства CEdit и CListBox. Часть списка может выводиться на экран постоянно (CBS_SIMPLE) или выпадает из окна (CBS_DROPDOWN или CBS_DROPDOWNLIST). Выбранная запись выводится в окне. Эту запись можно редактировать (CBS_SIMPLE или CBS_DROPDOWN), или же она недоступна для редактирования (CBS_DROPDOWNLIST). Уведомляющие сообщения, посылаемые родительскому окну, имеют вид:
Стили комбинированного списка показаны в таблице.
(0.011 сек.) |