Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не отображается контрол, ShowWindow с SW_SHOWNOACTIVATE 
:(
    Опции темы
Romero
Дата 16.5.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.6.2005

Репутация: 1
Всего: 1



Использую компонент THTMLLite (http://www.pbear.com/).
Для отображения формы окна без перехвата фокуса работает данный код:
Код

  ShowWindow(MessageForm.Handle,SW_SHOWNOACTIVATE);
  ShowWindow(MessageForm.Panel.Handle,SW_SHOWNOACTIVATE);
  ShowWindow(MessageForm.html.Handle,SW_SHOWNOACTIVATE);
  SystemParametersInfo(SPI_GETWORKAREA,0,@WRect,0);
  SetWindowPos(MessageForm.Handle,HWND_TOPMOST,WRect.Right-MessageForm.Width,
    WRect.Bottom-MessageForm.Height,0,0,SWP_NOSIZE or SWP_NOACTIVATE);

Все контролы отображаются, а html (THTMLLite) - не хочет. При этом, когда раньше на его месте стоял RichEdit, то отображалось по этой же схеме все отлично.
Подозреваю, что у недавно принятого мной к использованию компонента неадекватная реакция на ShowWindow (или вообще ее нет), но мозгов не хватает, чтобы это вылечить.
Быть может, уважаемые профи сумеют найти причину такого поведения? Другой способ отображения без активации окна и его контролов вряд-ли найдется (в свое время, когда его искал, все перерыл). А другой компонент для отображения HTML можете и посоветовать - авось, с ним фокус пройдет.

Это сообщение отредактировал(а) Romero - 16.5.2008, 13:36
PM   Вверх
Poseidon
Дата 16.5.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Цитата(Romero @  16.5.2008,  13:34 Найти цитируемый пост)
А другой компонент для отображения HTML можете и посоветовать - авось, с ним фокус пройдет.
В чем ВебБраузер не угадил?



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Rennigth
Дата 16.5.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 8
Всего: 76



Romero, А почему Visible ему не хочешь сделать? Все равно же у тебя VCL...

Добавлено через 54 секунды
Цитата(Romero @  16.5.2008,  13:34 Найти цитируемый пост)
отображения формы окна без перехвата фокуса

или для этого?


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Romero
Дата 16.5.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.6.2005

Репутация: 1
Всего: 1



А его реально сжать по высоте отображенного контента? А отрубить системное контекстное меню?
Дело в том, что мне необходимо только отобразить строку с HTML-содержимым, полноценный браузер категорически не нужен. Плюс сжатие по высоте - в HTMLLite научился делать.
PM   Вверх
MetalFan
Дата 16.5.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



при использовании WinApi применительно к VCL контролам надо отдавать отчет, что может произойти "рассинхронизация" состояний WinApi и VCL контролов. что может привести к странному поведению оных


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Romero
Дата 18.5.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.6.2005

Репутация: 1
Всего: 1



Rennigth, просто визибл менять не катит, нужно отображение без активизации.

Рассинхронизации не наблюдалось при использовании RichEdit - работало как часы. Думаю, HTMLLite просто как-то неправильно обрабатывает сообщение показа окна. В исходниках порылся - ничего не разглядел, что могло бы повлиять. Быть может, кто-то глянет в сырцы и скажет, чего не хватает или где лишнее?

MetalFan, есть предложения, как выполнить ту же задачу (отображение окна программы без перехвата фокуса) без применения WinAPI к VCL?
PM   Вверх
Romero
Дата 18.5.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.6.2005

Репутация: 1
Всего: 1



Хм, обнаружил интересный факт.
Форма, на которой лежит HTMLLite, - не основная, и она не отображается изначально при запуске приложения. То есть, не рисуется, пока я ее не вызову вышеописанным способом.
Так вот, если сначала я для этой формы вызываю Show и Hide, то далее она отображается нужным способом, HTMLLite становится видимым, причем даже каждый компонент отдельно показывать не надо. Выходит, что сначала компоненту нужно прорисоваться (или что он там делает при вызове метода Show для формы его содержащей), а дальше он сможет быть скрыт и показан без проблем.
Как отловить, какое именно действие, совершаемое при Show, помогает? Не "моргать" же мне формой при запуске приложения, чтобы затем корректно ее отображать.
PM   Вверх
Romero
Дата 2.6.2008, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.6.2005

Репутация: 1
Всего: 1



Чтож, если нет предложений, буду поступать именно так.
PM   Вверх
Rrader
  Дата 3.6.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



У этого компонента есть своя спецификация в отображении. Попробуй:
Код

Var
  WRect: TRect;
  I: Integer;
Begin
  ShowWindow(MessageForm.Handle, SW_SHOWNOACTIVATE);
  ShowWindow(MessageForm.Panel.Handle, SW_SHOW);
  { Сам HTMLLite }
  ShowWindow(MessageForm.Html.Handle, SW_SHOW);
  { "Children" }
  For I := 0 To MessageForm.Html.ControlCount - 1 Do
    If (MessageForm.Html.Controls[I] Is TWinControl)
    And (MessageForm.Html.Controls[I].ClassName <> 'T32ScrollBar')
    And (MessageForm.Html.Controls[I].ClassName <> 'TScrollBar') Then
      ShowWindow((MessageForm.html.Controls[I] As TWinControl).Handle,
        SW_SHOW);
  SystemParametersInfo(SPI_GETWORKAREA, 0, @WRect, 0);
  SetWindowPos(MessageForm.Handle, HWND_TOPMOST, WRect.Right - MessageForm.Width,
    WRect.Bottom - MessageForm.Height, 0, 0, SWP_NOSIZE Or SWP_NOACTIVATE);

Тут важно вот что: если в твоей программе скроллбары точно не требуются и не появятся, то при показе в цикле их нужно исключать, иначе они будут отображены при любом раскладе. Но если они нужны, то проверки надо убрать.
P. S.
Для контролов флаг SW_SHOWNOACTIVATE можно заменить на SW_SHOW


Это сообщение отредактировал(а) Rrader - 3.6.2008, 13:23


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1204 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.