как убрать рамку вокруг Twebbrowser ?

  • Автор темы milkyway
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

milkyway

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

Цель: снести нах
Вопрос: как?
зы: или я слепой, или никаких свойств типа border там нет...
Заранее пасиба за помощь.
 
B

Barmutik

Нужно использовать IDOCHOSTUIHANDLER...у него есть GetHostInfo а у WebBrowser есть параметр No3DBorder...

Его устанавливаете и вероятно будет то что Вам надо ...

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

Guest

Пасиб конечно за помощь... а можно более подробно (и несколько строчек кода для примера, есди не сложно) написать, как это сделать
 
B

Barmutik

Такккк ...

Делайте наследника от TWebBrowser и у него имплементите IDocHostUIHandler,
далее на GetHostInfo

Код:
DOCHOSTUIFLAG_NO3DBORDER = $0004; // константа у Микрософта из хелпа

function TXXX.GetHostInfo(var pInfo: TDOCHOSTUIINFO): HRESULT;
begin
pInfo.cbSize := SizeOf(pInfo);
pInfo.dwFlags := DOCHOSTUIFLAG_NO3DBORDER;
pInfo.dwDoubleClick := DOCHOSTUIDBLCLK_DEFAULT;
Result := S_OK;
end;

И будет Вам счастье .. надеюсь :( ... Ну у меня по крайней мере всё это работает ..

Там вот сколькими параметрами играться можно ...
Код:
 DOCHOSTUIFLAG_DIALOG = $0001;
DOCHOSTUIFLAG_DISABLE_HELP_MENU = $0002;
DOCHOSTUIFLAG_NO3DBORDER = $0004;
DOCHOSTUIFLAG_SCROLL_NO = $0008;
DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE = $0010;
DOCHOSTUIFLAG_OPENNEWWIN = $0020;
DOCHOSTUIFLAG_DISABLE_OFFSCREEN = $0040;
DOCHOSTUIFLAG_FLAT_SCROLLBAR = $0080;
DOCHOSTUIFLAG_DIV_BLOCKDEFAULT = $0100;
DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY = $0200;
DOCHOSTUIFLAG_OVERRIDEBEHAVIORFACTORY = $0400;
DOCHOSTUIFLAG_CODEPAGELINKEDFONTS = $0800;
DOCHOSTUIFLAG_URL_ENCODING_DISABLE_UTF8 = $1000;
DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8 = $2000;
DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE = $4000;
DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION = $10000;
DOCHOSTUIFLAG_IME_ENABLE_RECONVERSION = $20000;
DOCHOSTUIFLAG_THEME = $40000;
DOCHOSTUIFLAG_NOTHEME = $80000;
DOCHOSTUIFLAG_NOPICS = $100000;
DOCHOSTUIFLAG_NO3DOUTERBORDER = $200000;
DOCHOSTUIFLAG_DISABLE_EDIT_NS_FIXUP = 1;
DOCHOSTUIFLAG_LOCAL_MACHINE_ACCESS_CHECK = 1;
DOCHOSTUIFLAG_DISABLE_UNTRUSTEDPROTOCOL = 1;

Опять же похожим способом можно играться и с настройками откачки...

Код:
DLCTL_DLIMAGES
DLCTL_VIDEOS
DLCTL_BGSOUNDS
DLCTL_NO_SCRIPTS
DLCTL_NO_JAVA
DLCTL_NO_RUNACTIVEXCTLS
DLCTL_NO_DLACTIVEXCTLS
DLCTL_DOWNLOADONLY
DLCTL_NO_FRAMEDOWNLOAD
DLCTL_RESYNCHRONIZE
DLCTL_PRAGMA_NO_CACHE
DLCTL_NO_BEHAVIORS
DLCTL_NO_METACHARSET
DLCTL_URL_ENCODING
DISABLE_UTF8
DLCTL_URL_ENCODING_ENABLE_UTF8
DLCTL_FORCEOFFLINE
DLCTL_NO_CLIENTPULL
DLCTL_SILENT
DLCTL_OFFLINE

Очень полезно когда надо отключить откачку картинок в отдельно выделнном браузере или допустим сделать что бы он не выкидывал ошибки на скриптах...
 
M

milkyway

Пасиб. огромное, щас пойду делать наследника :(
 
B

Barmutik

Нет проблем .. главное что бы наследник хороший получился :( :( ;)
 
M

mamba

Мальчики, подскажите пожалуйста, как этого наследника делать?
Это значит создать класс, осонованый на TWebBrowser?
Обьясните плиз, на примере кода?
 
B

Barmutik

:D

Код:
 TMambaBrowser = class(TWebbrowser, IDocHostShowUI, IDocHostUIHandler,
   IDocHostUIHandler2)
end;

Наследник от TWebBrowser, который собирается импелементнуть перечисленные интерфейсы...
 
M

mamba

Для: Barmutik
Спасибо вам большущее и пламенное!
Мы сделали мне такого хорошего потомка.
Только эээ, что с этим потомком теперь делать?
Ну, вот обычно я просто перетаскиваю компонент на форму и все.
А куда же нашего потомка засунуть?
Вот так вы, мужики, всегда -- как потомка сделать -- 5 минут и готово.
А вот что с ним дальше то?
:(
Подскажие, плиз.
Буду очень признательна.
 
B

Barmutik

Гммм.. потомок то явно хороший .. вопросов нет ;)

Что бы Вы могли его перетащить на форму нужно его зарегестрировать как компонент... но до этого нужно имплементуть все его интерфейсы который Вы унаследовали в потомке...

Ну тут работы скажем не на 5 минут ;) .. но я ж не знаю что Вам от этого потомка надо то .. я просто написал что сами делали ..

И зачем Вам вообще наследоваться ? Что стандартного браузера не хватает ?


P.S. Нормальные мужчины знают немного побольше того, как потомка сделать за 5 минут.. ну например как его сделать за 30 минут ;)
 
B

bndr

В продолжение темы:::

Создал компоненту:

Код:
unit CustomWB;

interface
uses
Windows, Classes, SHDocVw;

type TDOCHOSTUIINFO = packed record
cbSize: ULONG;
dwFlags: DWORD;
dwDoubleClick: DWORD;
end;

type IDocHostUIHandler = interface(IUnknown)
 ['{bd3f23c0-d43e-11cf-893b-00aa00bdce1a}']
function GetHostInfo(var pInfo: TDOCHOSTUIINFO): HRESULT; stdcall;
end;

type
 TCustomizedWebBrowser = class(TWebBrowser, IDocHostUIHandler)
Private
 function GetHostInfo(var pInfo: TDOCHOSTUIINFO): HRESULT;  stdcall;
end;

procedure Register;

const

 DOCHOSTUIFLAG_FLAT_SCROLLBAR = $0080;
 DOCHOSTUIFLAG_DIV_BLOCKDEFAULT = $0100;

implementation

procedure Register;
begin
 RegisterComponents('Internet', [TCustomizedWebBrowser]);
end;

function TCustomizedWebBrowser.GetHostInfo(var pInfo: TDOCHOSTUIINFO): HRESULT; stdcall;
begin
 pInfo.dwFlags := DOCHOSTUIFLAG_FLAT_SCROLLBAR or DOCHOSTUIFLAG_DIV_BLOCKDEFAULT;
 Result := S_OK;
end;

end.

И этот код не работает. В том плане что открывая страницу
webbrowser1.navigate() , webbrowser подвисает и наведя на него стрелку, курсор меняется на стрелку с часиками. при попытке открыть снова какую нить страницу программа говорит что требуемый ресурс занят.

Что я делаю не так подскажите....
Мучаюсь уже дня три наверное

Заранее спасибо за ответ..
 
B

Barmutik

Вообще-то вот полное описание интерфейса... а кто остальное будет имплементить?

Код:
 IDocHostUIHandler = interface(IUnknown)
['{bd3f23c0-d43e-11cf-893b-00aa00bdce1a}']
function ShowContextMenu(const dwID: DWORD; const ppt: PPOINT;
const pcmdtReserved: IUnknown; const pdispReserved: IDispatch): HRESULT; stdcall;
function GetHostInfo(var pInfo: TDOCHOSTUIINFO): HRESULT; stdcall;
function ShowUI(const dwID: DWORD; const pActiveObject: IOleInPlaceActiveObject;
const pCommandTarget: IOleCommandTarget; const pFrame: IOleInPlaceFrame;
const pDoc: IOleInPlaceUIWindow): HRESULT; stdcall;
function HideUI: HRESULT; stdcall;
function UpdateUI: HRESULT; stdcall;
function EnableModeless(const fEnable: BOOL): HRESULT; stdcall;
function OnDocWindowActivate(const fActivate: BOOL): HRESULT; stdcall;
function OnFrameWindowActivate(const fActivate: BOOL): HRESULT; stdcall;
function ResizeBorder(const prcBorder: PRECT;
const pUIWindow: IOleInPlaceUIWindow;
const fRameWindow: BOOL): HRESULT; stdcall;
function TranslateAccelerator(const lpMsg: PMSG; const pguidCmdGroup: PGUID;
const nCmdID: DWORD): HRESULT; stdcall;
function GetOptionKeyPath(var pchKey: POLESTR; const dw: DWORD): HRESULT; stdcall;
function GetDropTarget(const pDropTarget: IDropTarget;
out ppDropTarget: IDropTarget): HRESULT; stdcall;
function GetExternal(out ppDispatch: IDispatch): HRESULT; stdcall;
function TranslateUrl(const dwTranslate: DWORD; const pchURLIn: POLESTR;
var ppchURLOut: POLESTR): HRESULT; stdcall;
function FilterDataObject(const pDO: IDataObject;
out ppDORet: IDataObject): HRESULT; stdcall;
end; // IDocHostUIHandler

И вот пример реализации того метода что Вам надо:
Код:
XXX.GetHostInfo(var pInfo: TDOCHOSTUIINFO): HRESULT;
begin
pInfo.cbSize := SizeOf(pInfo);
pInfo.dwFlags := AAA or BBB or CCC or ...;
end;

Это точно работает...
 
B

bndr

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

Пасиб за ответ!
 
4

4uf

Помогите плис!

У IDocHostUIHandler интерфейс описан,все компилится, но когда пытаюсь создать наследника:
type
TCustomizedWebBrowser = class(TWebBrowser, IDocHostUIHandler)
end;
выдает ошибку:Unsatisfied forward or external declaration 'ShowContextMenu'
Unsatisfied forward or external declaration 'GetHostInfo'
и т. д.
что делать подскажите...
 
B

Barmutik

Ну так Вы в наследнике то функции объявите IDocHostUIHandler и перестанет компилятор ругаться...
 
4

4uf

извиняюсь !!! до етого он писал:
undeclared identifier:'GetHostInfo'

а после того как я эти функции в наследнике объявлял
он писал:
Unsatisfied forward or external declaration: 'TCustomizedWebBrowser.GetHostInfo'
 
B

Barmutik

Мммм.. а имплеменатцию Вы этих функций сделали? Судя по ошибке Вы их только объявили а реализацию не сделали...
 
4

4uf

Тогда как сделать реализацию??
или где взять файлик в котором они реализованы?
или я что то нето говорю....
 
4

4uf

все получилось!!!
статья на англиском, но ведь есть исходник....
спасибо большое всем кто уделил внимание
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!