• 0
Вадим Смоленский

windows Странности с отрисовкой TWebBrowser

Вопрос

Использую TWebBrowser для вывода контекстной справки в специальном окне. При этом размеры TWebBrowser и его расположение на окне могут меняться в зависимости от режима. Наблюдается следующая странность: размеры и координаты TWebBrowser при первом выводе где-то запоминаются, и при смене режима, наряду с исправно отрисованным на новом месте TWebBrowser, на старом месте красуется белый прямоугольник, закрывающий все прочие контролы.

Я уже прочитал в других вопросах форума, что TWebBrowser, будучи нативным компонентом, рисуется поверх других. Это бы ладно. Но когда поверх других рисуется мертвый белый фантом - это уже как-то чересчур. Есть ли способ это явление забороть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

8 ответов на этот вопрос

  • 0

При смене какого еще режима?

Vitaldj понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

При смене какого еще режима?

Одного из режимов, предусмотренных мной для вывода этого окна. При разных режимах TWebBrowser имеет разные координаты и размер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
2 минуты назад, Вадим Смоленский сказал:

При смене какого еще режима?

Одного из режимов, предусмотренных мной для вывода этого окна. При разных режимах TWebBrowser имеет разные координаты и размер.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Платформа Windows, это обозначено в теме, разве не видно? Сам работаю на семерке, если это важно.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
11 минуту назад, Вадим Смоленский сказал:

Платформа Windows, это обозначено в теме, разве не видно? Сам работаю на семерке, если это важно.

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

Что то Ярослав сделал с сайтом и теги стали какие то странные, поэтому Windows и не заметил. Но все равно, лучше это указывать в теме. Прилагайте пример, глянем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Application.processmessages пробовали после смены размера окна? 

Мне кажется проблема в этих режимах. Можно подробнее про них?

 

Изменено пользователем ENRGY

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Application.ProcessMessages пробовал, конечно. Не помогает.

Но вы правы, проблема на моем конце, ибо в облегченном варианте не воспроизводится. Как найду причину, доложу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Изменено пользователем Вадим Смоленский

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Вадим Смоленский
      Работаю в Berlin, делаю приложение под Windows. При каждом вызове метода Popup для TPopupMenu, а также при создании и выводе на экран компонента TPopup, в левом верхнем углу формы на долю секунды появляется белый прямоугольник 50х50 пикселей. Нельзя ли как-нибудь это явление подавить?

    • Автор: Pax Beach
      Мне нужно сделать снимок экрана из своего приложения в приложении DirectX (в игре).
      По-быстрому накидал приложение, исходники здесь: MakeScreenshot-Forum.zip

      1. по нажатию единственной кнопки будет выполнена серия из 16 снимков экрана. Если запущен Скайп, то фотографироваться будет содержимое его окна.
      2. По нажатии CTRL+ALT+F9 будет сделан единичный снимок
      3. Label внизу показывает сколько миллисекунд затрачено на вывод снимка
      4. В комментах так же вы найдете, как работать со снимками через буфер обмена.
       
      Работа выполняется через GetDC(NULL);
      Windows 10 x64. Снимки делаются. И DirectX тоже нормально фотографируется.
      НО! только в оконных приложениях.
      Если приложение DirectX полноэкранное, то на всех снимках одна и та же картинка с первого снимка.
      То есть изменение буфера экрана в приложении ни как не отражается на снимках.
       
      Что нужно? Необходимо делать снимки конкретного приложения через интерфейс DirectX, а точнее, я так понимаю, через DirectShow. Тогда не будет разницы в окне оно или на полный экран.
      Помогите плиз, знающие люди, с решением этой задачи.
      Гарантирую вам от сообщества большой почет, от меня огромный респект, если это принесет доход, то еще и очень приятный бонус.
       
      Ссылки теме:
      1. DIRECTX FOR DELPHI
      2. unofficial version of DelphiX
      3. DirectX для начинающих
      4. MinHook - The Minimalistic x86/x64 API Hooking Library
      5. Various methods for capturing the screen
      6. Вывод графики на рабочий стол Windows с использованием оверлеев DirectX
      7. Project JEDI
      8. Реализация перехвата вызовов API — исчерпывающе про внедрение DLL, если разобраться, + это на Delphi
      UPD:
      9. Серия видео уроков Пишем D3D-хук — все понятно, только в Delphi перенести нужно.
      UPD 2:
      Научился рисовать в Direct3D и ловить интерфейс IDirect3DDevice9. Теперь делаю DLL ловушку для реализации снимков.
       
    • Автор: chaplin.u@gmail.com
      Как определить язык системы в Win10 ?
    • Автор: Вадим Смоленский
      В Object Inspector подгружаю ImageList к TTabControl, иду в отдельные TTabItem, выбираю номера для ImageIndex. Иконки выводятся прижатыми к левому краю. Как выровнять их по центру? Текста не предусматриваю, будут только иконки.
    • Автор: Вадим Смоленский
      Если главное окно приложения для Windows выполнено как MDI и занимает почти весь экран, то пункты главного меню концентрируются слева, оставляя справа длинную пустую полосу. Этого пространства жалко, его можно было бы использовать с пользой - как, собственно, и сделано в интерфейсе RAD Studio: после пункта меню Help идет вертикальная полоска из точек, а дальше иконки, боксы поиска и прочее хозяйство. Как это можно сделать?
    • Автор: Евгений Корепов
      Господа и товарищи, помогите тупому мне! Столкнулся с странным. Под windows все отлично работает, а под android не могу добиться загрузки картинок. Мозг уже сломал.
      Собрал тестовый проект - в ListView (DynamicAppearance) добавляем 4 ListViewItem, в ListViewUpdatingObjects все создаем и грузим картинки из инета (потоки и прочее убрал для упрощения). Картанка слева, текст (URL) справа, проще некуда. Прилагаю к сообщению архив проекта и код.
      unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base, FMX.ListView, System.Net.HTTPClient, FMX.Objects; type TFormMain = class(TForm) ListView: TListView; procedure ListViewUpdatingObjects(const Sender: TObject; const AItem: TListViewItem; var AHandled: Boolean); procedure FormShow(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } ListViewUpdate : Boolean; procedure MyListViewUpdateObjects(const AListView: TListView; const AItem: TListViewItem); procedure InitListView(AListView : TListView); function LoadImageFromURL(AURL : String) : TBitmap; end; var FormMain: TFormMain; implementation {$R *.fmx} procedure TFormMain.FormCreate(Sender: TObject); begin ListViewUpdate:=False; end; procedure TFormMain.FormShow(Sender: TObject); begin InitListView(ListView); end; procedure TFormMain.InitListView(AListView : TListView); Var AListViewItem : TListViewItem; AImageURL : String; begin AImageURL:='http://kayfolom.ru/images/test/'; ListViewUpdate:=True; AListViewItem:=AListView.Items.Add; AListViewItem.Data['ImageURL']:=AImageURL + 'logo.png'; ListViewUpdate:=False; AListViewItem.Adapter.ResetView(AListViewItem); ListViewUpdate:=True; AListViewItem:=AListView.Items.Add; AListViewItem.Data['ImageURL']:=AImageURL + '000487806d3a2ab98aeb2c47b810fc8b.jpg'; ListViewUpdate:=False; AListViewItem.Adapter.ResetView(AListViewItem); ListViewUpdate:=True; AListViewItem:=AListView.Items.Add; AListViewItem.Data['ImageURL']:=AImageURL + '0012ef6cb42e95268a4cd1d832a2b93a.jpg'; ListViewUpdate:=False; AListViewItem.Adapter.ResetView(AListViewItem); ListViewUpdate:=True; AListViewItem:=AListView.Items.Add; AListViewItem.Data['ImageURL']:=AImageURL + '0022454ccb4f81a701cb3a3c89d52d2f.jpg'; ListViewUpdate:=False; AListViewItem.Adapter.ResetView(AListViewItem); end; procedure TFormMain.ListViewUpdatingObjects(const Sender: TObject; const AItem: TListViewItem; var AHandled: Boolean); begin if Not ListViewUpdate then begin MyListViewUpdateObjects(Sender as TListView, AItem); AHandled:=True; end; end; procedure TFormMain.MyListViewUpdateObjects(const AListView: TListView; const AItem: TListViewItem); Var AName : TListItemText; AImage : TListItemImage; AvailableWidth, ImageWidth, ImageHeight : single; function SetupTextObject(const AName, AText : String; AFontSize : Single; AFontStyles : TFontStyles; AWidth, AHeight, X , Y : Single; AAlign, AVertAlign: TListItemAlign; ATextAlign, ATextVertAlign: TTextAlign) : TListItemText; begin Result:=TListItemText(AItem.View.FindDrawable(AName)); if Result=Nil then Result:=TListItemText.Create(AItem); Result.Name:=AName; Result.Width:=AWidth; Result.WordWrap:=True; Result.Font.Size:=AFontSize; Result.Font.Style:=Result.Font.Style + AFontStyles; Result.Trimming:=TTextTrimming.None; Result.Text:=AText; Result.PlaceOffset.X:=X; Result.PlaceOffset.Y:=Y; Result.Align:=AAlign; Result.VertAlign:=AVertAlign; Result.TextAlign:=ATextAlign; Result.TextVertAlign:=ATextVertAlign; Result.Height:=AHeight; end; function SetupImageObject(const AName : String; AWidth, AHeight, X , Y : Single; AAlign, AVertAlign: TListItemAlign) : TListItemImage; Var AImageURL : String; begin Result:=TListItemImage(AItem.View.FindDrawable(AName)); if Result=Nil then begin Result:=TListItemImage.Create(AItem); AImageURL:=AItem.Data['ImageURL'].AsString; Result.Bitmap:=LoadImageFromURL(AImageURL); end; Result.Name:=AName; Result.Width:=AWidth; Result.Height:=AHeight; Result.PlaceOffset.X:=X; Result.PlaceOffset.Y:=Y; Result.Align:=AAlign; Result.VertAlign:=AVertAlign; Result.ScalingMode:=TImageScalingMode.StretchWithAspect; end; begin AvailableWidth:=AListView.Width - AListView.ItemSpaces.Left - AListView.ItemSpaces.Right; // Изображение размещаем слева ImageWidth:=AvailableWidth / 3; ImageHeight:=AvailableWidth / 3; AImage:=SetupImageObject('Image', ImageWidth, ImageHeight, 0, 0, TListItemAlign.Leading, TListItemAlign.Leading); // Текст справа AName:=SetupTextObject('Name', AItem.Data['ImageURL'].AsString, 14, [], AvailableWidth - ImageWidth, ImageHeight, ImageWidth, 0, TListItemAlign.Leading, TListItemAlign.Leading, TTextAlign.Center, TTextAlign.Center); AItem.Height:=Round(ImageHeight + AListView.ItemSpaces.Top + AListView.ItemSpaces.Bottom); end; function TFormMain.LoadImageFromURL(AURL : String) : TBitmap; Var AHTTPClient : THTTPClient; AStream : TMemoryStream; HTTPResponse : IHTTPResponse; begin Result:=Nil; AHTTPClient:=THTTPClient.Create; AStream:=TMemoryStream.Create; try HTTPResponse:=AHTTPClient.Get(AURL, AStream); finally if HTTPResponse.StatusCode=200 then Result:=TBitmap.CreateFromStream(AStream); end; end; end.  
      test092 ListView with Image.7z
    • Автор: Вадим Смоленский
      Клавиша пробела в Windows по умолчанию работает как акселератор кнопки, на которой фокус. Я в своем проекте использую пробел для других целей, и эту фичу мне нужно подавить. В VCL я перехватывал нажатие пробела в обработчике события TForm.OnKeyDown - устанавливал там флаг, который потом блокировал запуск содержимого TButton.OnClick. В FireMonkey, однако, TButton.OnClick запускается по нажатию пробела, не дожидаясь TForm.OnKeyDown. Как теперь быть?
    • Автор: Вадим Смоленский
      У TBitmap есть метод ReplaceOpaqueColor, заменяющий все непрозрачные цвета на один новый, передаваемый параметром. Не могу до конца понять, как он определяет на изображении прозрачный цвет, который должен остаться прозрачным. У меня на форме хранится большой невидимый TImage с черно-белым битмэпом, из которого я беру отдельные фрагменты посредством DrawBitmap и вывожу их на маленькие TImage. Иногда мне нужно организовать цветовое выделение - то есть, например, заменить черный цвет на синий, а белый оставить белым. В этом случае как раз и помогает ReplaceOpaqueColor(claBlue): почему-то белый цвет в монохромном битмэпе он трактует как прозрачный, не меняя его. Но вот парадокс: если я предварительно заменю в исходном большом битмэпе все белые пиксели на $00000000 (то есть, как я понимаю, nil, полностью прозрачный цвет), то ReplaceOpaqueColor ведет себя противоположным образом: он меняет этот прозрачный на синий, а черный не трогает! Очень бы хотелось понять, отчего так происходит и как с этим можно бороться.
      И шире: не ломлюсь ли я в открытую дверь? Может, в FMX есть какие-то более простые и мощные способы динамично преобразовывать цвета на TImage, просто я их не обнаружил?
    • Автор: Вадим Смоленский
      TSpeedButton в старых версиях Delphi можно было снабдить четырьмя иконками (все хранились как одно изображение в свойстве Glyph) для четырех состояний кнопки: 1) неактивна, 2) активна, 3) нажата, но не отпущена, 4) остается нажатой. Я активно пользовался этой функциональностью, но сейчас ее поддержки не вижу. Теперь, судя по всему, всё делается через TImageList. Возникает два вопроса.
      1. Как наилучшим образом реализовать описанную функциональность в FMX? Должен ли я расписать всё в коде через смену ImageIndex, или же существуют некие опции, которых я не разглядел? А может быть, появились какие-то новые способы (через эффекты, фильтры и т.д.) визуально подчеркнуть состояние кнопки? Мне всего-то и нужно, что менять цвет одноцветного символа на кнопке (серый, черный, фиолетовый, красный).
      2. Растровое изображение, подгруженное из TImageList, автоматически масштабируется по размерам контрола и выглядит слегка размытым. Мне же хотелось бы видеть на кнопке оригинальный битмэп в исходных размерах, с четкими линиями. Есть ли способ отключить масштабирование?
    • Автор: Вадим Смоленский
      Перевожу большой проект из VCL в FMX. В ходе запуска на главном окне много чего рисуется и выравнивается; соответствующий код записан в FormShow. Пока всё не отработало, показывается заставка, splash window. В конце, как и положено, запускается Application.Run, на экране появляется готовая главная форма, а заставка убивается Под VCL всё это выглядело именно так. Под FMX же главная форма выводится на экран в самом начале отрисовки, вместе с заставкой, и пользователь вынужден наблюдать всю отрисовку в режиме реального времени, с мельканиями и дерганиями. Как подавить этот преждевременный вывод?
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу