Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Таблица на WinAPI 
:(
    Опции темы
yngwie19
Дата 11.3.2009, 12:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Ребят всем привет. Я умею пользоваться поиском и видел много топиков касающихся данной темы. Однако Я все же так и не понял как сделать полноценную таблицу на WINAPI. Многие рекомендуют использовать List Control, однако это получится кастрированная таблица. И вообще возможно ли ее сделать на WinAPI или придется на MFC писать? Если не трудно приведите пожалуйста примеры готовой таблички. Большое спасибо.
PM MAIL   Вверх
dumb
Дата 11.3.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(yngwie19 @  11.3.2009,  12:59 Найти цитируемый пост)
как сделать полноценную таблицу на WINAPI
что такое "полноценная таблица"? и есть ли действительная необходимость реализовывать это на WinAPI?
PM MAIL   Вверх
yngwie19
Дата 11.3.2009, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



dumb, Полноценная - в моем понимании это та таблица, которая правильно выресовывается (четкие грани с разленеенными полями) и в которую можно добавлять или удалять строки. Т.к Я MFC не изучал, то пока нужно на WINAPI сделать.
PM MAIL   Вверх
Vaulter
Дата 11.3.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: нет
Всего: 22



Цитата(yngwie19 @  11.3.2009,  13:59 Найти цитируемый пост)
И вообще возможно ли ее сделать на WinAPI или придется на MFC писать?

Конечно, возможно. Вопрос времени.

А не подойдет ли уже чтото готовое? MS Excel например?


--------------------
PM MAIL WWW ICQ   Вверх
yngwie19
Дата 11.3.2009, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Vaulter, неее мне хочется самому написать. Ребят подкиньте примерчик.
PM MAIL   Вверх
GP1000
Дата 12.3.2009, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 2.5.2008

Репутация: нет
Всего: нет



набросай на форму диалога много контролов Edito 'в и будет тебе таблица..(или пропиши создание этих окошек руками)
Можно будет и вводить текст и удалять .. А  если нужно будет обрабатывать текст в ячейках ,используешь сообщение WM_GETTEXT 
PM MAIL   Вверх
GremlinProg
Дата 14.3.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



жаль, что ни кто не приложился к этой теме,
а ведь на самом деле, не многие понимают как испечь пирог без рецепта
конечно, смысл не только в выводе таблицы, но и в ее модификации

по многочисленным просьбам, специально для новичков, выкладываю рецепт одного из вариантов самой простой таблицы, в которой есть возможность менять содержимое ячеек:

1. создаем простое окно
2. определяем набор данных:
Код

HWND            hwndEdit        = NULL;
CONST LONG        rows            = 30;
CONST LONG        columns            = 10;
LONG            column_width    = 90;
LONG            row_height        = 22;
LONG            sel_column        = -1;
LONG            sel_row            = -1;
BOOL            captured        = FALSE;
std::wstring    data[rows - 1][columns - 1];

это вся необходимая информация для работы нашей таблицы
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 )
Присоединённый файл  table.rar 75,95 Kb


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 14.3.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



прикрепляю бинарник, чтобы по-быстрому посмотреть что получилось

перезалил, он требовал MSVCP90, теперь не требует, но весит, естественно, больше

ps: проект с дефолтными настройками, в нем я ни чего не менял, так что обращайте внимание на параметр "Incremental linking"

Это сообщение отредактировал(а) GremlinProg - 15.3.2009, 13:12

Присоединённый файл ( Кол-во скачиваний: 119 )
Присоединённый файл  table_bin.rar 41,35 Kb


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Dem_max
Дата 15.3.2009, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



GremlinProg
Не запускается твой бинарник, сделай его со статичекой линковкой. А то хочиться посмотреть что у тебя получилось.

Это сообщение отредактировал(а) Dem_max - 15.3.2009, 07:55


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
yngwie19
Дата 15.3.2009, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



а у меня получилось запустить
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1246 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.