Одно из моих приложениий требовало, чтобы
пользователь мог изменять видимую область на
лету. Нечто похожее есть в MS-Word в виде выпадающего
окна для создания таблицы. Так вот этот пример
тоже самое :).
Совместимость: Visual C++5, 6, MFC
Это окно имеет следующие возможности :
Требует добавления в Ваш проект всего пары
строк
Выпадает где угодно с заданным начальным
размером
Позволяет пользователю выбрать нужное
количество строк и колонок
Позволяет расширять отображаемые строки и
колонки динамически
Использование данного элемента управления
Добавьте TableWnd.cpp в Ваш проект
Создайте в родительском классе переменную-член
типа CTableWnd
Конструктору требуется 5 аргументов. CTableWnd::CTableWnd(int
maxx,int maxy,int nX,int nY,UINT nID)maxx и maxy
максимальное количество строк и колонок, которые
будут отображаться в окне.nX и nY начальное
количество строк и колонок, которые будут
отображаться в окне.nID - это номер (id)
сообщения, которое будет передаваться
родительскому окну, после того, как пользователь
сделает свой выбор. По умолчанию эти параметры
определены как TW_SETPARAMS.
Чтобы окно "выпало" - достаточно вызвать
создающую функцию-член: m_TableWnd.Create(parentWnd,nPosX,nPosY);
где parentWnd - родительское окно, а nPosX
и nPosY - это X и Y координаты экрана, где будет
отображено выпадающее окно
В DefWindowProc вашего родительского окна,
обработайте сообщение TW_SETPARAMS. Новое количество
строк и колонок посылается как LOWORD и HIWORD
соответственно в параметре wParam.
Вот вроде и всё.
Весь процесс выглядит следующим образом. CTableWnd
создаёт себя и вычисляет свои размеры исходя из
количества строк и колонок заданных для
отображения. Также он создаёт статический
элемент управления, который используется для
отображения текущего количества строк и колонок.
Изначально все квадратики белые. Если двигать
мышкой по окну, то пространство квадратов выше и
левее курсора мышки будет выделяться и
окрашиваться в синий цвет. Если пользователь
будет перемещать курсор мышки удеживая нажатой
левую кнопку, то окно автоматически будет
расширяться до тех пор, пока не превысит значения
maxx и maxy , заданные в конструкторе.
И напоследок, когда окно будет закрыто, то класс
не будет уничтожен. Чтобы не использовать
многократно тот же самый объект. Поэтому для
безопасности лучше использовать статическую или
локальную переменную.