![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
yngwie19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Ребят всем привет. Я умею пользоваться поиском и видел много топиков касающихся данной темы. Однако Я все же так и не понял как сделать полноценную таблицу на WINAPI. Многие рекомендуют использовать List Control, однако это получится кастрированная таблица. И вообще возможно ли ее сделать на WinAPI или придется на MFC писать? Если не трудно приведите пожалуйста примеры готовой таблички. Большое спасибо.
|
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 27 Всего: 158 |
||||
|
||||
yngwie19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
dumb, Полноценная - в моем понимании это та таблица, которая правильно выресовывается (четкие грани с разленеенными полями) и в которую можно добавлять или удалять строки. Т.к Я MFC не изучал, то пока нужно на WINAPI сделать.
|
|||
|
||||
Vaulter |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1724 Регистрация: 30.12.2002 Где: бункер Репутация: нет Всего: 22 |
||||
|
||||
yngwie19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Vaulter, неее мне хочется самому написать. Ребят подкиньте примерчик.
|
|||
|
||||
GP1000 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 2.5.2008 Репутация: нет Всего: нет |
набросай на форму диалога много контролов Edito 'в и будет тебе таблица..(или пропиши создание этих окошек руками)
Можно будет и вводить текст и удалять .. А если нужно будет обрабатывать текст в ячейках ,используешь сообщение WM_GETTEXT |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
жаль, что ни кто не приложился к этой теме,
а ведь на самом деле, не многие понимают как испечь пирог без рецепта конечно, смысл не только в выводе таблицы, но и в ее модификации по многочисленным просьбам, специально для новичков, выкладываю рецепт одного из вариантов самой простой таблицы, в которой есть возможность менять содержимое ячеек: 1. создаем простое окно 2. определяем набор данных:
это вся необходимая информация для работы нашей таблицы hwndEdit - дескриптор редактора rows - число строк (не меняется) columns - число столбцов (не меняется) column_width - ширина ячейки row_height - высота ячейки [sel_row:sel_column] - пара значений, в которой хранится фокусированная ячейка captured - флаг захвата мыши (здесь реализована смена фокуса ячейки при удерживании мыши, выглядит забавно, когда к этому подмешивать ввод с клавиатуры) data - собственно информация, которую нужно разместить в таблице тип данных - строки юникод (ну вот, так захотелось) далее, просто по шагам, как я это реализовывал, может быть полезным: 3. рисуем сетку таблицы в обработчике WM_PAINT 4. настраиваем полосы прокрутки в обработчике WM_SIZE 5. добавляем простую прорисовку содержимого ячеек, например абсолютные номера [X:Y] и т.п. 6. рисуем фиксированную строку-столбец левым цветом, чтобы они выделялись среди прочих 7. добиваемся коректной работы "адресации окна", т.е. корректной работы полос прокрутки как при ее непосредственном участии, так и при изменении размеров таблицы, из этого: 7.1. при прокрутке на один юнит, прокручиваем содержимое таблицы на 1 строку/столбец 7.2. используем ScrollWindow только для двух областей: для области, в которой находятся все ячейки(не включая фиксированные строки/столбцы) и для одной из двух фиксированных строки-столбца (при горизонтальной прокрутке - это верхняя строка, при вертикальной - левый столбец) 7.3. при автоматической прокрутке окна, т.е. без уведомлений, обновить все окно (это единственное место где обновляется окно целиком, ибо лень ) ) 8. прикладываем реальные данные к таблице, т.е.задействуем вектор data при рисовании ячеек 9. делаем простой обработчик DragOver - это события WM_LBUTTONDOWN, WM_CAPTURECHANGED, WM_MOUSEMOVE, WM_LBUTTONUP 10. выделяем метод SelectCell, который будет вызываться только при смене текущей ячейки и никогда более 11. добавляем простую индикацию фокусировки: при выводе ячеек, просто утолщаем границу той ячейки, координаты которой совпадают с [sel_row:sel_column] 12. отлаживаем механизм DragOver так, чтобы при выходе мыши за границы текущего окна таблицы, фокусированная ячейка всегда оставалась в области видимости (не уходила в минуса) 13. добавляем функционал в SelectCell: создаем окно редактора (простой EDIT), если он еще не создан и назначаем ему координаты фокусированной ячейки (теперь, совместно с DragOver, редактор будет перемещаться за курсором) 14. поскольку фиксированные строка-столбец находятся в клиентской области, необходимо либо периодически скрывать редактор, если он прокручивается за окно, либо просто сдвигать фокусировку "на солнце", т.е. в видимую часть таблицы (я использовал первый вариант) 15. обработать уведомление EN_CHANGE и просто менять содержимое вектора data из общих дополнений: 1. используется двойная буферизация 2. отрисовка производится только той части таблицы, которая пересекает PAINTSTRUCT::rcPaint, т.е - минимум (кроме случая в пункте 7.3.) матрицу значений data можно подменить с источника данных, в случае ODBC, т.е. вводим метод, к примеру: std::wstring Data(int y,int x), который будет обращаться к таблице на сервере (просто меняем на нее все вхождения data, их там немного) вопросы пишите только в этой ветке, из PM буду гнать, поскольку каждому одно и то же объяснять не хочу прикрепляю сам проект Присоединённый файл ( Кол-во скачиваний: 148 ) ![]() -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
прикрепляю бинарник, чтобы по-быстрому посмотреть что получилось
перезалил, он требовал MSVCP90, теперь не требует, но весит, естественно, больше ps: проект с дефолтными настройками, в нем я ни чего не менял, так что обращайте внимание на параметр "Incremental linking" Это сообщение отредактировал(а) GremlinProg - 15.3.2009, 13:12 Присоединённый файл ( Кол-во скачиваний: 119 ) ![]() -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
GremlinProg,
Не запускается твой бинарник, сделай его со статичекой линковкой. А то хочиться посмотреть что у тебя получилось. Это сообщение отредактировал(а) Dem_max - 15.3.2009, 07:55 -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
yngwie19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
а у меня получилось запустить
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |