Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

HWND -> PControl [Delphi, Windows]


vampir_infernal ©   (2006-10-10 14:59:00) 

Матчасть: Delphi 2005 Upd 3 + KOL 2.39.1, WinXP SP2;
Проблема: Существует окно "чужого" приложения, есть его handle, полученный из FindWindow. Необходимо наследовать свое окно от него с использованием чистого KOL, по аналогии с CreateParented(ParentWin: HWND) из VCL. Перерыл весь KOL.pas, нашел наследование только от PControl.
Вопрос: как привести handle к типу PControl ( PControl(ParentWin) не помогает)? если есть другие варианты подобного наследования, с удовольствием их выслушаю.


alex3   (2006-10-12 22:26:00) [1]

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


Barloggg   (2006-10-12 09:00:00) [2]

ну да, хозяин Lister. правильно.
я это и имел ввиду.
плагин Speller'а работает и нормально работает. правда двигать окно листера мне как-то в голову даже не приходило...


alex3   (2006-10-11 21:53:00) [3]

>и в углу экрана мое окно без заголовка
коряво отрабатываются координаты окна,
мне так кажется, что коодината Left не правильно
пересчитывается (позиция на форме - позиция на экране).
При постоянном обновлении (перерисовки), и перемещении хозяина, внедренное окно ездит форме, причем top остается прежним.
Иногда бывает мерцание- внедренная форма рисуется в двух
местах, вызывается перемещением формы хозяина по экрану.
При изменении любой координаты внедренной формы рушатся все
остальные координаты. Измените хотя бы одну, и прочитайте все
остальные, получится очень интересно.
P.S.
Форма хозяин не TotalCommander (в моем случае).


vampir_infernal   (2006-10-11 16:44:00) [4]

спасибо. признаюсь, не правильно выразил мысль.


Barloggg   (2006-10-11 09:04:00) [5]

ха. это не наследование.
это использование даного тебе хендла как родителя.

с помощью KOL плагин с тоталкомандеру сделал Speller. спроси у него тонкости реализации.
здесь: http://speller.narod.ru/


vampir_infernal   (2006-10-10 21:12:00) [6]

Мне известны все параметры, используемые при создании "чужого" окна, то есть имя класса, стили, шрифты. Для ясности поясню, что "чужое" окно - это окно Lister в TotalCommander (а мое окно - плагин к нему).
С помощью GetWindowLong я получаю его оконную процедуру, перекрываю ее. Работает. Но необходимо именно наследовать от него. Писал на VCL - появлялось окно с заголовком и меню листера и моей формой вместо рабочей области (то, что нужно). Пишу на KOL, появляется окно листера и в углу экрана мое окно без заголовка. Пока что склоняюсь к ручной подгонке моего окна под координаты окна листера с соответсвующей обработкой сообщений.


Barloggg   (2006-10-10 17:59:00) [7]

е это не то. хедл это лишь адрес, где хранятся данные.

а обращение к скажем процедуре canvas.fillrect означает выхов функции которая должна находиться скажем +15 байт от координат этого хендла.
и если все правильно, то там действительно оказывается нужная нам инфа.

а если это не канвас, а что-то другое, то мы получаем access violation или нечто подобное.

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

но если у тебя есть несостыковка в структуре, то будет (|). а может быть даже (___|___).
вот так-то.

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


vampir_infernal   (2006-10-10 15:51:00) [8]

По хэндлу окна можно получить о ней очень много данных, вплоть до ее оконной процедуры.
Становится непонятным то, что такое наследование свободно применяется в VCL. Похоже, придется запастись временем и окунуться в мир Source\vcl. :(


Barloggg   (2006-10-10 15:21:00) [9]

никак.

чтобы чего-нибудь от чего-нибудь наследовать надо знать про него все, а не только хендл.

максимум что ты можешь сделать это прицепиться к его хендлу и положить свой компонент на него (возможно)

а вот если у тебя есть полная конструкция класса (исходник), тогда другой разговор, тогда кое-что можно сделать. в принципе.


Наверх

Титульная страница Поиск, карта сайта Написать письмо