Стоит Windows 8 Pro, Visual Studio 2010 Express Edition . |
Модальные окна страниц свойств MFC
Отключение вкладок
Иногда может потребоваться отключить (сделать недоступными - Disabled ) некоторые вкладки окна свойств. Прямых способов отключения вкладок не существует, поэтому рассмотрим обходные пути решения этой задачи. Для этого нужно выполнить следующие действия:
- Создать переменную для хранения индекса текущей вкладки
- Создать массив переменных для хранения индексов всех отключенных в данный момент вкладок
- Создать обработчик уведомляющего сообщения TCN_SELCHANGING или TCN_SELCHANGE позволяющего выяснить индекс текущей вкладки
- Разместить в этом обработчике код, принимающий решение о необходимости активизации вкладки
- В качестве альтернативы можно воспользоваться сообщением
Создание переменной хранения индекса текущей вкладки
-
Добавьте в конец объявления класса CFindSheet в файле FindSheet.h следующий код
Объявление переменной хранения индекса текущей вкладки class CFindSheet : public CPropertySheet { ............................. protected: int m_iLastActivePage; };
Создание массива индексов отключенных вкладок
В следующих двух таблицах приведены классы массивов, поддерживаемые MFC, и описание их общедоступных методов
Создадим стандартный массив MFC -класса CUIntArray, в котором будут содержаться индексы всех вкладок окна свойств, заблокированных в данный момент.
-
Добавьте в конец объявления класса CFindSheet в файле FindSheet.h следующий код
Создание массива индексов отключенных вкладок class CFindSheet : public CPropertySheet { ..................................................... protected: int m_iLastActivePage; CUIntArray m_arrDisabledPages; };
Добавление функции-члена, отключающей определенные вкладки
Добавим в класс CFindSheet функцию-член, позволяющую отключать определенные вкладки. Подлежащие отключению вкладки указаны в передаваемом этой функции аргументе переменной длины ( vararg ), представляющем собой список с завершающим терминатором -1. Эта функция добавляет переданные индексы вкладок в массив m_arrDisabledPages, затем маркирует вкладку присоединением к ее названию текста "-Disabled".
Эту дополнительную работу с добавлением маркера "-Disabled" нужно выполнять потому, что не существует способа по настоящему сделать вкладку недоступной с помощью изменения ее цвета на серый. Поэтому Microsoft рекомендует просто добавлять к заголовку вкладки маркирующий текст.
- Выделите в панели Class View класс CFindSheet и вызовите мастер добавления функций, который заполните так
-
Нажмите кнопку Add, затем кнопку Finish
Мастер добавит заготовку в конец файла FindSheet.cpp, а в описание класса добавит прототип функции.
-
Исправьте прототип и заголовок функции для возможности передачи аргументов переменной длины, чтобы они смотрелись так
Правка в файле FindSheet.h class CFindSheet : public CPropertySheet { ............................................... public: // Отключение вкладок void DisablePage(int iFirstPage, ...); };
Правка в файле FindSheet.cpp // Отключение вкладок void CFindSheet::DisablePage(int iFirstPage, ...) { }
-
Наполните созданную функцию следующим кодом
Заполнение функции кодом // Отключение вкладок void CFindSheet::DisablePage(int iFirstPage, ...) { int iPage = iFirstPage; va_list marker; va_start (marker, iFirstPage); int nArgs = 0; while(iPage != -1){// Список заканчивается -1 // Добавить индекс страницы // в массив отключенных страниц, // если его там нет int count = (int)m_arrDisabledPages.GetCount(); bool flag = false; for(int i = 0; i < count; i++) if(m_arrDisabledPages.GetAt(i) == (UINT)iPage){ flag = true; break; } if(!flag) m_arrDisabledPages.Add(iPage); SetDisabledText(iPage); // Наша функция маркирует вкладку // Получить индекс следующей страницы iPage = va_arg(marker, UINT); nArgs++; // счетчик вкладок ASSERT(nArgs < 100); // Страж зацикливания } }
Изменение заголовка вкладки
Создадим функцию SetDisabledText(), вызов которой мы предусмотрели в предыдущей функции.
- Выделите в панели Class View класс CFindSheet и вызовите мастер добавления функций, который заполните так
- Нажмите кнопку Add, затем кнопку Finish. Мастер добавит заготовку в конец файла FindSheet.cpp, а в описание класса добавит прототип функции
-
Перед заголовком реализации функции добавьте макроопределение, а в тело функции код
Маркировка вкладок #define DISABLED_TEXT " - Disabled" // Маркировка текста заголовков вкладок void CFindSheet::SetDisabledText(int iPage) { CTabCtrl *pTab = GetTabControl(); ASSERT(pTab); TC_ITEM ti; char szText[100]; ti.mask = TCIF_TEXT; ti.pszText = szText; ti.cchTextMax = 100; VERIFY(pTab->GetItem(iPage, &ti)); strcat(szText, DISABLED_TEXT); VERIFY(pTab->SetItem(iPage, &ti)); }