Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка сообщений Windows, средствами C++ Builder'а 
:(
    Опции темы
BreakPointMAN
Дата 10.3.2006, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем доброго здравия желаю! smile

Кто-нибудь может четко, простым русским языком, объяснить, что есть "Application->Handle", и что есть, скажем, "Form1->Handle"? В каких случаях следует создавать карту сообщений (макросами BEGIN_MESSAGE_MAP, MESSAGE_HANDLER, END_MESSAGE_MAP), написав соответствующие обработчики, а в каких - воспользоваться событием TApplicationEvents::OnMessage? Какие, вообше говоря, сообщения могут отлавливаться последним? Часто использую и то, и другое, но глубокого понимания сего, к сожалению, нет. smile Хелп читал. Все равно остается много вопросов...



--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Partizan
Дата 11.3.2006, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



тов. Архангельский А.Я. по этому поводу ничего не пишет?....

я лично представляю себе, что Form->Handle есть дескриптор одного из окон приложения....
Application->Handle - дескриптор потока,связанного с приложением...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
BreakPointMAN
Дата 11.3.2006, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Partizan @ 11.3.2006, 01:27 Найти цитируемый пост)
тов. Архангельский А.Я. по этому поводу ничего не пишет?....

Боюсь, что у тов. Архангельского А.Я. не очень хорошее представление об обработке сообщений Windows... Не далее, как пару дней назад, в книге "Приемы программирования в C++ Builder. Механизмы Windows, сети" © А.Я. Архангельский, М.А. Тагин обнаружил ряд грубых ошибок. Кстати, эти же ошибки замечены в "Русских справках по C++ Builder" тех же авторов. Даже не хочется думать, насколько будет корректной работа программы (и самой ОС в целом), если пишущий ее программист последует рекомендациям в книге.

К примеру, в книге (см. 3.11) рассматривается работа с буфером обмена, а точнее, перехват событий буфера обмена Windows.

Фрагмент заголовочного файла:
Код

class TForm1 : public TForm
{
...
private:
  void __fastcall OnDRAWCLIPBOARD(TWMNoParams& Message);
  void __fastcall OnCHANGECBCHAIN(TWMNoParams& Message);
public:
  __fastcall TForm1(TComponent* Owner);
  BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_DRAWCLIPBOARD, TWMNoParams,
                    OnDRAWCLIPBOARD)
    MESSAGE_HANDLER(WM_CHANGECBCHAIN, TWMNoParams,
                    OnCHANGECBCHAIN)
  END_MESSAGE_MAP(TComponent)
};


Файл реализации:
Код

#include <vcl\Clipbrd.hpp>

HWND Hclb;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
 Hclb = SetClipboardViewer(Handle);
}
//---------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
 ChangeClipboardChain(Handle, Hclb);
}
//---------------------------------------------------------
void __fastcall TForm1::OnDRAWCLIPBOARD(TWMNoParams& a)
{
 RichEdit1->Visible = false;
 Image1->Visible = false;

 try
 {
  if (Clipboard()->HasFormat(CF_BITMAP))
  {
   Image1->Picture->LoadFromClipboardFormat(CF_BITMAP,
                   Clipboard()->GetAsHandle(CF_BITMAP), 0);
   Image1->Visible = true;
  }
  else
   if (Clipboard()->HasFormat(CF_TEXT))
   {
    RichEdit1->Text = Clipboard()->AsText;
    RichEdit1->Visible = true;
   }
 }
 catch (...)
 {
  SendMessage(Hclb, WM_DRAWCLIPBOARD, 0, 0);
 }
}
//---------------------------------------------------------

void __fastcall TForm1::OnCHANGECBCHAIN(TWMNoParams& a)
{
 SendMessage(Hclb, WM_CHANGECBCHAIN, 0, 0);
}


Уже на стадии описания карты сообщений тов. Архангельский сделал непростительную ошибку - в качестве второго параметра макроса MESSAGE_HANDLER для сообщения Windows WM_CHANGECBCHAIN использовал тип структуры TWMNoParams, ну и, естественно, тот же тип был использован в качестве типа параметра обработчика OnCHANGECBCHAIN. Как известно, TWMNoParams - тип сообщений Windows без параметров, т.е. тов. Архангельский попросту проигнорировал ту информацию, которая передается вместе с сообщением. А вместе с этим сообщением передается дескриптор закрываемого окна (в wParam) и дескриптор окна, следующего за закрываемым (в lParam). Эти данные нужны программе для того, чтобы корректно отреагировать на изменения в цепочке окон просмотра буфера обмена и скорректировать в случае необходимости указатель на следующее окно цепочки (Hclb в примере), если будет удалено окно, непосредственно следующее за данным. Что, конечно, совершенно не делается в данном обработчике и, мало того, нужная информация не передается по цепочке дальше. Вместо этого тов. Архангельский напихал везде нули:

Код

SendMessage(Hclb, WM_CHANGECBCHAIN, 0, 0);

Надо сказать, что подобных ляпов в книге (и в справках) много.

Это сообщение отредактировал(а) BreakPointMAN - 11.3.2006, 14:11


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Ctrl_Alt_Del
Дата 12.3.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(BreakPointMAN @ 10.3.2006, 22:59)
Всем доброго здравия желаю!  smile

Кто-нибудь может четко, простым русским языком, объяснить, что есть "Application->Handle", и что есть, скажем, "Form1->Handle"? В каких случаях следует создавать карту сообщений (макросами BEGIN_MESSAGE_MAP, MESSAGE_HANDLER, END_MESSAGE_MAP), написав соответствующие обработчики, а в каких - воспользоваться событием TApplicationEvents::OnMessage? Какие, вообше говоря, сообщения могут отлавливаться последним? Часто использую и то, и другое, но глубокого понимания сего, к сожалению, нет.  smile  Хелп читал. Все равно остается много вопросов...

Application->Handle - дескриптор процесса.
Form1->Handle - дескриптор окна.
Чаще сообщения отправляются все же окну. ИМХО удобнее юзать карту сообщений.

P.S. Архангельский тоже человек и ему свойственно ошибаться.
PM MAIL ICQ   Вверх
BreakPointMAN
Дата 17.3.2006, 04:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Defucker @ 12.3.2006, 16:13 Найти цитируемый пост)
Application->Handle - дескриптор процесса.

Думаю, что нет... В таком случае меня смущают несколько вещей:

1) есть WinAPI-функция GetWindow. Если первым её параметром указать дескриптор окна, а вторым - GW_OWNER, то функция вернет дескриптор окна-владельца либо NULL, если такого не существует. Так вот, если передать в эту функцию дескриптор любой формы (например, Form1->Handle) и указать в качестве второго параметра GW_OWNER, то функция вернет значение, равное Application->Handle;

2) есть WinAPI-функция SetWindowPos, которая изменяет размеры, позицию, положения окна в Z-последовательности и т.д., если ей передать дескриптор соответствующего окна. Если Application->Handle - не дескриптор окна, а дескриптор процесса, то почему при вызове:

Код

SetWindowPos((HWND)Application->Handle,(HWND)NULL,0,0,100,100,(UINT)HWND_TOP);


в левом верхнем углу экрана появляется окошко размером 100x100? Процесс ведь не должен вести себя как окно?



--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Ctrl_Alt_Del
Дата 17.3.2006, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



BreakPointMAN, sorry.
Все как всегда, надо было просто в хелп заглянуть.

TApplication::Handle
Цитата

Provides access to the window handle of the main form (window) of the application.


Дескриптор главного окна приложения.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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