(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Панельки для Internet Explorer - своё ближе к сердцу

Источник: gigabyte.iatp

Но всё же всем этим GoogleBar, YandexBar, FlashGetBar и другим барам недоставало чего-то очень нужного. Одним пользователям не нравилась функциональность, других убивал дизайн, третьих - «ненавязчивые» баннеры. Но теперь всей этой несправедливости пришел конец. А если вы к тому же немножко разбираетесь в Delphi или С++, то для Вас это не конец а самое настоящее начало. Начало создания Вашего шедевра под названием Internet Explorer Toolbar.

Инструментарий

Как и вся техника Windows конца прошлого столетия, панельки инструментов для IE базируется на технологиях ActiveX и COM. А поєтому, для осуществления задуманного мы с Вами выберем язык поддерживающий написание приложений на основе этих технологий. И естественно в моём случае это будет Delphi. Во первых потому, что я нигде в интернете так и не смог найти Delphi-кода для подобного приложения (может быть не глубоко копал), а во вторых…..ну люблю я этот язык программирования и всё тут.

Итак…

Открываем Delphi и, закрыв все лишнее, создаем новую ActiveX библиотеку. После этого в той же закладке проектов выбираем "COM Object" c параметрами показанным на рис.1.

Заметьте, что мы не указываем на интерфейс, который мы будем реализовывать, а просто оставляем это поле пустым. Теперь посля нажатия на Ok IDE создаст каркас нашего компонента. Вот теперь можно к нему дописать недостающие интерфейсы:

  • IDeskBand - интерфейс объяавленный в ShlObj.pas. Как раз его IE и запрашивает для определения параметров создания новой панельки.
  • IObjectWithSite - этот интерфейс также объявлен в ShlObj.pas и предназначен для передачи нашему приложению всех жизненно необходимых параметров, одним из которых является ссылка на интерфейс IOleWindow, в котором содержится указатель на окно родителя и который нам тоже предстоит реализовать.
  • IPersistStream - этот интерфейс необходимо реализовать в тех случаях если в нашей панельки есть информация которую надо сохранить до следующего запуска.

Теперь наш класс будет выглядеть следующим образом:


  TMyIEBar = class(TComObject,IDeskBand,IObjectWithSite,IPersistStream)
  protected
   function SetSite(const pUnkSite: IUnknown ):HResult; stdcall;
   function GetSite(const riid: TIID; out site: IUnknown):HResult; stdcall;

   function GetBandInfo(dwBandID, dwViewMode: DWORD; var pdbi: TDeskBandInfo):HResult; stdcall;

   function ShowDW(fShow: BOOL): HResult; stdcall;
   function CloseDW(dwReserved: DWORD): HResult; stdcall;
   function ResizeBorderDW(var prcBorder: TRect; punkToolbarSite: IUnknown; fReserved: BOOL): HResult; stdcall;

   function GetWindow(out wnd: HWnd): HResult; stdcall;
   function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;

   function GetClassID(out classID: TCLSID): HResult; stdcall;

   function IsDirty: HResult; stdcall;
   function Load(const stm: IStream): HResult; stdcall;
   function Save(const stm: IStream; fClearDirty: BOOL): HResult; stdcall;
   function GetSizeMax(out cbSize: Largeint): HResult; stdcall;
 end;

Здесь мы включили объявления всех перекрываемых нами методов из всех интерфейсов. Но не волнуйтесь, к счастью для нас нет необходимости явно реализовывать каждый из этих методов прописывая в него функциональный код. Для большинства из вышеперечисленных методов достаточно будет и простого перекрывающего кода:


begin
 Result:=E_NOTIMPL;
end;

Нам же предстоит реализовать только методы GetSite, SetSite, GetClassID, GetBandInfo, ShowDW, CloseDW и GetWindow, чем мы и займемся в следующим разделе.

Кодирование

Наполнение смыслом наших интерфейсов мы начнем с SetSite.

В этом методе мы как минимум должны очистить указатель на ранее переданный интерфейс. Если передаваемый интерфейс указывает в никуда (т.е. равняется nil) , то наша панель удаляется и мы должны освободить все занятые ею ресурсы, после чего вернуть S_OK. Если же переданный указатель на интерфейс не пустой, то мы должны: обратить этот интерфейс в IOleWindow посредством QueryInterface, далее получить от него значение функции IOleWindow.GetWindow, которая возвращает нам дескриптор предка нашей панели и сохранить его для дальнейшего использования.

Если ваша панель предназначена не только для тупого отображения рекламных блоков, но и предполагает активное взаимодействие с пользователем, то вам необходимо также сохранить указатель на интерфейс IInputObjectSite, полученный вами посредством вызова QueriInterface. Теперь если всё прошло удачно, то мы возвращаем S_OK, или код ошибки в противном случае.

Кроме этих действий в этом методе мы должны будем вызвать функцию (RegisterAndCreateWindow) явно создающую новый оконный класс, который затем будет использован для организации реакции нашей панельки на те или иные действия пользователя.(см.Листинг)

Далее мы наполним метод GetSite следующим кодом:


begin
 site:=nil;
 Result:=E_FAIL;
 if FSite<>nil then
  Result:=FSite.QueryInterface(riid,site);
end;

Как видите этот код тоже не представляет собой ничего сложного, он только преобразовывает наш сохраненный интерфейс к запрашиваемому типу.

Метод GetClassID, так же не очень сложен для понимания. Во первых стоит помнить, что его браузер запрашивает для того, чтоб узнать уникальный идентификатор (GUID) нашего тулбара, который хранится в константе CLASS_MyIEBar, которая создается вместе с нашим классом. Итого реализация метода GetClassID будет выглядеть следующим образом:


function TMyIEBar.GetClassID;
begin
 classID:=Class_MySimpleIEBar;
 Result:=S_Ok;
end;

GetWindow - метод, который отвечает за передачу дескриптора нашего тулбара, созданного методом RegisterAndCreateWindow:


function TMyIEBar.GetWindow;
begin
 wnd:=MyWnd;
 Result:=S_Ok;
end;

Функции ShowDW и CloseDW, объявленные в IDockingWindow, наследником которого является IDeskBand, отвечают соответственно за показ/скрытие (ShowDW) и Уничтожение (CloseDW) нашей панельки.


function TMyIEBar.ShowDW;
begin
if MyWnd<>0 then
 if fShow then ShowWindow(MyWnd,SW_SHOW);
 else ShowWindow(MyWnd,SW_HIDE);
Result:=S_OK;
end;

function TMyIEBar.CloseDW;
begin
 ShowDW(False);
 if IsWindow(MyWnd) then DestroyWindow(MyWnd);
 MyWnd:=0;
 Result:=S_OK;
end;

Основа проекта

Конечно нормальное приложение сбалансировано, и каждая его часть несет определенную функциональную нагрузку, но все же я осмелюсь выделить три столпа, на которых будет держатся наша панель инструментов. Это во первых функция RegisterAndCreateWindow, которая регистрирует новый оконный класс и создает на его основе окно, которое и отображает наш тулбар; во вторых - функция SimpleProc, которая играет роль оконной функции нашей панельки т.е. принимает все системные и пользовательские сообщения и реагирует на них. И в третьих это метод GetBandInfo объявленный в интерфейсе IDeskBand и который отвечает за параметры отображения нашего объекта.

Итак, функция RegisterAndCreateWindow выглядит следующим образом:


 1.function TMyIEBar.RegisterAndCreateWindow:Boolean;
 2.var wc:TWndClass;Rect:TRect;
 3.begin
 4.Result:=False;
 5.if MyWnd=0 then
 6. begin
 7.  if Parent=0 then Exit;
 8.  ZeroMemory(@wc,SizeOf(wc));
 9.  if not GetClassInfo(hInstance,'MySimpleIEBar',wc) then
10.  with wc do
11.   begin
12.    style:=CS_HREDRAW or CS_VREDRAW or CS_GLOBALCLASS;
13.    lpfnWndProc:=@SimpleProc;
14.    cbClsExtra:=0;
15.    cbWndExtra:=0;
16.    hInstance:=SysInit.HInstance;
17.    hIcon:=0;
18.    hCursor:=LoadCursor(hInstance,IDC_ARROW);
19.    hbrBackground:=0;
20.    lpszMenuName:=nil;
21.    lpszClassName:='MySimpleIEBar';
22.    Windows.RegisterClass(wc);
23.   end;
24.  GetClientRect(Parent,Rect);
25.  CreateWindowEx(0,'MySimpleIEBar',nil,WS_CHILD or WS_CLIPSIBLINGS,
26.                 Rect.Left,Rect.Top,Rect.Right-Rect.Left,Rect.Bottom-27.Rect.Top,
28.                 Parent,0,hInstance,Pointer(Self));
29.  Result:=(MyWnd<>0);
30. end;
31.end;

Здесь во первых проверяется создано ли наше окно или его только предстоит создать. И в последнем случае мы запрашиваем параметры оконного класса с названием MySimpleIEBar и если и он не существует, то явно создаем его (строки 12-21) и регистрируем в качестве нового оконного класса (строка 22). Далее мы запрашиваем размеры окна для отображения, и создаем окно.

Если вы уже потрудились и почитали соответствующую документацию о создании подобных надстроек IE, расположенную на сайте Microsoft по адресу http://microsoft.com/library/en-us/shellcc/platform/Shell/programmersguide/shell_adv/bands.asp, то наверняка заметили одно несоответствие в коде приведенном в документации Microsoft и моей реализацией, а именно отсутствие флага WS_BORDER в функции CreateWindowEx (строка 25-28), который используется в примере Microsoft. Приведу аргумент за отсутствие этого флага при создании окна. На рисунке 2а показана наша панель инструментов созданная с использованием флага WS_BORDER, а на рисунке 2б - без оного. Но Вы конечно вправе решать использовать этот флаг или нет. Скажу только, что если вы его используете, то он будет отрисовываться цветом заданным параметром hBackground.

Теперь давайте перейдем к функции SimpleProc. Как уже было сказано она является оконной функцией нашей панели инструментов, т.е. отвечает за реакцию нашего окна на различные действия системы, браузера и пользователя. А поэтому здесь как раз самое время нам решить что именно будет делать наша надстройка. И для наглядности давайте заставим её отображать стандартную панель инструментов с кнопками и надписями над ними, по нажатию на которые будут открываться соответствующие страницы.

Для этого мы сперва в интерфейсной части нашего проекта в секции private объявим объект ToolBar, из стандартного набора Delphi с которым легче и приятнее работать (но который к тому же очень раздувает конечный файл).Исходный код оконной функции SimpleProc выглядит следующим образом:


function SimpleProc;
var Temp:TMySimpleIEBar;CS:TCreateStruct;
    T:TToolButton;i:integer;
    CR:TREct;PS:TPaintStruct;
begin
 1.Temp:=TMyIEBar(GetWindowLong(Wnd,Windows.GWL_USERDATA));
 2. case Msg of
 3.  WM_NCCREATE:
 4.    begin
 5.     CS:=PCreateStruct(lParam)^;
 6.     Temp:=TMySimpleIEBar(CS.lpCreateParams);
 7.     SetWindowLong(Wnd,Windows.GWL_USERDATA,Cardinal(Temp));
 8.     Temp.MyWnd:=Wnd;
 9.     Temp.ToolBar:=TToolBar.CreateParented(Wnd);
10.     Temp.ToolBar.ParentColor:=False;
11.     Temp.ToolBar.Visible:=True;
12.     Temp.ToolBar.Color:=clBtnFace;
13.     Temp.ToolBar.EdgeBorders:=[];
14.     For i:=High(Names) downto 0 do
15.      begin
16.       T:=TToolButton.Create(Temp.ToolBar);
17.       T.Parent:=Temp.ToolBar;
18.       if Names[i]='-' then T.Style:=tbsDivider else T.Caption:=Names[i];
19.       T.Tag:=i;
20.       T.Visible:=True;
21.       T.Align:=alLeft;
22.       T.OnClick:=Temp.DoClick;
23.      end;
24.     Temp.ToolBar.ShowCaptions:=True;
25.     Temp.ToolBar.Flat:=True;
26.    end;
27.  WM_PAINT:
28.    begin
29.     BeginPaint(wnd,PS);
30.     try
31.      GetClientRect(wnd,CR);
32.      with CR do
33.      Temp.ToolBar.SetBounds(Left,Top,Right-Left,Bottom-Top);
34.      Temp.ToolBar.PaintTo(ps.hdc,cr.Left,cr.Top);
35.     finally
36.      EndPaint(wnd,PS);
37.     end;
38.     Result:=0;
39.    end;
40.  WM_SETFOCUS:Temp.FSite.OnFocusChangeIS(Temp.FSite,True);
41.  WM_KILLFOCUS:Temp.FSite.OnFocusChangeIS(Temp.FSite,False);
42.  WM_COMMAND:Result:=0;
43.  WM_NCDESTROY:Temp.Browser:=nil;
44. else
45.  Result:=DefWindowProc(Wnd,Msg,wParam,lParam);
46. end;
end;

Здесь мы делаем следующее:
В строке 1 мы выбираем из недр Windows указатель на наш объект TMyIEBar, который мы позже занесем туда при обработке сообщения WM_NCCREATE.

Далее, в case-блоке, идет организация реакции на системные сообщения. В частности при появлении сообщения WM_NCCREATE (строки 4-25) мы заносим в память ранее упомянутый TMyIEBar, а также запоминаем дескриптор нашего окна, и создаем панель инструментов, вызывая в качестве конструктора не привычный Create а специальный конструктор CreateParented, который предназначен для создания компонентов предками которых выступают не Delphi компоненты. После этого мы заполняем наш ToolBar кнопками и реализуем их реакцию OnClick (см.Листинг). А потом, мы обрабатываем самые необходимые сообщения WM_PAINT, WM_SETFOCUS, WM_KILLFOCUS, WM_COMMAND и WM_NCDESTROY, все остальное мы отдаем не съедение DefWindowProc. И тут сообщу Вам еще одну особенность. Если вы, соблюдая все правила написания кода в Delphi сперва проинициализируете результат функции (result) присвоив ему значение 0, то вы не то что не увидите вашей панельки инструментов, но даже привычные Next, Previous, Home, Favourites и другие сгинут с окна IE (проверял на своем компьютере, может у Вас будет другая реакция).

Последний метод из тех, которые я отнес к главным в этом проекте это GetBandInfo из интерфейса IDeskBand который мы реализуем в точности так как сказано в документации Microsoft:


function TMyIEBar.GetBandInfo;
begin
Result:=E_INVALIDARG;
if @pdbi=nil then Exit;
 if (pdbi.dwMask and DBIM_MINSIZE)<>0 then
  begin
   pdbi.ptMinSize.x:=100;
   pdbi.ptMinSize.y:=24;
  end;
 if (pdbi.dwMask and DBIM_MAXSIZE)<>0 then
  begin
   pdbi.ptMaxSize.x:=-1;
   pdbi.ptMaxSize.y:=-1;
  end;
 if (pdbi.dwMask and DBIM_INTEGRAL)<>0 then
  begin
   pdbi.ptIntegral.x:=1;
   pdbi.ptIntegral.y:=1;
  end;
 if (pdbi.dwMask and DBIM_ACTUAL)<>0 then
  begin
   pdbi.ptActual.x:=0;
   pdbi.ptActual.y:=0;
  end;
 if (pdbi.dwMask and DBIM_TITLE)<>0 then
  with pdbi do
   FillChar(wszTitle,SizeOf(wszTitle),#0);
 if (pdbi.dwMask and DBIM_BKCOLOR)<>0 then pdbi.dwMask:=pdbi.dwMask and (not DBIM_BKCOLOR);
 if (pdbi.dwMask and DBIM_MODEFLAGS)<>0 then pdbi.dwModeFlags:=DBIMF_VARIABLEHEIGHT;
Result:=S_OK;
end;

Как видите, здесь задаются все параметры касающиеся отображения панели инструментов в окне Internet Explorer.

Все остальные методы мы заполняем кодом-пустышкой:


begin
 Result:=E_NOTIMPL;
end;

Который говорит системе о том, что этот метод не реализован.

Регистрация

Как и любой COM-объект наш ToolBar подлежит регистрации в системном реестре Windows. Но кроме этого, его GUID должен быть включен в список доступных панелей инструментов Internet Explorer, который расположен по адресу HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar в реестре Windows.

Есть несколько это сделать, но я предлагаю Вам наиболее функциональный с моей точки зрения метод. Как Вам известно (а если не известно то смотрите секцию initialization нашего модуля) регистрация ActiveX компонентов осуществляется при помощи объектов-заводов (Factory) соответствующих конкретному компоненту (TCOMObject, TAutoObject…). И ничто нам не мешает написать собственный компонент-реестратор нашего класса переопределив в нём функцию UpdateRegistry, которая как раз и отвечает за занесение в реестр информации об объекте:


procedure TMyIEComObjectFactory.UpdateRegistry(Register:Boolean);
begin
inherited UpdateRegistry(Register);
if Register then
  CreateRegKey('Software\Microsoft\Internet Explorer\Toolbar',
               GUIDToString(Class_MySimpleIEBar),'MyIEBar',HKEY_LOCAL_MACHINE)
else
  DeleteRegKey('Software\Microsoft\Internet Explorer\Toolbar\'+
               GUIDToString(Class_MySimpleIEBar),HKEY_LOCAL_MACHINE);
end;

Все. Теперь можно компилировать проект, регистрировать его (Run->Register ActiveX Application) и запускать Internet Explorer для созерцания результата наших трудов.

Альтернативные браузеры

Хоть эта статья и посвящена надстройкам для Internet Explorer, но она не была бы полной без обзора аналогичных технологий конкурирующих приложений. А поскольку наиболее доступным для меня в этот момент есть Opera то с ним и будем сравнивать. К сожалению прямой аналогии созданию дополнительных панелей инструментов Internet Explorer у Opera нет, но начиная с 7-й версии (проверялось на 7.23, 7.51, 7.53) есть возможность добавить свои панельки в список Panels (который вызывается через F4). Причем сделать это можно более элегантным способом нежели у Internet Explorer. Для этого надо просто оформить особым образом ссылку на ту WWW страницу, содержание которой вы хотите видеть в Панелях Opera. К примеру вот таким образом оформлена страница на моём сайте:


<div align=center><small>
<A href="operapanel.html" rel="sidebar" title="GigaPanel" target="general"><b><i>GigaPanel</i></b></A>
<small>
моя персональная <a href="aboutoperapanel.html" target="general"><b>панелька</b></a> для Opera 7</A>
</small></small></div>

Здесь ключевыми выступают поле rel, которое указывает на то, что страница указанная в адресе - панельная и подлежит добавлению. Следующее поле title - указывает на названия которое будет присвоено этой панели по умолчанию. После этих манипуляций (нажатия на ссылку и ее добавления в список браузера) Вам, или посетителям Вашего сайта станет доступна новая панель Opera.

Более того этого трюк также действует и на браузер Firefox (версия 0.9.1). А вот на моем стареньком IE 5.00 этот трюк не проходит.

Заключение

Таким образом в этой статье мы рассмотрели некоторые особенности создания визуальных надстроек к браузеру Internet Explorer на примере создания панели инструментов. Но конечно это не все. Если у вас установлен ReGet то вы наверняка хоть раз попробовали ReGet Bar, который размещается не как стандартный ToolBar а в виде Боковой панели (как «Избранное», «Журнал» или «Поиск»). Эта надстройка представляет собой несколько переработанный вариант нашей панели инструментов, причем переработке в большей степени подлежит не сама панель, а компонент-реестратор, который должен разместить GUID не в ToolBar, а в Explorer Bars, а код отображения панели останется тем же. Так что, как видите, место для полета творческой фантазии программиста-веб-мастера, или просто программиста есть и очень даже не маленький. И если теперь в разговоре с коллегами-програмистами вы услышите «Да...пробовал я эти панельки…не понравилось», можете смело заявлять «Напиши свою. Своё - ближе к сердцу».

Листинг


unit Main;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  Windows, ActiveX, Classes, ComObj,ShlObj,Messages,Toolwin,ComCtrls,Graphics;

type
  TMyIEComObjectFactory = class(TComObjectFactory)
   public
    procedure UpdateRegistry(Register: Boolean); override;
   end;

  TMyIEBar = class(TComObject,IDeskBand,IObjectWithSite,IPersistStream)
  private
   FSite:IInputObjectSite;
   Parent,MyWnd:HWND;
   ToolBar:TToolBar;
   Browser:IInterface;
   function RegisterAndCreateWindow:Boolean;
   procedure DoClick(Sender:TObject);
  protected
   function SetSite(const pUnkSite: IUnknown ):HResult; stdcall;
   function GetSite(const riid: TIID; out site: IUnknown):HResult; stdcall;

   function GetBandInfo(dwBandID, dwViewMode: DWORD; var pdbi: TDeskBandInfo):HResult; stdcall;

   function ShowDW(fShow: BOOL): HResult; stdcall;
   function CloseDW(dwReserved: DWORD): HResult; stdcall;
   function ResizeBorderDW(var prcBorder: TRect; punkToolbarSite: IUnknown; fReserved: BOOL): HResult; stdcall;

   function GetWindow(out wnd: HWnd): HResult; stdcall;
   function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;

   function GetClassID(out classID: TCLSID): HResult; stdcall;

   function IsDirty: HResult; stdcall;
   function Load(const stm: IStream): HResult; stdcall;
   function Save(const stm: IStream; fClearDirty: BOOL): HResult; stdcall;
   function GetSizeMax(out cbSize: Largeint): HResult; stdcall;
 end;

const
  Class_MyIEBar: TGUID = '{5D291680-EB04-11D8-A8BF-B5FE4CF3323A}';

function SimpleProc(Wnd:HWnd;Msg:UINT;wparam:Word;lparam:Longint):HResult; stdcall;

resourcestring
 SBase = 'http://gigabyte.iatp.org.ua';
 //SBase = 'D:\Projects\HTMLProjects\MySite02';
implementation
uses ComServ,Registry,DebugUnit,SysUtils,Controls,ShDocVw,Variants;

const
   Names:Array[0..5] of String[20] =
    ('На Сайт','-','Статьи','Компоненты','Ссылки','Советы');
   Links:Array[0..5] of String[255] =
   ('/',
    '',
    '/articles.html',
    '/mycomponents.html',
    '/usefull.html',
    '/tips.html');
function TMyIEBar.SetSite;
var OleWindow:IOleWindow;
begin
Result:=S_Ok;
FSite:=nil;
Parent:=0;
if pUnkSite=nil then Exit;
OleWindow:=pUnkSite as IOleWindow;
if not Succeeded(OleWindow.GetWindow(Parent)) then Result:=E_FAIL;
OleWindow:=nil;
if Parent=0 then
 begin
  Result:=E_FAIL;
  Exit;
 end;
if not RegisterAndCreateWindow then
 begin
  Result:=E_FAIL;
  Exit;
 end;
FSite:=punkSite as IInputObjectSite;
end;

function TMyIEBar.RegisterAndCreateWindow:Boolean;
var wc:TWndClass;Rect:TRect;
begin
Result:=False;
if MyWnd=0 then
 begin
  if Parent=0 then Exit;
  ZeroMemory(@wc,SizeOf(wc));
  if not GetClassInfo(hInstance,'MySimpleIEBar',wc) then
  with wc do
   begin
    style:=CS_HREDRAW or CS_VREDRAW or CS_GLOBALCLASS;
    lpfnWndProc:=@SimpleProc;
    cbClsExtra:=0;
    cbWndExtra:=0;
    hInstance:=SysInit.HInstance;
    hIcon:=0;
    hCursor:=LoadCursor(hInstance,IDC_ARROW);
    hbrBackground:=0;
    lpszMenuName:=nil;
    lpszClassName:='MySimpleIEBar';
    Windows.RegisterClass(wc);
   end;
  GetClientRect(Parent,Rect);
  CreateWindowEx(0,'MySimpleIEBar',nil,WS_CHILD or WS_CLIPSIBLINGS,
                 Rect.Left,Rect.Top,Rect.Right-Rect.Left,Rect.Bottom-Rect.Top,
                 Parent,0,hInstance,Pointer(Self));
  Result:=(MyWnd<>0);
 end;
end;

procedure TMyIEBar.DoClick(Sender:TObject);
var Path:OleVariant;Flags:OleVariant;
    L:String;
begin
try
 Browser:=CreateComObject(CLASS_InternetExplorer);
except
 on E:Exception do PrintStatus(E.Message);
end;
L:=Links[(Sender as TToolButton).Tag];
if Browser=nil then
 begin
  PrintStatus('Browser=nil');
  Exit;
 end else
 begin
  (Browser as IWebBrowser2).Silent:=true;
  (Browser as IWebBrowser2).Visible:=true;
  Path:=SBase+L;
  (Browser as IWebBrowser2).Navigate2(Path,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
 end;
end;

function TMyIEBar.GetSite;
begin
site:=nil;
Result:=E_FAIL;
if FSite<>nil then
 Result:=FSite.QueryInterface(riid,site);
end;

function SimpleProc;
var Temp:TMyIEBar;CS:TCreateStruct;
    T:TToolButton;i:integer;
    CR:TREct;PS:TPaintStruct;
begin
Temp:=TMyIEBar(GetWindowLong(Wnd,Windows.GWL_USERDATA));
 case Msg of
  WM_NCCREATE:
    begin
     CS:=PCreateStruct(lParam)^;
     Temp:=TMyIEBar(CS.lpCreateParams);
     SetWindowLong(Wnd,Windows.GWL_USERDATA,Cardinal(Temp));
     Temp.MyWnd:=Wnd;
     Temp.ToolBar:=TToolBar.CreateParented(Wnd);
     Temp.ToolBar.ParentColor:=False;
     Temp.ToolBar.Visible:=True;
     Temp.ToolBar.Color:=clBtnFace;
     Temp.ToolBar.EdgeBorders:=[];
     For i:=High(Names) downto 0 do
      begin
       T:=TToolButton.Create(Temp.ToolBar);
       T.Parent:=Temp.ToolBar;
       if Names[i]='-' then T.Style:=tbsDivider else T.Caption:=Names[i];
       T.Tag:=i;
       T.Visible:=True;
       T.Align:=alLeft;
       T.OnClick:=Temp.DoClick;
      end;
     Temp.ToolBar.ShowCaptions:=True;
     Temp.ToolBar.Flat:=True;
    end;
  WM_PAINT:
    begin
     BeginPaint(wnd,PS);
     try
      GetClientRect(wnd,CR);
      with CR do
      Temp.ToolBar.SetBounds(Left,Top,Right-Left,Bottom-Top);
      Temp.ToolBar.PaintTo(ps.hdc,cr.Left,cr.Top);
     finally
      EndPaint(wnd,PS);
     end;
     Result:=0;
    end;
  WM_SETFOCUS:Temp.FSite.OnFocusChangeIS(Temp.FSite,True);
  WM_KILLFOCUS:Temp.FSite.OnFocusChangeIS(Temp.FSite,False);
  WM_COMMAND:Result:=0;
  WM_NCDESTROY:Temp.Browser:=nil;
 else
  Result:=DefWindowProc(Wnd,Msg,wParam,lParam);
 end;
end;

function TMyIEBar.IsDirty;
begin
REsult:=E_NOTIMPL;
end;

function TMyIEBar.Load;
begin
Result:=E_NOTIMPL;
end;

function TMyIEBar.Save;
begin
REsult:=E_NOTIMPL;
end;

function TMyIEBar.GetSizeMax;
begin
REsult:=E_NOTIMPL;
end;

function TMyIEBar.GetClassID;
begin
classID:=Class_MyIEBar;
Result:=S_Ok;
end;

function TMyIEBar.GetBandInfo;
begin
Result:=E_INVALIDARG;
if @pdbi=nil then Exit;
 if (pdbi.dwMask and DBIM_MINSIZE)<>0 then
  begin
   pdbi.ptMinSize.x:=100;
   pdbi.ptMinSize.y:=24;
  end;
 if (pdbi.dwMask and DBIM_MAXSIZE)<>0 then
  begin
   pdbi.ptMaxSize.x:=-1;
   pdbi.ptMaxSize.y:=-1;
  end;
 if (pdbi.dwMask and DBIM_INTEGRAL)<>0 then
  begin
   pdbi.ptIntegral.x:=1;
   pdbi.ptIntegral.y:=1;
  end;
 if (pdbi.dwMask and DBIM_ACTUAL)<>0 then
  begin
   pdbi.ptActual.x:=0;
   pdbi.ptActual.y:=0;
  end;
 if (pdbi.dwMask and DBIM_TITLE)<>0 then
  with pdbi do
   begin
    FillChar(wszTitle,SizeOf(wszTitle),#0);
   end;
 if (pdbi.dwMask and DBIM_BKCOLOR)<>0 then pdbi.dwMask:=pdbi.dwMask and (not DBIM_BKCOLOR);
 if (pdbi.dwMask and DBIM_MODEFLAGS)<>0 then pdbi.dwModeFlags:=DBIMF_VARIABLEHEIGHT;
Result:=S_OK;
end;

function TMyIEBar.ShowDW;
begin
if MyWnd<>0 then
 if fShow then
  begin
   ShowWindow(MyWnd,SW_SHOW);
  end
 else
  begin
   ShowWindow(MyWnd,SW_HIDE);
  end;
Result:=S_OK;
end;

function TMyIEBar.CloseDW;
begin
ShowDW(False);
FreeAndNil(ToolBar);
if IsWindow(MyWnd) then DestroyWindow(MyWnd);
MyWnd:=0;
Result:=S_OK;
end;

function TMyIEBar.ResizeBorderDW;
begin
Result:=E_NOTIMPL;
end;

function TMyIEBar.GetWindow;
begin
wnd:=MyWnd;
Result:=S_Ok;
end;

function TMyIEBar.ContextSensitiveHelp;
begin
Result:=E_NOTIMPL;
end;

procedure TMyIEComObjectFactory.UpdateRegistry(Register:Boolean);
begin
inherited UpdateRegistry(Register);
if Register then
  CreateRegKey('Software\Microsoft\Internet Explorer\Toolbar',
               GUIDToString(Class_MyIEBar),'MyIEBar',HKEY_LOCAL_MACHINE)
else
  DeleteRegKey('Software\Microsoft\Internet Explorer\Toolbar\'+
               GUIDToString(Class_MyIEBar),HKEY_LOCAL_MACHINE);
end;
initialization
  TMyIEComObjectFactory.Create(ComServer, TMyIEBar, Class_MyIEBar,
    'MyIEBar', 'MyIEBar', ciMultiInstance, tmApartment)
end.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 11.12.2007 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год.
Microsoft Office 365 для Дома 32-bit/x64. 5 ПК/Mac + 5 Планшетов + 5 Телефонов. Подписка на 1 год.
Microsoft 365 Business Basic (corporate)
Microsoft Office для дома и учебы 2019 (лицензия ESD)
Microsoft 365 Apps for business (corporate)
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Безопасность компьютерных сетей и защита информации
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
Программирование на Visual Basic/Visual Studio и ASP/ASP.NET
Windows и Office: новости и советы
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100