Будет мелькание, но даже в Кьему без акселератора kaqemu его будет очень сложно заметить.
А рисовать в буфер, а потом выводить сложно, учитывая что тогда большую часть проги придётся переписать с нуля. Если я не ошибаюсь, только KFAR сейчас такое умеет.
Table
-
Из хаоса в космос
И тут оффтопом занялись :-).
Собственно - один раз написал и используй этот код пока не надоест.
..bw
Собственно - один раз написал и используй этот код пока не надоест.
..bw
Может помочь ещё и следующее (http://kolibrios.org/?p=Documentation&s ... ons&sfp=00):
- edx = 0xXYRRGGBB, где:
- X = DCBA (биты)
- C = 1 - не закрашивать рабочую область при отрисовке окна
- X = DCBA (биты)
in code we trust
Leency, вот исходники текущей версии.
- Attachments
-
-
excel-src.7z (44.07 KiB)Downloaded 400 times
-
Следующий вариант: добавлена прокрутка колесиком, сохранение текста при выделении другой ячейки (не нужно больше нажимать Enter, а чтобы отменить ввод, нажмите Escape).
Сделал, помогло.mike.dld wrote:если программа рисует *всё* в окне сама - ОС нет смысла заливать фон при вызове 0-й функции (из-за чего и наблюдается фликеринг)
Этот прием годится не для всех приложений, так как приходится переписывать процедуры рисования всех примитивов (в том числе вывода текста).bw wrote:еще лучше использовать "буфер" и отрисовывать в него, когда изображение будет полностью построено вывести его на экран.
Leency wrote:Кстати, оказывается что горизонтальные стрелки - это 0x1A / 0x1B
Исправил.Leency wrote:Там, где на рисунке обведено - неплохо бы сделать по-центру.
- Attachments
-
-
table-0.89.7z (44.55 KiB)
- программа+исходники
Downloaded 398 times
-
> Этот прием годится не для всех приложений, так как приходится переписывать процедуры рисования всех примитивов (в том числе вывода текста).
Для всех. Просто не нужно, каждый раз, выделять буфер вновь и перерисовавать его полностью. Пусть он остается и ты просто дописываешь в него изменения, а после выводишь буфер на экран. При этом нет необходимости выводить весь буфер на экран, можешь вывести тольку ту часть, в которой произошли изменения. Да, это усложняет задачу и можно, в большинстве случаев, обойтись без такой особенности.
..bw
Для всех. Просто не нужно, каждый раз, выделять буфер вновь и перерисовавать его полностью. Пусть он остается и ты просто дописываешь в него изменения, а после выводишь буфер на экран. При этом нет необходимости выводить весь буфер на экран, можешь вывести тольку ту часть, в которой произошли изменения. Да, это усложняет задачу и можно, в большинстве случаев, обойтись без такой особенности.
..bw
1. Уменьшил перерисовку окна при перемотке колёсиком, одновременно успростил код.
2. Таки поставил стрелки на место)
3. При правке текста в ячейке, сделал так что текст не подпрыгивает вверх. Обнаружил баг: из-за того что размер ячеек можно менять, строка 135
kos_WriteTextToWindow(editbox_x, editbox_y+3,0x80,0,edit_text,0);
должна выглядеть так:
kos_WriteTextToWindow(editbox_x, editbox_h/2-3+editbox_y,0x80,0,edit_text,0);
4. Строка if (redraw) draw_window();
осталась для меня загадкой. Зачем переменная если можно просто вместо redraw=1 вставить draw_window().
Это сделано для того чтобы окно не перерисовывалось 2 раза?
Кстати, везде используется draw_window(); - это не труъ. Дожно быть dwaw_grid(); или что-то в этом роде - перерисовка только ячеек и полос прокрутки без перерисовки всего окна - так будет намного быстрее. Далее, надо сделать вывод сетки полосами.
ИМХО надо дофиксить баги и заняться этим...
2. Таки поставил стрелки на место)
3. При правке текста в ячейке, сделал так что текст не подпрыгивает вверх. Обнаружил баг: из-за того что размер ячеек можно менять, строка 135
kos_WriteTextToWindow(editbox_x, editbox_y+3,0x80,0,edit_text,0);
должна выглядеть так:
kos_WriteTextToWindow(editbox_x, editbox_h/2-3+editbox_y,0x80,0,edit_text,0);
4. Строка if (redraw) draw_window();
осталась для меня загадкой. Зачем переменная если можно просто вместо redraw=1 вставить draw_window().
Это сделано для того чтобы окно не перерисовывалось 2 раза?
Кстати, везде используется draw_window(); - это не труъ. Дожно быть dwaw_grid(); или что-то в этом роде - перерисовка только ячеек и полос прокрутки без перерисовки всего окна - так будет намного быстрее. Далее, надо сделать вывод сетки полосами.
ИМХО надо дофиксить баги и заняться этим...
- Attachments
-
-
table-0.89b.zip (69.51 KiB)Downloaded 397 times
-
Из хаоса в космос
Leency, спасибо за помощь в разработке.
Эта строка больше не нужна, а раньше, действительно, служила для однократной перерисовки.Leency wrote:4. Строка if (redraw) draw_window();осталась для меня загадкой. Зачем переменная если можно просто вместо redraw=1 вставить draw_window().Это сделано для того чтобы окно не перерисовывалось 2 раза?
прямоугольник под панелью сохранения\загрузки файлов нужно расширить на 1 пиксел вправо и вниз
dword wi = WND_W, he = WND_H;
надо заменить на
int wi = WND_W, he = WND_H;
т.к. из-за строчки
he -= kos_GetSkinHeight() + MENU_PANEL_HEIGHT;
прога на маленьких размерах окна вылетает.
После
kos_DefineAndDrawWindow(10,40,WND_W,WND_H,0x33,0x40FFFFFF,0,0,(Dword)"Table v0.89b");
надо вставить код
if (he + MENU_PANEL_HEIGHT<= 8)
{
kos_WindowRedrawStatus(2);
return;
}
или что-то типа этого, похожий код ДО рисования окна убрать, он тоже приводит к вылетанию на маленьких размерах.
надо заменить на
int wi = WND_W, he = WND_H;
т.к. из-за строчки
he -= kos_GetSkinHeight() + MENU_PANEL_HEIGHT;
прога на маленьких размерах окна вылетает.
После
kos_DefineAndDrawWindow(10,40,WND_W,WND_H,0x33,0x40FFFFFF,0,0,(Dword)"Table v0.89b");
надо вставить код
if (he + MENU_PANEL_HEIGHT<= 8)
{
kos_WindowRedrawStatus(2);
return;
}
или что-то типа этого, похожий код ДО рисования окна убрать, он тоже приводит к вылетанию на маленьких размерах.
Из хаоса в космос
Heavyiron, Leency
Исправлено![Smile :)](./images/smilies/icon_smile.gif)
Исправлено
![Smile :)](./images/smilies/icon_smile.gif)
- Attachments
-
-
table-0.89c.7z (45.5 KiB)Downloaded 387 times
-
Реализовано чтение CSV-файлов, в связи с чем номер версии увеличен до 0.9. Также кое-что исправлено.
Для сохранения файла в CSV-формате нужно указать расширение csv, и, соответственно, при загрузке файла с этим расширением он воспринимается как CSV-файл.
Для сохранения файла в CSV-формате нужно указать расширение csv, и, соответственно, при загрузке файла с этим расширением он воспринимается как CSV-файл.
- Attachments
-
-
table-0.9.7z (44.91 KiB)Downloaded 405 times
-
при пересчёте формулы результат печатается без заливки фона, поэтому получается наложение шрифта...
*****:
;дух машины, мой бубен сильнее твоей тупости
*****:
;дух машины, мой бубен сильнее твоей тупости
*****:
Исправил этот и еще пару багов.
+еще 1 баг
+еще 1 баг
- Attachments
-
-
table-0.92.7z (45.68 KiB)Downloaded 395 times
-
Оказалось, в предыдущей версии не работают полосы прокрутки, поправил.
- Attachments
-
-
table-0.91c.7z (45.76 KiB)Downloaded 387 times
-
Who is online
Users browsing this forum: No registered users and 10 guests