Page 23 of 59
Re: HTML Viewer in C--
Posted: Mon Mar 12, 2012 1:30 pm
by Leency
Это характерно и для Эолайта. Потому что код обработки скроллбара таков:
Code: Select all
while (m.lkm) //левая клавиша на ползуке и нажата?
{
если да, то проверяем положение мыши, рисуем чё-то если надо
m.get(); //считываем данные о состоянии мыши и снова на while
}
Загрузка 100% из-за того, что этот код в цикле начинает гоняться как бешенный 100 тысяч миллионов раз в секунду. Друзья, программисты, может кто--то знает более кошерный способ работы с ползунком мыши? Моей фантазии хватило только на эту брутальщину)))
Re: HTML Viewer in C--
Posted: Mon Mar 12, 2012 1:34 pm
by Mario
Надо комбинировать два логических события, если не было сдвига курсора (координаты не менялись), то и рисовать не нужно, если это не полная перерисовка окна по событию перерисовки окна.
Re: HTML Viewer in C--
Posted: Mon Mar 12, 2012 1:42 pm
by Rock_maniak_forever
Я кстати написал кашерный скроллбар, могу разъяснить, только надо в исходник заглянуть и освежить в памяти весь процесс.
Re: HTML Viewer in C--
Posted: Mon Mar 12, 2012 4:20 pm
by Rock_maniak_forever
Вот, как смог написал. Надеюсь поймёшь. Если что непонятно, обращайся.
Code: Select all
=======================================================================================================
=== Алгоритм парсинга мыши для перемещения ползунка по оси у. =========================================
=======================================================================================================
а. Выделяем буфер размером в байт, для флага основной (начальной) координаты мыши по оси у.
б. Выделяем буфер размером в дворд, для значения основной (начальной) координаты мыши по оси у.
=======================================================================================================
01. Надо получить координаты мыши в окне.
02. Проверить где находится мышь.
03. Если на ползунке, то проверить нажата ли левая кнопка мыши.
04. Если нажата, то получаем текущую координату мыши по оси у. Если нет, то очещаем флаг основной (начальной) координаты мыши по оси у и выходим.
05. Проверяем флаг основной (начальной) координаты мыши по оси у.
06. Флаг сброшен, то записываем в буфер координату по оси у (буфер б), устанавливаем флаг (буфер а)
07. Выходим из парсера.
--------------------------------------------------------------------------------------------------------
08. Флаг установлен, то тогда сравниваем текущую координату мыши по оси у, с основной (начальной), которая должна быть в буфере (буфер б).
09. Если текущая координата ниже, чем основная (начальная), то вычисляем разницу между ними. Разница = основная (начальная) корд. по оси у - текущая корд. по оси у.
10. Эту разницу вычитаем из текущей координаты ползунка по оси у в буфере с координатами ползунка по оси у.
11. Восстанавливаем основную (начальную) коорд. по оси у в буфере.
12. Перерисовываем ползунок с новыми координатами.
13. Выходим из парсера.
--------------------------------------------------------------------------------------------------------
14. Если текущая координата выше, чем основная (начальная), то вычисляем разницу между ними. Разница = текущая корд. по оси у. - основная (начальная) коорд. по оси у
15. Эту разницу прибавляем к текущей координаты ползунка по оси у в буфере с координатами ползунка по оси у.
16. Восстанавливаем основную (начальную) корд. по оси у в буфере.
17. Перерисовываем ползунок с новыми координатами.
18. Выходим из парсера.
--------------------------------------------------------------------------------------------------------
P.S. Прикрепил кексик скроллбара, поиграться. Сделан по этому алгоритму.
Re: HTML Viewer in C--
Posted: Mon Mar 12, 2012 4:41 pm
by Leency
Спасибо! Попробую.
Re: HTML Viewer in C--
Posted: Mon Mar 12, 2012 7:31 pm
by SoUrcerer
А boxlib нельзя?
Re: HTML Viewer in C--
Posted: Mon Mar 12, 2012 9:05 pm
by Leency
Можно, но я не умею.
Re: HTML Viewer in C--
Posted: Thu Apr 12, 2012 8:37 pm
by SoUrcerer
HTMLv замечательно открывает книги в формате fb2, только неправильно определяет кодировку. Будет здорово, если кнопки для смены кодировок будут легкодоступны. В fb2 кодировка определяется тегом:
или подобным.
Re: HTML Viewer in C--
Posted: Fri Apr 13, 2012 12:32 am
by Leency
Я добавил этот тег в обработку, однако, если
идёт в самом начале страницы обработчик обламывается почему-то. Он не читает первые несколько символов и почему так для меня загадка. Есть подозрение, что в
http://websvn.kolibrios.org/filedetails ... 5&peg=2605 в строке
Code: Select all
for (; buf + fsize > bword; bword++;) {
в первом "параметре" не должно быть пусто.
Перекодировка юзера будет, когда будет меню ПКМ. А оно будет однажды. Кнопки "Вперёд" ведь заработали спустя 2 года, и это будет. Обязательно

Re: HTML Viewer in C--
Posted: Fri Apr 13, 2012 9:00 am
by Unduing
Leency если не ошибаюсь ты же сам писал HTML Viewer.
В
Code: Select all
for (; buf + fsize > bword; bword++;) {
Первый параметр уже инициализирован в
, вызов происходит так
, т.е
это аналогично если бы ты написал
Code: Select all
for (bword = buf; buf + fsize > bword; bword++;) {
А ты учитываешь возможность присутствия bom маркера ?
Re: HTML Viewer in C--
Posted: Fri Apr 13, 2012 9:36 am
by popovpa
Всё равно не правильно, у меня в начале вот такая строка:
<?xml version="1.0" encoding="utf-8"?>
Всё равно кракозябры...
Да! Ещё ни в одном дистрибутиве не было такого, чтобы браузер как читалку использовать..предлагаю..расширить функциональность браузера...
Тогда получается что одна из моих самых хотелок почти осуществилась!
Re: HTML Viewer in C--
Posted: Fri Apr 13, 2012 3:09 pm
by lev
Я себе приспособил HTMLv под fb2 читалку добавив шорткат на UTF кодировку, по аналогии с уже существующим Ctrl+K для KOI.
Code: Select all
...
case 021: //Ctrl+U
ReadHtml();
utf8rutodos(buf);
break;
Ещё пришлось подредактировать utf8rutodos, для нескольких встретившихся мне символов.
С encoding разобраться с наскоку не удалось + в стандарте fb2 немного по другому работает тег <title> - он показывает промежуточные заголовки, а не заголовок всего документа.
---
пример - в моей папочке на ftp
Re: HTML Viewer in C--
Posted: Fri Apr 13, 2012 5:21 pm
by Leency
Оромный респект. Какие символы добавил? Код функции преобразования utf интересен. Алсо скоро ждите в новом билже.
Re: HTML Viewer in C--
Posted: Fri Apr 13, 2012 5:56 pm
by lev
Что книжку мешало читать, то и добавлял - многоточие, тире, и по мелочи экспериментировал.
Spoiler:
Code: Select all
inline fastcall int utf8rutodos(dword ESI) //-
{
EDI=ESI;
while (BL=ESBYTE[ESI])
{
IF (BL == 0xD0) || (BL == 0xD1) EDI--;
else IF (BL == 0x81) && (ESBYTE[ESI-1]==0xD0) ESBYTE[EDI] = 0xF0; //ш
else IF (BL == 0x91) && (ESBYTE[ESI-1]==0xD1) ESBYTE[EDI] = 0xF1; //м
//0xE2 0x80 - сгруппировать
else IF (BL == 0xE2) && (ESBYTE[ESI+1]==0x80)
SWITCH (ESBYTE[ESI+2])
{
case 0x93: //long defis
CASE 0x94:
{
ESBYTE[EDI] = '-';
ESI+=2;
BREAK;
}
CASE 0xA2: //central point
{
ESBYTE[EDI] = '*';
ESI+=2;
BREAK;
}
CASE 0xA6: //многоточие
{
ESBYTE[EDI] = ESBYTE[EDI+1] = ESBYTE[EDI+2] = '.';
EDI+=2;
ESI+=2;
break;
}
}
//0xC2 сгруппировать
else IF (BL == 0xC2) //таблицу перекодировок?
SWITCH(ESBYTE[ESI+1]) {
case 0xAB: //"
CASE 0xBB: //"
{
ESBYTE[EDI] = '\"';
ESI++;
BREAK;
}
CASE 0xB7: // _
{
ESBYTE[EDI] = '_';
ESI++;
BREAK;
}
CASE 0xA0: // Alt+160 - неразбивающий пробел
{
ESBYTE[EDI] = ' ';
ESI++;
BREAK;
}
CASE 0xB0: // градус
{
ESBYTE[EDI] = '\29';
ESI++;
BREAK;
}
CASE 0xA9: // (c)
{
ESWORD[EDI] = 'c(';
// ESBYTE[EDI] = '(';
// ESBYTE[EDI+1] = 'c';
ESBYTE[EDI+2] = ')';
EDI+=2;
ESI++;
BREAK;
}
CASE 0xAE: // (r)
{
ESWORD[EDI] = 'r(';
ESBYTE[EDI+2] = ')';
EDI+=2;
ESI++;
break;
}
}
ELSE IF (BL >= 0x90) && (BL <= 0xAF)
{
BL -= 0x10;
ESBYTE[EDI] = BL;
}
ELSE IF (BL >= 0x80) && (BL <= 0x8F)
{
BL += 0x60;
ESBYTE[EDI] = BL;
}
ELSE IF (BL >= 0xB0) && (BL <= 0xBF)
{
BL -= 0x10;
ESBYTE[EDI] = BL;
}
ELSE ESBYTE[EDI] = BL;
ESI++;
EDI++;
}
WHILE (EDI<ESI)
{
ESBYTE[EDI] = ' ';
EDI++;
}
}
Re: HTML Viewer in C--
Posted: Fri Apr 13, 2012 7:45 pm
by popovpa
Может действительно расширить функционал? Не только браузер, но и читалка, для фб2? fb2 лучше парсить asmxml (
viewtopic.php?f=24&t=1701 ) и пользоваться уже результатами обработки этой библиотеки. Тогда и проблем не будет.