Есть большой вопрос к Вам!
Мне нужно в программу поместить окно, в котором выводился бы текст написаный на языке HTML или на каком0то другом, но с такими же функциональными возможностями.
Я читал что для этих целей нужно использовать MSHTML, подскожите как? Может есть примеры?
Желательно чтобы все было на С++ и WinAPI.
Если есть у кого-то свои предложения (использовать не MSHTML), то тоже выслушаю. Но желательно чтобы все это кушало как можно меньше памяти.
06.06.04 08:37: Перенесено модератором из 'C/C++' — Odi$$ey
Здравствуйте, LeonCrew, Вы писали:
LC>Если есть у кого-то свои предложения (использовать не MSHTML), то тоже выслушаю. Но желательно чтобы все это кушало как можно меньше памяти.
http://terrainformatica.com/htmlayout
> http://terrainformatica.com/htmlayout
у них же свой render. я не говорю плох ли он или хорош.
он
другой.
если различия в поведении не так важны тогда да.
но я люблю если чем и пользоваться то родным,
чтобы исключить появление
приятных сюрпризов, для себя.
если есть желание попользовать "родной" рендеринг
то следует сразу определиться требуется ли тебе
просто "что есть то и показать", либо будут и гиперссылки
(например хочется попользовать html для бух.отчетов).
для первого случая накидаю кусками, но причесать и понять можно
procedure Walk(const iiMSHTML: IHTMLDocument2);
var
viUnknown : IUnknown;
viDispatch : IDispatch;
viColl : IHTMLElementCollection;
viHTMLElement : IHTMLElement;
cElems : integer;
i : integer;
item : OleVariant;
str : string;
begin
system.Initialize(viUnknown);
system.Initialize(viDispatch);
system.Initialize(viColl);
system.Initialize(viHTMLElement);
try
viColl := iiMSHTML.all;
cElems := viColl.length;
for i:=0 to cElems-1 do begin
item := viColl.item(i, VT_I4);
str := '|>| '+item.tagName+' |<|
'+IntToStr(item.sourceIndex);
OutputDebugString(PChar(str));
(*
if VarType(item) = varDispatch then begin
viDispatch := item;
if viDispatch.QueryInterface(IHTMLElement, viHTMLElement) =
S_OK then begin
str := '|>| '+viHTMLElement.tagName+'
|<|';
OutputDebugString(PChar(str));
end;
end;
*)
viHTMLElement := nil;
item := Null;
end;
finally
system.Finalize(viHTMLElement);
system.Finalize(viColl);
system.Finalize(viDispatch);
system.Finalize(viUnknown);
end;
end;
function Load(const iiMSHTML: IHTMLDocument2): HResult;
var
viPersistFile : IPersistFile;
begin
system.Initialize(viPersistFile);
try
Result := iiMSHTML.QueryInterface(IPersistFile, viPersistFile);
if Result = S_OK then begin
Result :=
viPersistFile.Load(PWideChar(WideString('C:\Custom\Work\Work6\Projects\M
at_part\mshtml_\_help\abc.html')), STGM_READ);
if Result = S_OK then begin
{Walk(iiMSHTML);}
end;
end;
finally
system.Finalize(viPersistFile);
end;
end;
function Init: IHTMLDocument2;
begin
OleInitialize(nil);
system.Initialize(Result);
if CoCreateInstance(CLASS_HTMLDocument, nil, CLSCTX_INPROC_SERVER,
IHTMLDocument2, Result) = S_OK then begin
if Load(Result) <> S_OK then begin
Result := nil;
end;
end
else begin
Result := nil;
end;
OleUninitialize;
end;
function Run(wnd: TPanel; const iiMSHTML: IHTMLDocument2): HResult;
var
vHDC : windows.HDC;
rect : TRect;
viUnknown : IUnknown;
viViewObject : IViewObject;
viOleObject : IOleObject;
function PixelsToHimetric(const P: TPoint): TPoint;
var
DC: HDC;
begin
DC := GetDC(0);
Result.X := MulDiv(P.X, 2540, GetDeviceCaps(DC, LOGPIXELSX));
Result.Y := MulDiv(P.Y, 2540, GetDeviceCaps(DC, LOGPIXELSY));
ReleaseDC(0, DC);
end;
begin
system.Initialize(viUnknown);
system.Initialize(viViewObject);
system.Initialize(viOleObject);
OleInitialize(nil);
try
Result := iiMSHTML.QueryInterface(IUnknown, viUnknown);
if Result = S_OK then begin
Result := viUnknown.QueryInterface(IOleObject, viOleObject);
if Result = S_OK then begin
//viOleObject.SetHostNames(PWideChar(WideString('hosthostSerjio')),
PWideChar(WideString('hosthostSerjio1')));
//viOleObject.SetExtent(DVASPECT_CONTENT,
PixelsToHimetric(Types.Point(wnd.ClientWidth, wnd.ClientHeight)));
rect := wnd.ClientRect;
rect.Left := rect.Left + 4;
rect.Top := rect.Top + 4;
rect.Right := rect.Right - 4;
rect.Bottom := rect.Bottom - 4;
viOleObject.SetExtent(DVASPECT_CONTENT,
PixelsToHimetric(Types.Point(rect.Right-rect.Left,
rect.Bottom-rect.Top)));
Result := viUnknown.QueryInterface(IViewObject,
viViewObject);
if Result = S_OK then begin
//windows.Ellipse(wnd.Canvas.Handle, 100, 100, 1000,
600);
vHDC := GetDC(wnd.Handle);
try
//Result := OleDraw(viMSHTML, 1{DVASPECT_CONTENT},
vHDC, rect);
Result := viViewObject.Draw(DVASPECT_CONTENT, -1, nil,
nil, 0, vHDC, @rect, nil, nil, 0);
finally
ReleaseDC(wnd.Handle, vHDC);
end;
end;
end;
end;
finally
OleUninitialize;
system.Finalize(viOleObject);
system.Finalize(viViewObject);
system.Finalize(viUnknown);
end;
end;
procedure TFormMain.Button6Click(Sender: TObject);
begin
fiMSHTML := uObj.Init;
end;
procedure TFormMain.Button7Click(Sender: TObject);
begin
if Assigned(fiMSHTML) then begin
uObj.Run(Panel1, fiMSHTML);
end;
end;
procedure TFormMain.Button8Click(Sender: TObject);
begin
uObj.Walk(fiMSHTML);
end;
но все дело в том, что как правило в html-отчетах еще
и очень хочется гиперссылки поиметь. а тут как ни крути
лучше воспользоваться
[url=
http://msdn.microsoft.com/library/default.asp?url=/workshop/network
ing/pluggable/overview/overview.asp]Asynchronous Pluggable
Protocol-ом[/url]
но это уже совсем другая история...
и более длинная. надо рассказывать ?
--
"Software is like sex it's better when it's free." (с) Linus Torvalds
Posted via RSDN NNTP Server 1.9 beta
Здравствуйте, Serjio, Вы писали:
>> http://terrainformatica.com/htmlayout
S>у них же свой render. я не говорю плох ли он или хорош.
S>он другой.
S>если различия в поведении не так важны тогда да.
S>но я люблю если чем и пользоваться то родным,
S>чтобы исключить появление приятных сюрпризов, для себя.
S>если есть желание попользовать "родной" рендеринг
S>то следует сразу определиться требуется ли тебе
S>просто "что есть то и показать", либо будут и гиперссылки
S>(например хочется попользовать html для бух.отчетов).
S>но все дело в том, что как правило в html-отчетах еще
S>и очень хочется гиперссылки поиметь. а тут как ни крути
S>лучше воспользоваться
S>[url=http://msdn.microsoft.com/library/default.asp?url=/workshop/network
S>ing/pluggable/overview/overview.asp]Asynchronous Pluggable
S>Protocol-ом[/url]
S>но это уже совсем другая история...
S>и более длинная. надо рассказывать ?
Спасибо за пример, если можно, то поподробнее и если есть где-то на русском или хорошо документированно с примерами на англиском, то я хотел б попросить у Вас ссылку.
Здравствуйте, c-smile, Вы писали:
CS>http://terrainformatica.com/htmlayout
Спасибо, посмотрел, штука давольно хорошая. Правда она немного "тяжелая" и хотелось бы увидеть более полную документацию на нее с описанием всех команд.
Я тут еще нашел QHTM тоже не плохая вещь, жокументирована относительно хорошо, есть неплохой набор тегов и некоторые собственные расширения.
> Спасибо за пример, если можно, то поподробнее и если есть
> где-то на русском или хорошо документированно с примерами
> на англиском, то я хотел б попросить у Вас ссылку.
я лишь читал msdn. возможно есть еще литература где этот вопрос
разобран, но я ее не встречал
да и тут все прозчано: создаем инстанс документа (просил по русски

точнее CLASS_HTMLDocument '{25336920-03F9-11CF-8FD0-00AA00686F13}'
(поддерживается mshtml.dll)
дальше либо грузим его из своего файла, попросив у него IPersistFile,
либо грузим из потока, либо ручками создаем все дерево элементов
(body, table, tr, td, и т.д.)
ну а заполнив или загрузив html-текст (который он разберет),
рисуем его попросив IViewObject на свой hDC
P.S. одно плохо, если при разборе mshtml захочет что-то дотянуть,
он это сделает сам. например встретит
<img src="
http://www.rsdn.ru:80/File/15231/untitled.bmp">
или стили с "внешнего" источника, он все вытянет и отрендерит.
хотелось бы управлять процессом и поиметь фильтр посередине
(фильтр — это то, что stdin -> [фильтр] -> stdout,
не путать с тем что "не все пропускает")
не регистрить же на все возможные (и невозможные) протоколы
асинхронные handler-ы (для этого процесса)
но тут я скорее всего чего-то не знаю. наверно.
буду признателен услышать.
--
С уважением, Сергей
Posted via RSDN NNTP Server 1.9 beta