Вставка в программу HTML окна
От: LeonCrew Беларусь  
Дата: 05.06.04 21:58
Оценка:
Есть большой вопрос к Вам!

Мне нужно в программу поместить окно, в котором выводился бы текст написаный на языке HTML или на каком0то другом, но с такими же функциональными возможностями.

Я читал что для этих целей нужно использовать MSHTML, подскожите как? Может есть примеры?

Желательно чтобы все было на С++ и WinAPI.
Если есть у кого-то свои предложения (использовать не MSHTML), то тоже выслушаю. Но желательно чтобы все это кушало как можно меньше памяти.

06.06.04 08:37: Перенесено модератором из 'C/C++' — Odi$$ey
Re: Вставка в программу HTML окна
От: c-smile Канада http://terrainformatica.com
Дата: 05.06.04 22:27
Оценка:
Здравствуйте, LeonCrew, Вы писали:

LC>Если есть у кого-то свои предложения (использовать не MSHTML), то тоже выслушаю. Но желательно чтобы все это кушало как можно меньше памяти.


http://terrainformatica.com/htmlayout
Re[2]: Вставка в программу HTML окна
От: Serjio Россия  
Дата: 16.06.04 11:29
Оценка: 4 (1)
> 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
Только на РСДН помимо ответа на вопрос, можно получить еще список орфографических ошибок и узнать что-то новое из грамматики английского языка (c) http://www.rsdn.ru/forum/cpp/4720035.1.aspx
Автор: ZOI4
Дата: 28.04.12
Re[3]: Вставка в программу HTML окна
От: Serjio Россия  
Дата: 16.06.04 11:34
Оценка:
> [...] Asynchronous Pluggable Protocol-ом [...]

sorry, мой почтовый клиент режет строки по 72 символа на строку
Только на РСДН помимо ответа на вопрос, можно получить еще список орфографических ошибок и узнать что-то новое из грамматики английского языка (c) http://www.rsdn.ru/forum/cpp/4720035.1.aspx
Автор: ZOI4
Дата: 28.04.12
Re[3]: Вставка в программу HTML окна
От: LeonCrew Беларусь  
Дата: 17.06.04 10:44
Оценка:
Здравствуйте, 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>и более длинная. надо рассказывать ?

Спасибо за пример, если можно, то поподробнее и если есть где-то на русском или хорошо документированно с примерами на англиском, то я хотел б попросить у Вас ссылку.
Re[2]: Вставка в программу HTML окна
От: LeonCrew Беларусь  
Дата: 17.06.04 10:56
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>http://terrainformatica.com/htmlayout


Спасибо, посмотрел, штука давольно хорошая. Правда она немного "тяжелая" и хотелось бы увидеть более полную документацию на нее с описанием всех команд.
Я тут еще нашел QHTM тоже не плохая вещь, жокументирована относительно хорошо, есть неплохой набор тегов и некоторые собственные расширения.
Re[4]: Вставка в программу HTML окна
От: Serjio Россия  
Дата: 18.06.04 07:19
Оценка:
> Спасибо за пример, если можно, то поподробнее и если есть
> где-то на русском или хорошо документированно с примерами
> на англиском, то я хотел б попросить у Вас ссылку.

я лишь читал 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
Только на РСДН помимо ответа на вопрос, можно получить еще список орфографических ошибок и узнать что-то новое из грамматики английского языка (c) http://www.rsdn.ru/forum/cpp/4720035.1.aspx
Автор: ZOI4
Дата: 28.04.12
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.