Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват события WM_SIZE, Не ресайзятся компоненты 
V
    Опции темы
artsb
Дата 26.2.2009, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Всем привет.

Мне необходимо знать, когда развернули форму на весь экран. Для этого перехватываю событие WM_SIZE
Код

BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_SIZE, TWMSize, OnMaximize)
END_MESSAGE_MAP

Всё работает отлично. Вот только компоненты, у которых было задано свойство Align, перестали ресайзиться при изменении размеров формы (т.е. их размер остаётся таким же, как в design-time).

Как это поправить?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
THandle
Дата 27.2.2009, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



artsb, вызывай старый обработчик сообщения. Не помню как в Билдере это делается, сейчас погуглить попробую, но в Delphi так:
Код


procedure TForm1.WMSize(var Message: TWMSize);
begin
  inherited;
end;

PM   Вверх
artsb
Дата 27.2.2009, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Я так понял, что вы говорите об
Код

inherited;


Я тоже думаю, что нужно старый обработчик вызывать, но как не помню.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Soah
Дата 27.2.2009, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



PM MAIL   Вверх
THandle
Дата 27.2.2009, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



В дополнение к Soah:
http://forum.vingrad.ru/index.php?showtopi...t&p=1726686

Хороший пост, ИМХО.

PM   Вверх
Dem_max
Дата 27.2.2009, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



artsb, 
Покажи функцию которая ведет обработку WM_SIZE


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
mrbrooks
Дата 27.2.2009, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(artsb @  27.2.2009,  00:08 Найти цитируемый пост)
Я тоже думаю, что нужно старый обработчик вызывать, но как не помню. 

DefWindowProc

Добавлено через 4 минуты и 8 секунд
Вообще-то у компонентов VCL есть свойство WindowProc и метод WndProc. Возможно их использование, а не карты событий, поможет решить проблему.
PM MAIL   Вверх
xvr
Дата 27.2.2009, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



А чем event OnResize не устроил?

PM MAIL   Вверх
mrbrooks
Дата 27.2.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(xvr @  27.2.2009,  12:10 Найти цитируемый пост)
А чем event OnResize не устроил?

 smile 
В последнее время заметил, что средства VCL при использовании VCL юзать стало не модно  smile 
PM MAIL   Вверх
artsb
Дата 27.2.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Цитата(Dem_max @  27.2.2009,  05:19 Найти цитируемый пост)
Покажи функцию которая ведет обработку WM_SIZE 

Я там просто перемещаю другую форму.

Цитата(xvr @  27.2.2009,  12:10 Найти цитируемый пост)
А чем event OnResize не устроил?

Мне нужно поймать момент, когда пользователь разворачивает окно на весь экран. В OnResize этого не получится.

Цитата(mrbrooks @  27.2.2009,  09:12 Найти цитируемый пост)
DefWindowProc

Он требует передавать в функцию TMessage, а у меня то было TWMSize.

В общем, переопределил WindowProc формы и в конце обработчика вызываю старый WindowProc. Теперь всё ОК.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
xvr
Дата 27.2.2009, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(artsb @ 27.2.2009,  20:01)
Цитата(xvr @  27.2.2009,  12:10 Найти цитируемый пост)
А чем event OnResize не устроил?

Мне нужно поймать момент, когда пользователь разворачивает окно на весь экран. В OnResize этого не получится.

Изучение сорцов показало, что у формы есть hook (проперть OleFormObject), если туда повесить соответствующий интерфейс то его OnResize будет вызываться на WM_SIZE

PM MAIL   Вверх
artsb
Дата 27.2.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Не совсем поня, куда повесить...
Да и проблема уже решена.
Но всё равно, спасибо. Если не сложно, объясните подробнее.




--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
xvr
Дата 27.2.2009, 23:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(artsb @ 27.2.2009,  23:18)
Не совсем поня, куда повесить...
Да и проблема уже решена.
Но всё равно, спасибо. Если не сложно, объясните подробнее.

Надо имплементировать интерфейс IOleForm, создать экземпляр его и присвоить в проперть OleFormObject формы.
Интерфейс этот вот:
Код

__interface INTERFACE_UUID("{CD02E1C1-52DA-11D0-9EA6-0020AF3D82DA}") IOleForm  : public IInterface 
{
    
public:
    virtual void __fastcall OnDestroy(void) = 0 ;
    virtual void __fastcall OnResize(void) = 0 ;
};

IInterface - это IUnknown:
Код

// NOTE: IInvokable is really IUnknown - with the same UUID - resolves the mangling issues
// we've been having in COM stuff
__interface INTERFACE_UUID("00000000-0000-0000-C000-000000000046") IInterface : public IUnknown
{
public:
  /** Template function to ease querying for a smart-Interface-object */
  template <typename T>
  bool __stdcall Supports(DelphiInterface<T>& smartIntf)
  {
    return QueryInterface(__uuidof(T), reinterpret_cast<void**>(static_cast<T**>(&smartIntf))) == S_OK;
  }
};

Функции собственно IUnknown можно сделать заглушками - они не используются (за исключением AddRef и Release, которые вызываются и вызовы которых можно проигнорировать)

PM MAIL   Вверх
Dem_max
Дата 28.2.2009, 07:18 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Цитата

Мне нужно поймать момент, когда пользователь разворачивает окно на весь экран. В OnResize этого не получится.

Для этих вещей имется TApplicationEvents на вкладке Additional или сообщение WM_SYSCOMMAND (SC_MAXIMIZE, SC_MINIMIZE)


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
artsb
Дата 28.2.2009, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



to xvr
Опять ничего не понял smile Видать пока, это для меня сложновато.

Dem_max, спасибо, то напомнили.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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