Подклассы Windows в Borland C ++ Builder - PullRequest
2 голосов
/ 09 февраля 2009

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

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

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

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

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

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

Из того, что я понимаю, проблема в том, что когда вы выполняете "new TForm ()", автоматически создается новое окно, прежде чем вы сможете его остановить. Таким образом, замена WindowProc работает НО нежелательное окно TForm перемещается по экрану без толку !!!!

Ответы [ 2 ]

1 голос
/ 11 февраля 2009

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

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

1 голос
/ 10 февраля 2009

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

РЕДАКТИРОВАТЬ: больше ответов, на основе более подробной информации

Чтобы new TForm не создавал окно, бесполезно плавающее по экрану, вам просто нужно установить для его свойства Visible значение false. В качестве альтернативы вы можете переопределить 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, но тем не менее он гибок.

...