пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Использование элементов типа переключатель (флажки, радио-кнопки). Статические поля (Static text). Окна редактирования (Edit box). Методы класса CEdit.

Использование элементов типа переключатель.

Можно так организовать программу, что по умолчанию будет выбран один из переключателей.

Для выбора одного из переключателей в группе диалогового окна необходимо добавить следующий текст в функцию CSDIDialog::0nInitDialog():

m_radio = 1;

UpdateData(FALSE);

Членом-переменной является m_radio, с которым связана группа переключателей. Она (переменная) представляет собой индекс выбранного переключателя в этой группе элементов управления (как всегда, индекс начинается с 0). Значение индекса 1 соответствует второму переключателю в группе. Вызов функции UpdateData() в этом фрагменте обновляет содержимое элементов управления диалогового окна соответственно состоянию связанных с ними переменных-членов. Аргумент функции UpdateData() указывает направление передачи данных: UpdateData(TRUE) обновило бы содержимое переменных соответственно элементам управления, т.е. переписало бы в m_radio индекс выбранного в группе переключателя.

В отличие от списка группа переключателей доступна и после того, как диалоговое окно убрано с экрана. Так что вам не придется добавлять что-либо в функции ОnОК() и OnCanceI(). Вместо этого у вас будет другая проблема – как преобразовать целое значение индекса в строковое выражение, которое нужно будет добавить в "хвост" текста сообщения в переменную msg. Существует множество ее решений, включая функцию-член Format() класса CString, но в данном случае можно поступить гораздо проще – использовать оператор switch, поскольку индекс может принимать лишь ограниченное множество значений. В конец текста функции CSDIApp::InitInstance(), перед вызовом AfxMessageBox(), добавьте несколько строк, представленных в листинге.

Строки, которые следует включить в функцию CSDIApp::InitInstance():

msg += "\г\п";

msg += "Radio Selection: ";

switch (dig.m_radio)

зн(case 0:

msg += "O";

break;

case 1:

msg += "1";

break;

case 2:

msg += "2";

break;

default:

msg += "none";

break;) зн

Первая из новых строк добавляет в сообщение два специальных символа – перевод каретки \r и перевод строки \n,  которые в совокупности представляют маркер конца строки Windows. В результате дальнейшая часть сообщения msg начнется с новой строки.

"Статические поля (класс static)"

Статическое окно управления - это окно, создаваемое на базе класса ”CStatic”.Статические окна нельзя использовать для управления работой приложения: они не воспринимают щелчки мыши и не обрабатывают сообщения от клавиатуры, не посылает родительскому окну сообщение WM_COMMAND. Обычно этот орган управления используется для оформления внешнего вида диалоговых панелей или окон приложения. Все сообщения от мыши через “прозрачное” окно статического дочернего окна попадают в родительское окно.

Рассмотрим некоторые стили статического окна

Статический класс окон включает в себя три стиля текста – SS_LEFT, SS_RIGHT и SS_CENTER. Они предназначены для выравнивания текста соответственно по левому краю, правому краю и центру. Текст задается в параметре текста окна функции SetWindowText.

Класс CEdit

Класс CEdit обеспечивает функционирование элемента управления «окно редактирования» (Edit box). Окно редактирования – это окно, в котором пользователь может вводить и редактировать текст.

CEdit наследует методы от CWnd. Чтобы установить или получить текст из окна CEdit можно пользоваться методами CWnd SetWindowText и GetWindowText. Даже в случае многострочного окна. А также, если окно многострочное, получать или устанавливать часть текста путем вызова методов GetLine, SetSel, GetSel, ReplaceSel.

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

Список возможных сообщений от CEdit:

EN_CHANGE содержимое окна будет меняться. Так же как и EN_UPDATE сообщение посылается после того, как Windows обновит экран.

EN_ERRSPACE – поле редактирования не имеет достаточно памяти.

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

EN_KILLFOCUS – окно редактирования потеряло фокус ввода.

EN_MAXTEXT – Текущая вставка превысила заданное число символов для окна редактирования и будет урезана. Также посылается , когда окно редактирования на имеет стиля ES_AUTOHSCROLL и число символов, которое должно быть вставлено превысит ширину окна. Также посылается, когда окно не имеет стиля ES_AUTOVSCROLL и общее число строк будет превышать высоту окна редактирования.

EN_SETFOCUS – посылается, когда окно редактирования получает входной фокус.

EN_UPDATE – содержимое окна изменилось. Посылается после того, как окно отформатировало текст, но перед тем, как изобразить его на экране, так что размер окна может быть изменен, если необходимо.

EN_VSCROLL – – на вертикальной полосе прокрутки был щелчок мышью. Родительское окно извещается прежде, чем экран изменится.

Если вы создаете объект CEdit внутри диалогового окна, он разрушается автоматически, когда пользователь закроет окно диалога.

Управляющие окна редактирования хранят текст в области памяти программы (в адресном пространстве программы). Содержимое управляющих полей редактирования ограничено примерно 32 килобайтами.

Рассмотрим стили окон редактирования

Текст в управляющих окнах редактирования может быть выравнен либо по правому краю, либо по правому, либо по центру. Формат можно задать с помощью стилей окна ES_LEFT, ES_RIGHT и ES_CENTER.

По умолчанию в управляющем окне редактирования имеется одна строка. Для создания такого окна с автоматической горизонтальной прокруткой следует добавить стиль ES_AUTOHSCROLL.

Приложение может создать многострочное управляющее окно редактирования, используя стиль окна ES_MULTILINE. Для многострочного окна редактирования, если не задан стиль ES_AUTOHSCROLL, то текст автоматически переносится на новую строку при достижении правого края окна.

При задании стиля ES_AUTOHSCROLL в многострочном редакторе для перехода на новую строку нужно нажимать клавишу <Enter> (т.е. появляется возможность горизонтальной прокрутки). Используя стиль окна ES_AUTOVSCROLL, в многострочное окно редактирования можно включить возможность вертикальной прокрутки.

Если стили ES_AUTOHSCROLL и ES_AUTOVSCROLL включены в многострочные управляющие окна, то можно добавить и сами полосы прокрутки.

Добавление полос прокрутки делается путем использования идентификаторов стиля окна, WS_HSCROLL и WS_VSCROLL.

Чаще всего для многострочных редакторов используется следующая комбинация стилей:

WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER|

ES_MULTILINE|ES_|ES_AUTOVSCROLL|WS_HSCROLL|WS_VSCROLL

Родительские окна также могут посылать окнам редактирования сообщения

Специфических сообщений, которые родительское окно может послать окну редактирования, достаточно много. Рассмотрим наиболее часто употребляемые:

WM_CUT - для удаления с пересылкой в буфер обмена;

WM_COPY - копирования в буфер обмена;

WM_CLEAR - очищения выделенной части текста из окна редактирования;

WM_PASTE - для вставки текста из буфера обмена в окно редактирования;

EM_GETSEL - для получения начальной и конечной позиции текущего выделения текста;

EM_SETSEL - для выделения некоторого участка текста;

EM_REPLACESEL - для замены текущего выделенного текста другим текстом;

EM_GETLINECOUNT - для получения число строк многострочного редактора;

EM_LINEINDEX - для получения смещения от начала буфера до некоторой строки;

EM_LINELENGTH - для получения длины некоторой строки;

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

Некоторые методы класса CEdit

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

Общие методы

Методы для получения первой и последней позиции выделенного фрагмента текста:

DWORD GetSel() const;

void GetSel(int& nStartChar, int& nEndChar) const;

Для значения типа DWORD младшее слово содержит позицию первого, старшее - последнего символа.

Методы для установки нового выделения текста, задаваемого первым и последним выделенный символ:

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

или

void SetSel(int nStartChar, int nEndChar, BOOL bNoScroll=FALSE);

Значение FALSE параметра bNoScroll должно отключать перемещение курсора в область видимости.

Метод для замены выделенного фрагмента текста на строку, передаваемую в параметре lpszNewText:

void ReplaceSel(LPCTSTR lpszNewText);

Метод для удаления выделенного фрагмента текста:

void Clear();

Метод для копирования выделенного фрагмента текста в буфер Windows:

void Copy();

Метод для переноса выделенного фрагмента текста в буфер обмена Windows (копирует в буфер и удаляет из текста):

void Cut();

Метод для вставки текста из буфера обмена, начиная с позиции, в которой находится курсор:

void Paste();

Метод для отмены последней операции, выполненной редактором:

BOOL Undo();

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

Метод для определения того, можно ли отменить последнюю операцию редактора:

BOOL CanUndo() const;

Метод для сброса флага undo (он сигнализирует о возможности отмены последней операции редактора), его вызов делает невозможным отмену:

void EmptyUndoBuffer();

Этот флаг сбрасывается автоматически при выполнении методов SetWindowText и SetHandle.

Метод для определения значения флага модификации содержимого окна:

BOOL GetModify() const;

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

Метод для установки или сброса флага модификации (см. предыдущий метод):

void SetModify(BOOL bModified=TRUE);

Флаг сбрасывается при вызове метода с параметром FALSE и устанавливается при модификации содержимого окна редактирования или при вызове SetModify с параметром TRUE.

Метод для установки режима просмотра (bReadOnly=TRUE) или редактирования (bReadOnly=FALSE):

BOOL SetReadOnly(BOOL bReadOnly=TRUE);

Метод для определения символа, который при выводе пароля будет появляться на экране вместо символов, набираемых пользователем:

TCHAR GetPasswordChar() const;

Если такой символ не определен, возвращается 0. Устанавливается этот символ методом (по умолчанию используется "*"):

void SetPasswordChar(TCHAR ch);

Метод для установки максимальной длины (в байтах) текста, который может ввести пользователь:

void LimitText(int nChars=0);

Если значение параметра равно 0, длина текста устанавливается равной UINT_MAX.

Методы работы с многострочным редактором

Метод для осуществления прокрутки текста в области редактирования:

void LineScroll(int nLines, int nChars=0);

Параметр nLimes задает число строк для вертикальной прокрутки. Окно редактирования не прокручивает текст дальше последней строки. При положительном значении параметра область редактирования сдвигается вдоль текста к последней строке, при отрицательной - к первой.

Параметр nChars задает число символов для горизонтальной прокрутки. Окно редактирования прокручивает текст вправо, даже если строки закончились. В этом случае в области редактирования появляются пробелы. При положительном значении параметра область редактирования сдвигается вдоль к концу строки, при отрицательном - к началу.

Метод для определения номера первой видимой строки в области редактирования:

int GetFirstVisibleLine() const;

Метод для определения числа строк текста, находящегося в области редактирования:

int GetLineCount() const;

Если текст не вводился, возвращает 1.

Методы для копирования содержимого определенной строки в буфер:

int GetLine(int nIndex, LPTSTR lpszBuffer) const;

или

int GetLine(int nIndex, LPTSTR lpszBuffer, int nMaxLength) const;

Копирует строку с номером, равным значению параметра nIndex, в буфер, заданный параметром lpszBuffer. Первое слово в буфере должно задавать его размер. При вызове второго варианта метода значение параметра nMaxLength копируется в первое слово буфера.

Метод возвращает число в действительности скопированных байтов. Если номер строки больше или равен числу строк в буфере окна редактирования, возвращает 0. Текст копируется без каких-либо изменений, нуль-символ не добавляется.

Метод для определения номера первого символа определенной строки:

int LineIndex(int nLine=-1) const;

Неотрицательное значение параметра принимается в качестве номера строки. Значение -1 задает текущую строку. Если номер строки больше или равен числу строк в буфере окна редактирования (строки нумеруются с 0), возвращается 0.


18.01.2020; 19:58
хиты: 64
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь