С чего начать
От: Аноним  
Дата: 10.09.08 21:14
Оценка:
Извините за глупый вопрос, с вашей библиотекой познакомился недавно.
Прочитал туториалы от Харьковского Зверька, вроде бы кое-что получается (в рамках этих туториалов). А что дальше? Хотелось бы познакомиться с библиотекой получше, но.. нет документации. Хотя судя по сообщениям на форуме, народ разобрался с ней не плохо. Даже пишут дополнения (кажется, behaviors называется). Может все-таки можно где-то почитать про это подробнее? Или хотя бы ссылки на форумы, где осуждаються наиболее жизненные вопросы. С трудом верится, что со всеми возможностями разбираются по комментариям из исходных текстов и файлам из HTMLayoutSDK\html_samples. Автор вносит каждый раз изменения, а на примерах это не отражается. На http://terrainformatica.com нашел только несколько справочных страниц, и раздел для начинающих, который повторяет здешние туториалы

Еще раз прошу прощения за ламеризм и наглость . Трудно отказаться от подобной бесплатной библиотеки
Re: С чего начать
От: adontz Грузия http://adontz.wordpress.com/
Дата: 10.09.08 21:46
Оценка:
Здравствуйте, Аноним, Вы писали:

1. Надо понимать что основа библиотеки — HTML и CSS и за документацией надо ходить на w3c.org. Впрочем, лично мне хватает моих навыков вёрстки HTML. На сайте есть список специфических для библиотеки тегов и аттрибутов. Ничего особенного, логическое продолжение уже существующих стандартов в контексте библиотеки для UI.

2. Behavior это как оконная процедура, но для отдельного элемента HTML. Ну и, в отличие от оконной процедуры, все необработанные сообщения передаются вверх по иерархии. Про разработку behavior надо в контексте языка. С Си++ помогут многие, говорят ShaggyOwl большой гуру С C# — я помогу, с Руби — Зверёк.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: С чего начать
От: Lightlace Украина  
Дата: 10.09.08 23:15
Оценка:
Здравствуйте, adontz, Вы писали:

A>1. Надо понимать что основа библиотеки — HTML и CSS и за документацией надо ходить на w3c.org. Впрочем, лично мне хватает моих навыков вёрстки HTML. На сайте есть список специфических для библиотеки тегов и аттрибутов. Ничего особенного, логическое продолжение уже существующих стандартов в контексте библиотеки для UI.


A>2. Behavior это как оконная процедура, но для отдельного элемента HTML. Ну и, в отличие от оконной процедуры, все необработанные сообщения передаются вверх по иерархии. Про разработку behavior надо в контексте языка. С Си++ помогут многие, говорят ShaggyOwl большой гуру С C# — я помогу, с Руби — Зверёк.


Большое спасибо за ответ, не ожидал что будет так быстро
Да, язык С++. Не хотелось бы утомлять вас расспросами.. Просто хотел спросить, в какую сторону копать и какие исходники читать. Собственно интересует принцип этих behaviors. Насколько я понял, с их помощью можно доделать все что хочется и чего нет в библиотеке — если это оконная процедура, там можно обрабатывать WM-сообщения (или только HTMLayout notifications?) и прорисовывать эти нестандартные для библиотеки DOM-элементы с помощью GDI/Opengl?

А как писались все эти дополнения из HTMLayoutSDK\include\behaviors? В комментариях большинство создателей — сторонние разработчики. Значит где-то было подобие help'а? Или консультации автора? Хотя на форуме веток на эту тему не нашел
Re[3]: С чего начать
От: c-smile Канада http://terrainformatica.com
Дата: 10.09.08 23:32
Оценка:
Здравствуйте, Lightlace, Вы писали:

behavior это фактически микро-окно со своей element_proc (аналог WinProc в Windows)
behaviors назначается DOM эдементу в CSS — #myelement { behavior: name-of-my-behavior; }

Вот её имплементация в htmlayout_behaviors.hpp

// ElementWventProc implementeation
    static BOOL CALLBACK  element_proc(LPVOID tag, HELEMENT he, UINT evtg, LPVOID prms )
    {
      event_handler* pThis = static_cast<event_handler*>(tag);
      if( pThis ) switch( evtg )
        {
          case HANDLE_INITIALIZATION:
            {
              INITIALIZATION_PARAMS *p = (INITIALIZATION_PARAMS *)prms;
              if(p->cmd == BEHAVIOR_DETACH)
                pThis->detached(he);
              else if(p->cmd == BEHAVIOR_ATTACH)
                pThis->attached(he);
              return TRUE;
            }
          case HANDLE_MOUSE: {  MOUSE_PARAMS *p = (MOUSE_PARAMS *)prms; return pThis->handle_mouse( he, *p );  }
          case HANDLE_KEY:   {  KEY_PARAMS *p = (KEY_PARAMS *)prms; return pThis->handle_key( he, *p ); }
          case HANDLE_FOCUS: {  FOCUS_PARAMS *p = (FOCUS_PARAMS *)prms; return pThis->handle_focus( he, *p ); }
          case HANDLE_DRAW:  {  DRAW_PARAMS *p = (DRAW_PARAMS *)prms; return pThis->handle_draw(he, *p ); }
          case HANDLE_TIMER: {  TIMER_PARAMS *p = (TIMER_PARAMS *)prms; return pThis->handle_timer(he, *p); }
          case HANDLE_BEHAVIOR_EVENT:   { BEHAVIOR_EVENT_PARAMS *p = (BEHAVIOR_EVENT_PARAMS *)prms; return pThis->handle_event(he, *p ); }
          case HANDLE_METHOD_CALL:      
            { 
              METHOD_PARAMS *p = (METHOD_PARAMS *)prms; 
              if(p->methodID == XCALL)
              {
                XCALL_PARAMS *xp = (XCALL_PARAMS *)p;
                return pThis->handle_script_call(he,*xp);
              }
              else
                return pThis->handle_method_call(he, *p ); 
            }
          case HANDLE_DATA_ARRIVED:     { DATA_ARRIVED_PARAMS *p = (DATA_ARRIVED_PARAMS *)prms; return pThis->handle_data_arrived(he, *p ); }
          case HANDLE_SIZE:  {  pThis->handle_size(he); return FALSE; }
          case HANDLE_SCROLL:           { SCROLL_PARAMS *p = (SCROLL_PARAMS *)prms; return pThis->handle_scroll(he, *p ); }

          default:
            assert(false);
        }
      return FALSE;
    }


Собсвенно это основа. Т.е. твой behavior это набор методов handle_mouse(), handle_draw() и пр.
Очень близко по своей идее к WinProc и WM_LBUTTONDOWN, WM_PAINT и пр.
Re[4]: С чего начать
От: Lightlace Украина  
Дата: 13.09.08 22:31
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Собсвенно это основа. Т.е. твой behavior это набор методов handle_mouse(), handle_draw() и пр.

CS>Очень близко по своей идее к WinProc и WM_LBUTTONDOWN, WM_PAINT и пр.

Создал файл cpp в дополнение к основному проекту, написал в нем следующее (по примеру других behaviors, найденных в каталоге include/behaviors)
#include <windows.h>
#include <htmlayout.h>

using namespace htmlayout;

struct myev_handler: public behavior {
    myev_handler():behavior(HANDLE_ALL, "mybeh") {};
    virtual BOOL handle_event(HELEMENT el, HELEMENT target,  BEHAVIOR_EVENTS type, UINT_PTR reason) {
        ::MessageBox(0, "Hi from mybeh :)", 0, 0);
        return TRUE;
    }
};

myev_handler hndlss;


Дальше в html документе объявил
<div style="behavior: mybeh clickable">This is my div</div>


Никакой реакции . Ни на движение мыш, ни на нажатия

Такое чувство, что кроме простого инстанцирования объекта, нужно еще что-то... А для остальных h-файлов с behaviors (тех что идут в SDK) тоже недостаточно простого #include?
Re[5]: С чего начать
От: Lightlace Украина  
Дата: 13.09.08 22:35
Оценка:
И, если можно, хотелось бы узнать,

А как писались все эти дополнения из HTMLayoutSDK\include\behaviors? В комментариях большинство создателей — сторонние разработчики. Значит где-то было подобие help'а? Или консультации автора? Хотя на форуме веток на эту тему не нашел


Спасибо
Re[5]: С чего начать
От: ShaggyOwl Россия http://www.rsdn.org
Дата: 13.09.08 23:01
Оценка:
Здравствуйте, Lightlace, Вы писали:

L>Дальше в html документе объявил

L>
L><div style="behavior: mybeh clickable">This is my div</div>
L>

Что такое clickable? Если хочешь чтобы behavior реагировал на нажатия мыши, передавай в конструкторе HANDLE_MOUSE (или, как в твоем примере HANDLE_ALL)

L>Никакой реакции . Ни на движение мыш, ни на нажатия

См. метод handle_mouse
    virtual BOOL handle_mouse  (HELEMENT he, MOUSE_PARAMS& params ) 
      { 
        return on_mouse( he, params.target, params.cmd, params.pos, params.button_state, params.alt_state ); 
      }

handle_event используется для других вещей:
HTMLayoutSDK/include/htmlayout_dialog.hpp
// notification events from builtin behaviors — synthesized events: BUTTON_CLICK, VALUE_CHANGED
// see enum BEHAVIOR_EVENTS
Хорошо там, где мы есть! :)
Re[6]: С чего начать
От: Lightlace Украина  
Дата: 13.09.08 23:18
Оценка:
Здравствуйте, ShaggyOwl, Вы писали:

SO>Здравствуйте, Lightlace, Вы писали:


L>>Дальше в html документе объявил

L>>
L>><div style="behavior: mybeh clickable">This is my div</div>
L>>

SO>Что такое clickable? Если хочешь чтобы behavior реагировал на нажатия мыши, передавай в конструкторе HANDLE_MOUSE (или, как в твоем примере HANDLE_ALL)

L>>Никакой реакции . Ни на движение мыш, ни на нажатия

SO>См. метод handle_mouse
SO>
SO>    virtual BOOL handle_mouse  (HELEMENT he, MOUSE_PARAMS& params ) 
SO>      { 
SO>        return on_mouse( he, params.target, params.cmd, params.pos, params.button_state, params.alt_state ); 
SO>      }
SO>

SO>handle_event используется для других вещей:
SO>HTMLayoutSDK/include/htmlayout_dialog.hpp
SO>// notification events from builtin behaviors — synthesized events: BUTTON_CLICK, VALUE_CHANGED
SO>// see enum BEHAVIOR_EVENTS

Спасибо! Но вопрос немного в другом — только что прочитал, что нужно регистрировать behavior в обработчике нотификации HLN_ATTACH_BEHAVIOR. Только как это сделать не могу сообразить. Можете ткуть в пример из SDK?

Пробовал
class CMyWtlWindow: 
    public CWindowImpl<CMyWtlWindow, CHTMLayoutCtrl>,
    public CHTMLayoutHost<CMyWtlWindow> {}

И в обработчике OnCreate формы вызвал SetCallback()
(нашел на форуме ветку на эту тему), но даже с подключенным atlhtmlayout.h пишет что класс CHTMLayoutHost не найден . Может со времени того поста что-то в реализации поменялось?

И что означает вызов метода LoadHtmlResource("EMPTY")?

P.S. Извиняюсь за глупые вопросы, никак не могу стартовать самостоятельно
Re[6]: С чего начать
От: c-smile Канада http://terrainformatica.com
Дата: 13.09.08 23:38
Оценка: 6 (1)
Здравствуйте, ShaggyOwl, Вы писали:

SO>Здравствуйте, Lightlace, Вы писали:


L>>Дальше в html документе объявил

L>>
L>><div style="behavior: mybeh clickable">This is my div</div>
L>>

SO>Что такое clickable? Если хочешь чтобы behavior реагировал на нажатия мыши, передавай в конструкторе HANDLE_MOUSE (или, как в твоем примере HANDLE_ALL)

clickable описан здесь

L>>Никакой реакции . Ни на движение мыш, ни на нажатия




SO>См. метод handle_mouse

SO>
SO>    virtual BOOL handle_mouse  (HELEMENT he, MOUSE_PARAMS& params ) 
SO>      { 
SO>        return on_mouse( he, params.target, params.cmd, params.pos, params.button_state, params.alt_state ); 
SO>      }
SO>

SO>handle_event используется для других вещей:

Насколько я понял есть желание обрабатывать BUTTON_CLICK на самом элементе поэтому вполне себе нормальный вариант с clickable.
Re[7]: С чего начать
От: c-smile Канада http://terrainformatica.com
Дата: 13.09.08 23:49
Оценка:
Здравствуйте, Lightlace, Вы писали:

L>Здравствуйте, ShaggyOwl, Вы писали:


L>Спасибо! Но вопрос немного в другом — только что прочитал, что нужно регистрировать behavior в обработчике нотификации HLN_ATTACH_BEHAVIOR. Только как это сделать не могу сообразить. Можете ткуть в пример из SDK?


htmlayoutsdk/win32 — это pure win32 sample.

А именно файл win32.cpp там.

Обратить внимание на:

HTMLayoutSetCallback(hWnd,&HTMLayoutNotifyHandler,0);
и смотри саму функцию HTMLayoutNotifyHandler() и в ней вызов OnAttachBehavior()


L>Пробовал

L>
L>class CMyWtlWindow: 
L>    public CWindowImpl<CMyWtlWindow, CHTMLayoutCtrl>,
L>    public CHTMLayoutHost<CMyWtlWindow> {}
L>

L>И в обработчике OnCreate формы вызвал SetCallback()
L>(нашел на форуме ветку на эту тему), но даже с подключенным atlhtmlayout.h пишет что класс CHTMLayoutHost не найден . Может со времени того поста что-то в реализации поменялось?

L>И что означает вызов метода LoadHtmlResource("EMPTY")?


Смотри там же в win32.cpp:

PBYTE pb; DWORD cb;
if(GetHtmlResource("DEFAULT",pb,cb))
   HTMLayoutLoadHtml(hWnd,pb,cb);


это оно.

"DEFAULT" это имя html ресурса.
Re[7]: С чего начать
От: ShaggyOwl Россия http://www.rsdn.org
Дата: 14.09.08 06:21
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>clickable описан здесь

Полезная штука, не знал про ее существование.

CS>Насколько я понял есть желание обрабатывать BUTTON_CLICK на самом элементе поэтому вполне себе нормальный вариант с clickable.

Получается так.
Хорошо там, где мы есть! :)
Re[7]: С чего начать
От: Аноним  
Дата: 23.09.08 22:53
Оценка:
SO>>Здравствуйте, Lightlace, Вы писали:

Привет, подскажите, что делаю неправильно
Попробовал создать behavior, как здесь описано, который не хочет работать. Сил моих больше нет

Вот его код:
#include <windows.h>
#include <htmlayout_behavior.hpp>

using namespace htmlayout;

struct mybehavior: public behavior {
    //ctor
    mybehavior():behavior(HANDLE_MOUSE, "test_behavior") {}

        virtual BOOL on_mouse(HELEMENT he, HELEMENT target, BEHAVIOR_EVENTS type, UINT_PTR reason) {
        ::MessageBox(0,"An event happened here",0,0);
        return TRUE;
    }
};

mybehavior mybehavior_instance;


В OnCreate WTL-окна добавил

HTMLayoutSetCallback(m_hWnd, notify_handler, NULL);

И собственно код функции notify_handler:

static LRESULT CALLBACK notify_handler(UINT uMsg, WPARAM wParam, LPARAM lParam, LPVOID vParam) {
    NMHDR* phdr = (NMHDR*)lParam;
    switch(phdr -> code) {
        case HLN_ATTACH_BEHAVIOR: {
            LPNMHL_ATTACH_BEHAVIOR behdesc = (LPNMHL_ATTACH_BEHAVIOR)lParam;
            htmlayout::event_handler *pb = htmlayout::behavior::find(behdesc->behaviorName, behdesc->element);
            if (pb) {
                behdesc->elementTag = pb;
                behdesc->elementProc = htmlayout::behavior::element_proc;
                behdesc->elementEvents = pb->subscribed_to;
            }
            break;
        }
    }
    return 0;
}


Этот behavior вызывается из html-файла

<HTML>
<style>
#btn 
{
    behavior: mybehavior;
    width: 100;
    height: 30;
}
</style>
Hi there
<br>
<input type="button" id="btn" />
</HTML>


Может что-то пропустил? Заранее спасибо
Re[8]: С чего начать
От: Аноним  
Дата: 23.09.08 23:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А> behavior: mybehavior;


Извиняюсь, в коде было, конечно же, test_behavior. Просто опечатка

Но все равно не работает
Re[9]: С чего начать
От: Аноним  
Дата: 23.09.08 23:09
Оценка:
Еще раз извините Проблема решена

Тогда такой вопрос: встроенные обработчики (handle_mouse, handle_event) обрабатывают не все события, а только те, которые не были обработаны вышестоящими behaviors. Верно?

А как можно реализовать behavior на C, без использования наследования? Придется разворачивать все классы из htmlayout_behaviors.hpp? Или где-то есть уже готовая реализация?

Спасибо
Re[10]: С чего начать
От: c-smile Канада http://terrainformatica.com
Дата: 24.09.08 00:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Еще раз извините Проблема решена


А>Тогда такой вопрос: встроенные обработчики (handle_mouse, handle_event) обрабатывают не все события, а только те, которые не были обработаны вышестоящими behaviors. Верно?


Ты получаешь все bubbling events.

enum PHASE_MASK
{
BUBBLING = 0, // bubbling (emersion) phase
SINKING = 0x08000, // capture (immersion) phase, this flag is or'ed with EVENTS codes below
HANDLED = 0x10000 // event already processed.
};

Т.е.

case MOUSE_DOWN: // not processed by any child.
case MOUSE_DOWN | HANDLED: // was processed by some child.


А>А как можно реализовать behavior на C, без использования наследования? Придется разворачивать все классы из htmlayout_behaviors.hpp? Или где-то есть уже готовая реализация?


behavior (именованный event handler) это конструкция близкая к hwnd у которого WinProc это ElementEventProc

BOOL CALLBACK ElementEventProc(LPVOID tag, HELEMENT he, UINT evtg, LPVOID prms );

В HLN_ATTACH_BEHAVIOR ты мне должен отдать адрес твоей функции. Я его буду звать.
Пример из htmlayout_behavior.hpp:


// ElementWventProc implementeation
    static BOOL CALLBACK  element_proc(LPVOID tag, HELEMENT he, UINT evtg, LPVOID prms )
    {
      event_handler* pThis = static_cast<event_handler*>(tag);
      if( pThis ) switch( evtg )
        {
          case HANDLE_INITIALIZATION:
            {
              INITIALIZATION_PARAMS *p = (INITIALIZATION_PARAMS *)prms;
              if(p->cmd == BEHAVIOR_DETACH)
                pThis->detached(he);
              else if(p->cmd == BEHAVIOR_ATTACH)
                pThis->attached(he);
              return TRUE;
            }
          case HANDLE_MOUSE: {  MOUSE_PARAMS *p = (MOUSE_PARAMS *)prms; return pThis->handle_mouse( he, *p );  }
          case HANDLE_KEY:   {  KEY_PARAMS *p = (KEY_PARAMS *)prms; return pThis->handle_key( he, *p ); }
          case HANDLE_FOCUS: {  FOCUS_PARAMS *p = (FOCUS_PARAMS *)prms; return pThis->handle_focus( he, *p ); }
          case HANDLE_DRAW:  {  DRAW_PARAMS *p = (DRAW_PARAMS *)prms; return pThis->handle_draw(he, *p ); }
          case HANDLE_TIMER: {  TIMER_PARAMS *p = (TIMER_PARAMS *)prms; return pThis->handle_timer(he, *p); }
          case HANDLE_BEHAVIOR_EVENT:   { BEHAVIOR_EVENT_PARAMS *p = (BEHAVIOR_EVENT_PARAMS *)prms; return pThis->handle_event(he, *p ); }
          case HANDLE_METHOD_CALL:      
            { 
              METHOD_PARAMS *p = (METHOD_PARAMS *)prms; 
              if(p->methodID == XCALL)
              {
                XCALL_PARAMS *xp = (XCALL_PARAMS *)p;
                return pThis->handle_script_call(he,*xp);
              }
              else
                return pThis->handle_method_call(he, *p ); 
            }
          case HANDLE_DATA_ARRIVED:     { DATA_ARRIVED_PARAMS *p = (DATA_ARRIVED_PARAMS *)prms; return pThis->handle_data_arrived(he, *p ); }
          case HANDLE_SIZE:  {  pThis->handle_size(he); return FALSE; }
          case HANDLE_SCROLL:           { SCROLL_PARAMS *p = (SCROLL_PARAMS *)prms; return pThis->handle_scroll(he, *p ); }

          default:
            assert(false);
        }
      return FALSE;
    }
Re[11]: С чего начать
От: Аноним  
Дата: 27.09.08 22:19
Оценка:
Здравствуйте, c-smile, Вы писали:

Спасибо, разобрался

Еще такой вопрос появился: попытался добавить рисующий behavior (htmlayout_canvas.hpp), после чего компилятор выдает 135 ошибок, наподобие

1>c:\program files\microsoft visual studio 9.0\vc\outer_libs\htmlayoutsdk\include\htmlayout_graphin.h(149) : error C2059: syntax error : '__stdcall'
1>c:\program files\microsoft visual studio 9.0\vc\outer_libs\htmlayoutsdk\include\htmlayout_graphin.h(149) : error C2061: syntax error : identifier 'HPLATFORMGFX'
1>c:\program files\microsoft visual studio 9.0\vc\outer_libs\htmlayoutsdk\include\htmlayout_graphin.h(149) : error C2091: function returns function
1>c:\program files\microsoft visual studio 9.0\vc\outer_libs\htmlayoutsdk\include\htmlayout_graphin.h(149) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\program files\microsoft visual studio 9.0\vc\outer_libs\htmlayoutsdk\include\htmlayout_graphin.h(149) : warning C4183: 'GRAPHIN_RESULT': missing return type; assumed to be a member function returning 'int'
1>c:\program files\microsoft visual studio 9.0\vc\outer_libs\htmlayoutsdk\include\htmlayout_graphin.h(154) : error C2059: syntax error : '__stdcall' 
и т. д.


Если я к своему проекту просто добавляю behavior_clock_graphin.cpp, выдаются те же ошибки. Может нужно дополнительно дополнительно указывать какие-то define'ы?
Re[12]: С чего начать
От: c-smile Канада http://terrainformatica.com
Дата: 28.09.08 02:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, c-smile, Вы писали:


А>Если я к своему проекту просто добавляю behavior_clock_graphin.cpp, выдаются те же ошибки. Может нужно дополнительно дополнительно указывать какие-то define'ы?


По всей видимости _WINDOWS макро констнанта не описана? По умолчанию VS её описывает для всех windows проектов...

Обрати внимание что htmlayout_canvas.hpp это рисующий behavior использующий Graphin/AGG примитивы. Рисовать можно и без них. Например с помощью GDI примитивов. Можно кстати и GDI+ использовать если Graphinа не хватает.
Re[13]: С чего начать
От: Аноним  
Дата: 28.09.08 13:26
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>По всей видимости _WINDOWS макро констнанта не описана? По умолчанию VS её описывает для всех windows проектов...


CS>Обрати внимание что htmlayout_canvas.hpp это рисующий behavior использующий Graphin/AGG примитивы. Рисовать можно и без них. Например с помощью GDI примитивов. Можно кстати и GDI+ использовать если Graphinа не хватает.


Спасибо, именно в константе и была проблема
Re[13]: С чего начать
От: Аноним  
Дата: 28.09.08 20:53
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Обрати внимание что htmlayout_canvas.hpp это рисующий behavior использующий Graphin/AGG примитивы. Рисовать можно и без них. Например с помощью GDI примитивов. Можно кстати и GDI+ использовать если Graphinа не хватает.


Да, нужен именно антиалиасинг, в Graphin просто интерфейс попроще, чем у GDI+

А Graphin позволяет рисовать незамкнутые кривые Безье?
Re[14]: С чего начать
От: c-smile Канада http://terrainformatica.com
Дата: 29.09.08 01:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, c-smile, Вы писали:


CS>>Обрати внимание что htmlayout_canvas.hpp это рисующий behavior использующий Graphin/AGG примитивы. Рисовать можно и без них. Например с помощью GDI примитивов. Можно кстати и GDI+ использовать если Graphinа не хватает.


А>Да, нужен именно антиалиасинг, в Graphin просто интерфейс попроще, чем у GDI+


А>А Graphin позволяет рисовать незамкнутые кривые Безье?


gfx.open_path();
gfx.move_to(...);
gfx.bezier_curve_to(...);
gfx.draw_path(...);


Т.е. ты рисуешь незамкнутый path. Замкнутый path делается добавлением gfx.close_path(); перед draw_path().
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.