Сегодня мы представляем вашему вниманию статью нашего автора Алексей1153.
Класс для отображения табличных данных
В этой статье представлен класс CGridEdit1153 (далее - просто компонент), написанный в среде VC++6 с использованием библиотеки MFC , предназначенный для вывода на экран простых табличных данных. Здесь нет таких специальных примочек, как объединение ячеек, различная высота строк, отдельное расцвечивание символов или вставка картинок. Класс специально создавался для проекта, где необходимо выводить на экран МНОГО строк (1...5 миллионов строк - суровая реальность) и затачивался под быстрое добавление новых данных
и перерисовку без мерцания (в том проекте эта таблица - быстро заполняющийся лог сообщений от сотен охранных приборов, пользователь-оператор мониторит таблицу и принимает решения, и, соответственно, моргание утомляло бы глаза, а тормоза - вообще недопустимы). Поддерживается задание шрифта, задание фона для каждой ячейки, задание цвета текста для каждой ячейки, прямое редактирование текста ячейки, etc. Таблица не универсальна, конечно, но все минусы решаемы, потому что код открыт и прокомментирован :) . А кроме
того, эта статья является неким мануалом по вставке в проект и использованию компонента.
Возникает вопрос по поводу странного названия класса. Символы "Grid" говорят сами за себя. Остальные символы ничего не говорят, зато название вряд ли где не повторится :) .
Исходный код компонента представлен в 5 файлах (их можно взять из файлов проекта, который находится по ссылке в конце статьи):
GridEdit1153.h
заголовочный файл класса компонента.
GridEdit1153.cpp
файл реализации класса компонента.
GridEdit1153_notify.h
предоставляет обработчики сообщений для родительского окна (описание ниже по течению).
EnterEditDialog.h
заголовочный файл диалога CEnterEditDialog
EnterEditDialog.cpp
файл реализации диалога CEnterEditDialog
Вспомогательный класс CEnterEditDialog предназначен для для прямого редактирования текста ячеек. Он является классом, производным от класса CDialog. Для него нужен диалог-ресурс, который сделать очень просто при помощи редактора ресурсов:
1) вставляем в ресурсы новый диалог, ID == IDD_ENTER_EDIT_DIALOG.
2) удаляем всё с поверхности диалога.
3) у диалога в свойствах -> окно Border -> устанавливаем None.
4) кладём на диалог элемент CEdit , ID == IDC_edTHEEDIT.
5) у CEdit в свойствах -> убираем галку Border , ставим галку Auto HScroll.
Тестовый проект для этой статьи можно найти по ссылке в конце статьи, но здесь будет подробно описано, как производится вставка компонента и работа с ним.
Итак, создаём тестовый проект GridTest (MFC , Dialog-based). Копируем в папку с проектом 5 файлов, описанных выше. Добавляем файлы также в дерево файлов проекта. Добавляем ресурс для диалога, как это описано выше. После этого рекомендуется удалить из папки проекта файл "имя_проекта.clw" (можно даже не закрывая студию). Затем в студии нажать Ctrl+W для того, чтобы обновилось дерево классов.
Описываемый класс является производным от MFC-класса CStatic. Поэтому, чтобы поместить компонент на диалоговое окно в режиме редактирования ресурсов, кладём сначала на диалог CStatic из стандартной палитры конторолов. Зададим идентификатор IDC_GRID. Поставьте в свойствах статика следующие галочки:
1) Notify (обязательно. Если не поставить галочку, то контрол не будет реагировать на щелчки мышью.)
2) Sunken (это по желанию. Будет модная каёмочка :) )
3) Устанавливаем размер и положение будущего контрола. (Потом, конечно, можно будет поменять программно при помощи CWnd::MoveWindow() )