Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #38




Здравствуйте, дорогие читатели!

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



Наборы вкладок (Tab Controls)

   Доброе время суток.
   Данная статья будет полезна (надеюсь :) ) людям , пишущим в среде VC++6 с использованием библиотеки MFC.

   Тема статьи - наборы вкладок. Создание, вставка в проект, приёмы работы с ними. Вкладки очень удобны в том случае, когда большое количество разнородных свойств чего либо надо разместить в виде смысловых групп (за примером ходить далеко не нужно -  в студии нажмите Alt+F7). Да и много ещё можно применений придумать наверное.
   Основная идея работы набора вкладок такова : имеется объект TAB, который выглядит как пустое диалоговое окно , у которого сверху есть набор вкладок-корешков с надписями. По сути , это просто набор переключателей. С каждым переключателем связан некий объект (назовём SHEET), производный в общем случае от CWnd , который должен быть показан на окне TAB, когда переключатель выбран. Таким образом, в каждый момент времени виден только один объект SHEET из набора.

   Здесь будет описана работа с классом MFC - CTabCtrl.
   В тестовом проекте будет использована следующая схема:

CTabsTestDlg  (главное окно проекта)
   
CTabCtrl
      
страница 1 страница 2 страница 3 страница 4
CMyTabDialog CMyTabDialog CMyTabDialog CMyTabDialog
   

   CTabsTestDlg - это окно, на котором лежит контрол набора вкладок CTabCtrl. Этот контрол - это родительское окно для всех страниц. Все страницы произведены от класса CMyTabDialog:CDialog, о котором ниже.

   Готовый тестовый проект можно взять из по ссылке в конце статьи, но здесь всё равно описаны шаги создания набора вкладок.
   Итак, создаём тестовый проект ( MFC, Dialod-based ) с названием TabsTest. Открываем в редакторе ресурсов главное диалоговое окно IDD_TABSTEST_DIALOG. Берём из стандартной палитры элементов управления контрол с названием Tab Control и кладём на диалог.  Дадим контролу идентификатор IDC_TAB. Теперь добавим связанный с контролов член-переменную (можно было, конечно, и не делать этого, но так немного удобнее :) ; в общем - добавляем)  , нажимая Ctrl+двойной_щелчок_по_контролу. Имя переменной, недолго думая, делаем, приписывая "m_" к идентификатору  - m_IDC_TAB. В окошке Category уже указано control , ниже выбираем класс CTabCtrl.
   Теперь посмотрим, как вставить вкладки. Сначала немного теории.

   Каждая вкладка описана в ресурсе как обычный диалог. Только надо во вкладке Styles свойств ресурса диалога убрать галочку TitleBar, в списке Style выбрать Child, в списке Border выбрать Thin. Ещё нужно сделать диалог невидимым. Также можно удалить вставленные по умолчанию кнопки Ok и Cancel.

   Удобно произвести все страницы от своего класса (производного от CDialog), назовём его CMyTabDialog. Удобно это тем, что общий для всех страниц код (например реакция на нажатие Enter или Escape) расположен в одном классе. Кроме того, поскольку страницы будут создаваться динамически, в базовом классе  страницы будут сами возвращать в кучу память, отведённую под них:
void CMyTabDialog::PostNcDestroy() 
{
CDialog::PostNcDestroy();
delete this;
}
   Однако этим мы себя обязали создавать объекты страниц ТОЛЬКО динамически, при помощи оператора new. Причём удалять объекты страниц нужно будет не delete, а вызовом виртуальной функции DestroyWindow().


   Пример добавления страницы в проект:
   Добавляем в проект страницу page1 :
   1) Вставляем новый диалог (дерево ресурсов, Insert Dialog) с идентификатором IDD_page1.
   2) Выставляем нужные свойства, убираем кнопки
   3) Создаём класс страницы - жмём Ctrl+W , даём название классу CPage1, выбираем базовый класс CDialog.
   4) Теперь надо заменить базовый класс на CMyTabDialog.
В дереве классов щёлкаем по классу нашей страницы CPage1, открывается заголовочный файл Page1.h. В строке
class CPage1 : public CDialog
меняем название базового класса с CDialog на CMyTabDialog.
   5)Открываем файл реализации Page1.cpp. Перед строкой
#include "Page1.h"
вставляем строку
#include "MyTabDialog.h"
, а также меняем в строке
CPage1::CPage1(CWnd* pParent /*=NULL*/)
: CDialog(CPage1::IDD, pParent)
название базового класса с CDialog на CMyTabDialog.

Автор: Алексей1153


Прочитать статью целиком, а также обсудить ее можно на нашем форуме по ссылке: http://club.shelek.com/viewart.php?id=287


Ждем вас также в разделе форума "Идеи для статей".
Здесь собраны вопросы, ответы на которые не сформулировать в двух словах. Попробуйте свои силы.

Подробнее по ссылке: http://forum.shelek.com/index.php/board,105.0.html

И не забудьте посетить наш "домик" на карте в Интернете по ссылке
http://www.internetmap.info/cgi-bin/go.cgi?site_id=4131%22%20


А теперь прощаемся с Вами до следующего выпуска.

                                        С уважением, команда Клуба.




В избранное