Myslím, že jsem už zde uvedl několik způsobů jak zobrazit HTML (přes webbrowser, chrome, gecko, nativní ThtmlLite). Každé řešení má něco do sebe, ale já jsem stále hledal "light" řešení pro krátké html texty.
HTMLLITE.DLL
Nejdříve jsem pokukoval po použití knihovny HTMLLITE.DLL, která je součástí některých MS produktů (jako např. instalace VS), ale nejasná licence, nejasné použití (které se později vyjasnilo) a nutnost DLL mne nakonec odradilo. Ale pro úplnost: htmllite a C#, použití je celkem jednoduché, takže se lze inspirovat.
V podstatě zobrazení je v principu nějak takto (více na tom odkazu):
CreateWindowEx(WS_EX_CONTROLPARENT, 'HTMLLITE',
'TODO: HTML goes here…', WS_CHILD | WS_VISIBLE,
10, 10, 500, 500, hWnd, 0, 0, 0);
Výsledkem je mini html renderování základních tagů a možnost odchycení kliknutí na link, což by mi stačilo.

(ukázka možnosti zobrazení)
Mini HTML
Ale v té době naše firma začala používat některé komponenty od TMS a hodně jejich komponent používá Mini HTML (na odkazu podporované tagy) a není problém ho použít.
Není to nic moc, rozhraní je trochu drsnější, ale stačí tomu Canvas a celkem se mi to líbí. Mezi zajímavosti, které jsou ale pro mne důležité, je např. možnost zobrazování obrázků z předaného ImageListu, možnost tabulátorů (a tím jednoduše formátovat do sloupců), podpora odkazů atd. (viz reference).

(ukázka výstupu s předaným ImageListem a za pomocí TVirtualDrawTree, s gradientem jako podklad)
Klíčová funkce je HTMLDrawEx, která má tunu parametrů. Je používána jednak pro kreslení a druhak pro kontrolu odkazů, kdy se předá
pozice X, Y a nastaví se {Kontrola odkazu} a pokud je návratová hodnota True, je v proměnné a vrácen odkaz. Dá se použít i na další,
ale toto je základ.
procedure mDrawText(oCanvas:TCanvas; ARect:TRect; const sText:string);
var
a,sa,fa:string;
XS, YS, ml, hl: Integer;
cr,hr: TRect;
CID,CV,CT:string;
begin
HTMLDrawEx(oCanvas, sText, ARect, imlMain {ImageList}, 0 {X}, 0{Y}, -1, -1, 1,
False {Kontrola odkazu}, False,
False, False, True, False, True
,False
, 1.0, clBlue{URLColor}, clNone, clNone, clGray, a, sa, fa,
XS, YS, ml, hl, hr
, cr, CID, CV, CT, nil, nil, Self.Handle
);
end;
Ano je to škaredé, ale pro mé účely do stačí a má to minimální nároky a závislosti.
TScrollBox, TPaintBox a kolečko myši
Určitě to znáte: pokud vrazíte TPaintBox na TScrollBox je vhodné v TPaintBox.OnMouseDown (nebo i jinde) udělat
pb:= TPaintBox(Sender);
ActiveControl := pb.Parent;
a tím nastavíte focus při kliknutí na scrollbox a všechno bude v pořádku. Jinak totiž nefunguje kolečko myši.