Стоит задача разработать битовый редактор/просмотровщик файлов. Он должен отображать файл как непрерывную последовательность битов. Безо всякой привязки к байтам должна быть поддержка больших файлов. Предусматривается два режима отображения 1) Когда значение бита отображается в виде «1» или «0» 2) Графический когда бит отображается в виде закрашенного или не закрашенного квадрата. Естественно во втором режиме должна быть возможность отображения. Редактирование необходимо в обоих режимах.
Какой контрол посоветуете использовать для реализации такой задачи. Пробовал использовать различные табличные контролы в виртуальном режиме, т.е. когда каждая ячейка в таблице отвечает за отображение своего бита из файла. Но возникает проблема когда отображаешь каждый бит, например, в виде точки размером 1-2 пикселя. То на такой таблице на экране одновременно получается около 1 000 000 ячеек. Стоит чуть чуть подвинуть прокрутку и можно минуту ждать пока экран перерисуется Как сделать отображение достаточно быстрым? Может эта тема уже где то подымалась и есть готовые классы?
P.S. Извините если вопрос не по теме форума, долго думал куда запостить.
Жутко извиняюсь за название вопроса не обратил внимание когда отправлял, а теперь не пойму как изменить сообщение. Просьба к администратору исправить, на что не будь типа "Контрол для создания Bit Edit'a"
Здравствуйте, Diamond16, Вы писали:
>То на такой таблице на экране одновременно получается около 1 000 000 ячеек. Стоит чуть чуть подвинуть прокрутку и можно минуту ждать пока экран перерисуется Как сделать отображение достаточно быстрым?
Никакое кэширование не помогает проблема не в том, что я из файла медленно читаю (на экране отображается обычно менее 100 Кб данных), а в том что медленно отрисовываются ячейки таблицы. Таблицу естественно использую в виртуальном режиме. Но пока для каждой ячейки вызовется обработчик проходит очень много времени, даже если в самом обработчике ничего вообще не делать.
Здравствуйте, Diamond16, Вы писали:
D>Стоит задача разработать битовый редактор/просмотровщик файлов. Он должен отображать файл как непрерывную последовательность битов. Безо всякой привязки к байтам должна быть поддержка больших файлов. Предусматривается два режима отображения 1) Когда значение бита отображается в виде «1» или «0» 2) Графический когда бит отображается в виде закрашенного или не закрашенного квадрата. Естественно во втором режиме должна быть возможность отображения. Редактирование необходимо в обоих режимах.
D>Какой контрол посоветуете использовать для реализации такой задачи. Пробовал использовать различные табличные контролы в виртуальном режиме, т.е. когда каждая ячейка в таблице отвечает за отображение своего бита из файла. Но возникает проблема когда отображаешь каждый бит, например, в виде точки размером 1-2 пикселя. То на такой таблице на экране одновременно получается около 1 000 000 ячеек. Стоит чуть чуть подвинуть прокрутку и можно минуту ждать пока экран перерисуется Как сделать отображение достаточно быстрым? Может эта тема уже где то подымалась и есть готовые классы?
D>P.S. Извините если вопрос не по теме форума, долго думал куда запостить.
Думаю что для изображения 1,000,000 ячеек на экране никакой табличный контрол не подойдет.
Как Вам такая идея — если Вы хотите отобразить каждый бит в отдельный пиксел, то это очень напоминает монохромный битмэп.
Я бы попробовал создать 1-bpp битмэп и использовать данные из Вашего файла в CreateBitmapIndirect().
Здравствуйте, VladFein, Вы писали:
VF>Думаю что для изображения 1,000,000 ячеек на экране никакой табличный контрол не подойдет.
listview в виртуальном режиме справляется и со 100 000 000 ячеек
VF>Как Вам такая идея — если Вы хотите отобразить каждый бит в отдельный пиксел, то это очень напоминает монохромный битмэп. VF>Я бы попробовал создать 1-bpp битмэп и использовать данные из Вашего файла в CreateBitmapIndirect().
ему же необходимо два режима: 1)текстовый 2) графический
причём 1 бит <-> 1 пиксел слишком мелко имхо, ему же надо ещё редактировать.
и прикинь размер такого битмапа
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, VladFein, Вы писали:
VF>>Думаю что для изображения 1,000,000 ячеек на экране никакой табличный контрол не подойдет. K>listview в виртуальном режиме справляется и со 100 000 000 ячеек
Если у Вас есть 100,000,000 ячеек, но видны только 100 — я и сам справлюсь
Вопрос в том сколько из них видны в одном экране, и как эффективно они заполняются.
VF>>Как Вам такая идея — если Вы хотите отобразить каждый бит в отдельный пиксел, то это очень напоминает монохромный битмэп. VF>>Я бы попробовал создать 1-bpp битмэп и использовать данные из Вашего файла в CreateBitmapIndirect(). K>ему же необходимо два режима: 1)текстовый 2) графический K>причём 1 бит <-> 1 пиксел слишком мелко имхо, ему же надо ещё редактировать.
Мелко? Можно StretchBlt()... K>и прикинь размер такого битмапа
Какого "такого" битмэпа? И что? Нет ничего компактнее 1-bpp.
Здравствуйте, korzhik, Вы писали:
K>listview в виртуальном режиме справляется и со 100 000 000 ячеек
Боюсь listview никак мне не подходит ведь даже в виртуальном режиме он может использовать не более 100 000 000 элементов, а этого никак не достаточно. Несложно прикинуть, что если открыть файл размером в 4 GB (на диске с NTFS может быть и больше), то в нем будет 4*1024*1024*1024*8 = 34 359 738 368 элементов и это не предел.
Здравствуйте, VladFein, Вы писали:
VF>Если у Вас есть 100,000,000 ячеек, но видны только 100 — я и сам справлюсь VF>Вопрос в том сколько из них видны в одном экране, и как эффективно они заполняются.
На экране одновременно видно может быть, например 1280*1024 = 1 310 720 ячеек. Может быть, конечно, и куда меньше, но для анализа содержимого файла обычно интересует мелкий масштаб. И если пользователь хоть немного двигает прокрутку, то приходится перерисовывать весь экран
VF>Как Вам такая идея — если Вы хотите отобразить каждый бит в отдельный пиксел, то это очень напоминает монохромный битмэп. VF>Я бы попробовал создать 1-bpp битмэп и использовать данные из Вашего файла в CreateBitmapIndirect().
Я думал над чем то вроде этого (нельзяли поподробнее), но как быть в этом случае с редактированием, отслеживанием текущей ячейки, выделением и т.п. Ведь нужен именно редактор, а не просто просмотровщик.
Здравствуйте, Diamond16, Вы писали:
VF>>Как Вам такая идея — если Вы хотите отобразить каждый бит в отдельный пиксел, то это очень напоминает монохромный битмэп. VF>>Я бы попробовал создать 1-bpp битмэп и использовать данные из Вашего файла в CreateBitmapIndirect().
D>Я думал над чем то вроде этого (нельзяли поподробнее), но как быть в этом случае с редактированием, отслеживанием текущей ячейки, выделением и т.п. Ведь нужен именно редактор, а не просто просмотровщик.
Точно так же, как редаkтируют битмэп. Координаты "редактора" можно показывать в статус-окне, а если у кого-нибудь есть трудности с попаданием в точку — ZOOM!
Здравствуйте, Diamond16, Вы писали:
D>Как сделать отображение достаточно быстрым? Может эта тема уже где то подымалась и есть готовые классы?
Боюсь, что в данном случае вам будет проще и эффективнее наследовать прямо от CWnd (или CView если позволяет архитектура). Тогда вам надо будет определить OnDraw (перерисовка), OnMouseMove (выделение текущего элемента), OnLButtonUp(снятие/установка бита), OnLButtonDown(выделение рамочкой области) и т.п., а потом через SubclassDlgItem аттачить к нужным элементам (но это опять-таки зависит от архитектуры). Здесь ничего сложного и страшного нет, опытный программист сделает черновой работающий набросок за пару дней.
Здравствуйте, Nuald, Вы писали:
N>Боюсь, что в данном случае вам будет проще и эффективнее наследовать прямо от CWnd (или CView если позволяет архитектура). Тогда вам надо будет определить OnDraw (перерисовка), OnMouseMove (выделение текущего элемента), OnLButtonUp(снятие/установка бита), OnLButtonDown(выделение рамочкой области) и т.п., а потом через SubclassDlgItem аттачить к нужным элементам (но это опять-таки зависит от архитектуры). Здесь ничего сложного и страшного нет, опытный программист сделает черновой работающий набросок за пару дней.
Может быть тогда можно за основу взять какой небудь несложный табличный контрол, и перекрыть у него OnDraw. Непосоветуете что небудь подходящее и не навороченное попроще чем MFCGrid и ALXGrid
Здравствуйте, Diamond16, Вы писали:
D>Может быть тогда можно за основу взять какой небудь несложный табличный контрол, и перекрыть у него OnDraw. Непосоветуете что небудь подходящее и не навороченное попроще чем MFCGrid и ALXGrid
Проще не будет, а только сложнее. ИМХО я в данном задаче надобность в таблице вообще не вижу. А вот тормоза она внесет значительные.