2009-02-09 3 views
2

Мы пытаемся преобразовать часть кода C++, написанную в MFC, которая использует метод CWnd.SubclassWindow, в код Borland C++ Builder. Кто-нибудь знает, как делать подклассы (подкласс с объектом TForm) - мы полностью застряли. Любые указатели будут высоко оценены! ТИА!Подкласс Windows в Borland C++ Builder

Особенность:

У нас есть существующий базовый класс написано на Borland C++, который унаследован от TForm, который используется, чтобы дать все формы, наследуемые от него определенного внешнего вида (он обрабатывает WM_NCPAINT и WM_NCHITTESTheavily, например,).

Теперь мы хотели бы использовать этот код, чтобы формы, написанные на других языках (MSVC++/MFC и C#, если быть точным), выглядели одинаково.

Вместо того, чтобы переписывать весь код, мы думали, что использование подкласса Windows будет отличной идеей. Затем мы могли бы заполнить весь существующий и протестированный код в DLL, а затем просто называть его hWnd, и это окно автоматически получит новый внешний вид.

Точно, почему это так невозможно, я не могу сказать, что я сам не кодирую сам Borland C++. Я написал заглушку в MFC всего за несколько минут, чтобы показать разработчикам Borland C++ то, что я хотел, и они потратили дни, пытаясь имитировать метод MFC CWnd :: SubclassWindow без успеха.

Исходя из того, что я понимаю, проблема в том, что когда вы делаете «новый TForm()», новое окно автоматически создается, прежде чем у вас есть шанс остановить его. Итак, заменив затем WindowProc работает НО, но нежелательное окно TForm плавает вокруг на экране, чтобы не использовать !!!!

+0

Вы действительно имеете в виду OWL, который Borland должен был остановить более 10 лет назад, чтобы продать и поддержать? – mghie

+0

Ну, я думал, что это называется так ... Я только парень из M $, и я пытаюсь понять, почему эти разработчики Borland C++ не могут имитировать то, что я могу сделать с одной строкой кода в MFC .. . –

ответ

1

Предполагаю, вы имеете в виду VCL. Вы можете установить свойство WindowProc объекта TControl в свою собственную оконную процедуру или в WindowProc другого элемента управления.

EDIT: Более ответ, основанный на более специфические

Чтобы предотвратить new TForm от создания окна, чтобы плавать бесцельно вокруг экрана, вы должны просто нужно установить его Visible свойство ложным. В качестве альтернативы, вы можете переопределить CreateParams, чтобы удалить стиль WS_VISIBLE из окна:

void __fastcall TBlahForm::CreateParams(TCreateParams &Params) 
{ 
    TForm::CreateParams(Params); 
    Params.Style&=~WS_VISIBLE; 
} 
//--------------------------------------------------------------------------- 

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

Переопределение TCustomForm::CreateWnd - потенциально другой способ атаковать ту же проблему.

Моим другим предложением было бы просто перенести код из BCB в VC++. Если он делает много ошибок с WM_NCPAINT и WM_NCHITTEST, тогда это кажется маловероятным кандидатом на то, чтобы в нем было много специфических для VCL вещей - возможно, это просто ударяет прямо в Win32 API? Если там нет VCL, компиляция в VC++ должна в значительной степени просто волшебным образом работать.

В любом случае: это почти наверняка возможно. У меня есть приложение, построенное с BCB5 (которое предшествует WinXP), которое благодаря умному использованию оконных перехватчиков, подклассов и т. П. (Большинство из которых не является моим собственным) все еще отлично справляется с XP и даже с Aero (что не говорят, что это не боль для поддержания). Если это возможно, ваше приложение, безусловно, должно быть. VCL следует другой парадигме MFC, но она, тем не менее, гибкая.

+0

Я не мог передать свой ответ в 300 символов комментария, поэтому вместо этого я редактировал исходный вопрос! –

+0

Большое спасибо за ваш ответ !!! Тем не менее, я просмотрел код и перекомпилировал MSVC++, что я действительно хотел избежать. Помимо всего прочего, у него есть почти 100 небольших растровых ресурсов, которых я боюсь, что я должен добавить вручную по одному. * sigh * –

1

Посмотрите на Codegear Online Docs, в котором описывается механизм WindowProc для подкласса.

C++ Builder использует базовый Delphi VCL, поэтому поиск «подкласса Delphi Window» будет более плодотворным, чем попытка найти что-то конкретное C++. Программисты C++ Builder должны, по крайней мере, иметь возможность читать код Delphi, даже если им не нужно писать!

+0

В поисках примеров Delphi звучит отличная идея, спасибо! :-) (Пример, который вы мне прислали, не применим. Я боюсь, так как я хочу, чтобы субкассы окна, которое уже создано другим приложением, хотя и в том же процессе). –

Смежные вопросы