![]() |
|
|
![]()
|
|
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 6 Всего: 24 |
Всем доброго здравия желаю!
Кто-нибудь может четко, простым русским языком, объяснить, что есть "Application->Handle", и что есть, скажем, "Form1->Handle"? В каких случаях следует создавать карту сообщений (макросами BEGIN_MESSAGE_MAP, MESSAGE_HANDLER, END_MESSAGE_MAP), написав соответствующие обработчики, а в каких - воспользоваться событием TApplicationEvents::OnMessage? Какие, вообше говоря, сообщения могут отлавливаться последним? Часто использую и то, и другое, но глубокого понимания сего, к сожалению, нет. -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 7 Всего: 67 |
тов. Архангельский А.Я. по этому поводу ничего не пишет?....
я лично представляю себе, что Form->Handle есть дескриптор одного из окон приложения.... Application->Handle - дескриптор потока,связанного с приложением... -------------------- СУВ, Partizan. |
|||
|
||||
| BreakPointMAN |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 6 Всего: 24 |
Боюсь, что у тов. Архангельского А.Я. не очень хорошее представление об обработке сообщений Windows... Не далее, как пару дней назад, в книге "Приемы программирования в C++ Builder. Механизмы Windows, сети" © А.Я. Архангельский, М.А. Тагин обнаружил ряд грубых ошибок. Кстати, эти же ошибки замечены в "Русских справках по C++ Builder" тех же авторов. Даже не хочется думать, насколько будет корректной работа программы (и самой ОС в целом), если пишущий ее программист последует рекомендациям в книге. К примеру, в книге (см. 3.11) рассматривается работа с буфером обмена, а точнее, перехват событий буфера обмена Windows. Фрагмент заголовочного файла:
Файл реализации:
Уже на стадии описания карты сообщений тов. Архангельский сделал непростительную ошибку - в качестве второго параметра макроса MESSAGE_HANDLER для сообщения Windows WM_CHANGECBCHAIN использовал тип структуры TWMNoParams, ну и, естественно, тот же тип был использован в качестве типа параметра обработчика OnCHANGECBCHAIN. Как известно, TWMNoParams - тип сообщений Windows без параметров, т.е. тов. Архангельский попросту проигнорировал ту информацию, которая передается вместе с сообщением. А вместе с этим сообщением передается дескриптор закрываемого окна (в wParam) и дескриптор окна, следующего за закрываемым (в lParam). Эти данные нужны программе для того, чтобы корректно отреагировать на изменения в цепочке окон просмотра буфера обмена и скорректировать в случае необходимости указатель на следующее окно цепочки (Hclb в примере), если будет удалено окно, непосредственно следующее за данным. Что, конечно, совершенно не делается в данном обработчике и, мало того, нужная информация не передается по цепочке дальше. Вместо этого тов. Архангельский напихал везде нули:
Надо сказать, что подобных ляпов в книге (и в справках) много. Это сообщение отредактировал(а) BreakPointMAN - 11.3.2006, 14:11 -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||||
|
|||||||
| Ctrl_Alt_Del |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 11.3.2006 Где: Ставрополь Репутация: 2 Всего: 2 |
Application->Handle - дескриптор процесса. Form1->Handle - дескриптор окна. Чаще сообщения отправляются все же окну. ИМХО удобнее юзать карту сообщений. P.S. Архангельский тоже человек и ему свойственно ошибаться. |
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 6 Всего: 24 |
Думаю, что нет... В таком случае меня смущают несколько вещей: 1) есть WinAPI-функция GetWindow. Если первым её параметром указать дескриптор окна, а вторым - GW_OWNER, то функция вернет дескриптор окна-владельца либо NULL, если такого не существует. Так вот, если передать в эту функцию дескриптор любой формы (например, Form1->Handle) и указать в качестве второго параметра GW_OWNER, то функция вернет значение, равное Application->Handle; 2) есть WinAPI-функция SetWindowPos, которая изменяет размеры, позицию, положения окна в Z-последовательности и т.д., если ей передать дескриптор соответствующего окна. Если Application->Handle - не дескриптор окна, а дескриптор процесса, то почему при вызове:
в левом верхнем углу экрана появляется окошко размером 100x100? Процесс ведь не должен вести себя как окно? -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| Ctrl_Alt_Del |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 11.3.2006 Где: Ставрополь Репутация: 2 Всего: 2 |
BreakPointMAN, sorry.
Все как всегда, надо было просто в хелп заглянуть. TApplication::Handle
Дескриптор главного окна приложения. |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |