Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Resize

26K
12 марта 2008 года
angel2c
32 / / 29.11.2007
событие Resize возникает при малейшем изменении размера формы!
подскажите, как узнать, что пользователь прекратил изменять размер окна?
1
12 марта 2008 года
kot_
7.3K / / 20.01.2000
Цитата: angel2c
событие Resize возникает при малейшем изменении размера формы!
подскажите, как узнать, что пользователь прекратил изменять размер окна?


Когда событие Resize перестанет возникать :)
Ну как ты можешь еще это узнать подругому? Выдавай ему окошко с вопросом - "Ты уже кончил?" :)

268
12 марта 2008 года
Михаил
587 / / 25.06.2005
выставь таймер при срабатывании которого можно сказать что изменение размера прекратилось
26K
12 марта 2008 года
angel2c
32 / / 29.11.2007
kot_, а ты иногда добрый))

дело в том, что в событии resize у меня находится refresh, и при изменении размера форма перерисовывается... так вот хотелось бы, чтобы она перерисовалась один раз в конце, когда пользователь прекратит изменять размер..

таймер тоже не годится, хотя бы из соображений о том, как выбрать оптимальное время - если маленькое, то пользователь не успеет "подобрать" нужный размер окна, если большое, то при малом изменении придётся ещё и ждать - тоже не есть хорошо.

могу лишь сказать, что я работаю за более менее новым компом - и здесь всё в порядке - refresh происходит тогда, когда я отпускаю кнопку мыши, закончив менять размер окна. но на другом компе (ему лет 7) вот такой глюк.

можно ли как-то отловить отпускание кнопки мыши на границе формы?
1
12 марта 2008 года
kot_
7.3K / / 20.01.2000
Цитата: angel2c
kot_, а ты иногда добрый))

дело в том, что в событии resize у меня находится refresh, и при изменении размера форма перерисовывается... так вот хотелось бы, чтобы она перерисовалась один раз в конце, когда пользователь прекратит изменять размер..

таймер тоже не годится, хотя бы из соображений о том, как выбрать оптимальное время - если маленькое, то пользователь не успеет "подобрать" нужный размер окна, если большое, то при малом изменении придётся ещё и ждать - тоже не есть хорошо.

могу лишь сказать, что я работаю за более менее новым компом - и здесь всё в порядке - refresh происходит тогда, когда я отпускаю кнопку мыши, закончив менять размер окна. но на другом компе (ему лет 7) вот такой глюк.

можно ли как-то отловить отпускание кнопки мыши на границе формы?


В таком случае необходимо обрабатывать событие нажатия кнопки. Например нажатие кнопки мыши - проверить границы формы - и если нужно установить флаг - отпускание - соответственно флаг сбросить и перерисовать. Можно кстати даже границы не проверять - просто устанавливать и сбрасывать флаг - а перерисовку выполнять только по отжатию кнопки мыши.
З.Ы. Ну да в душе я добрый ))

26K
13 марта 2008 года
angel2c
32 / / 29.11.2007
да я так делал, но почему-то OnMouseDown и OnMouseUp не работают на границе формы! я подумал, что, может, для границ нужно что-то другое.. но что?
как можно отследить нажатия кнопок мыши, когда курсор уже не обычная стрелочка (когда на форме), а растягивающий?
11
13 марта 2008 года
oxotnik333
2.9K / / 03.08.2007
The WM_SIZE message is sent to a window after its size has changed.
16K
13 марта 2008 года
iRain
72 / / 12.03.2008
Когдато, давно впапочке Example видел прогу которая следит за работай мышки не зависимо от ее местонахождения. Показывала координады мыши на экране и какие клавиши нажимаются.
26K
14 марта 2008 года
angel2c
32 / / 29.11.2007
я никогда не пользовался message_handler, возможно, поэтому не получилось. я сделал так: в хедер добавил:
 
Код:
protected:
    void __fastcall WMSize(TWMSize &Message);
BEGIN_MESSAGE_MAP
 MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize)
END_MESSAGE_MAP(TForm)


а вместо Resize:
 
Код:
void __fastcall TMDIChild::WMSize(TWMSize &Message)
{
 Refresh();
}


но результат тот же! даже хуже.. теперь помимо глюка с изменением размера окна появились глюки при нажатии на стандартные кнопки окна свернуть/развернуть - при развёртке на полный экран размеры становятся почему-то больше размеров родительского окна (но с этим я справился), а при восстановлении в начальный размер окно рефрешится два раза (!) - сначала с непонятными размерами, потом с нормальными. вот такая лажа:( скажите, как же быть? как отслеживать работу мышки над границей формы?
1
15 марта 2008 года
kot_
7.3K / / 20.01.2000
Цитата: angel2c
я никогда не пользовался message_handler, возможно, поэтому не получилось. я сделал так: в хедер добавил:
 
Код:
protected:
    void __fastcall WMSize(TWMSize &Message);
BEGIN_MESSAGE_MAP
 MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize)
END_MESSAGE_MAP(TForm)


а вместо Resize:
 
Код:
void __fastcall TMDIChild::WMSize(TWMSize &Message)
{
 Refresh();
}


но результат тот же! даже хуже.. теперь помимо глюка с изменением размера окна появились глюки при нажатии на стандартные кнопки окна свернуть/развернуть - при развёртке на полный экран размеры становятся почему-то больше размеров родительского окна (но с этим я справился), а при восстановлении в начальный размер окно рефрешится два раза (!) - сначала с непонятными размерами, потом с нормальными. вот такая лажа:( скажите, как же быть? как отслеживать работу мышки над границей формы?


Ну честно слово - а потом говорите что медератор злой :)
В папке Examples и справке вы можете найти массу полезного - было бы желание. На пример - по вашей проблеме во-первых вы определитесь - чего надо - сообщение изменения размеров обрабатывать или всетаки нажатие мыши? Я думаю, по крайней мере если вы пытаетесь реализовать алгоритм который предложил я - то нажатия мышы. Так как нас не интересуют нажатия мыши в пределах формы и нажатия правой кнопки - то надо обработать два сообщения - WM_NCLBUTTONUP и WM_NCLBUTTONDOWN, это сообщения которые посылает система окну при нажатии(отпускании) кнопки на границе окна. Делается это так:
Определяем функцию которая будет это все обрабатывать и цикл обработки:
[highlight=cpp]
#difine MY_BEGIN_RESIZE 1
#difine MY_END_RESIZE 0
...

private:
int FlagResize;
void __fastcall SetRelFlagResize(TMessage& Msg);
public:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_NCLBUTTONUP,TMessage,SetRelFlagResize)
MESSAGE_HANDLER(WM_NCLBUTTONDOWN,TMessage,SetRelFlagResize)
END_MESSAGE_MAP(TForm)
__fastcall TfmMain(TComponent* Owner);
...
[/highlight]
Потом реализуем
[highlight=cpp]
__fastcall TfmMain::TfmMain(TComponent* Owner)
: TForm(Owner)
{
FlagResize = MY_END_RESIZE;
}
void __fastcall TfmMain::SetRelFlagResize(TMessage &Msg){
switch(Msg.Msg){
case WM_NCLBUTTONDOWN:{
FlagResaze = MY_BEGIN_RESIZE;
break;
}
case WM_NCLBUTTONUP:{
if(FlagResize){
FlagResaze = MY_END_RESIZE;
...
}
break;
}
}
}
[/highlight]
Остальное доработать я думаю труда не составит?

1
15 марта 2008 года
kot_
7.3K / / 20.01.2000
И не забудьте добавить в конце функции обработки сообщений
 
Код:
TForm::Dispatch(&Msg);
26K
19 марта 2008 года
angel2c
32 / / 29.11.2007
kot_, спасибо за то, что сейчас на мои вопросы-просьбы отвечаешь не крупным красным текстом, а так)))
но почему-то сообщения WM_NCLBUTTONUP и WM_NCLBUTTONDOWN обрабатываются только при двойном клике мышью на границе... согласно твоему примеру я смог исправить глюки с WM_SIZE, но проблема не решилась - форма по-прежнему перерисовывалась при миллиметровом движении мыши.
я склоняюсь думать, что это либо такая дикая зависимость от ОС (но как от этого избавиться?), либо специфика MDI приложений.. этого я ещё не успел проверить, потому что за компом, на котором прога глючит, бываю редко.
если есть ещё какие-нибудь предложения, буду признателен.
1
19 марта 2008 года
kot_
7.3K / / 20.01.2000
Цитата: angel2c
kot_, спасибо за то, что сейчас на мои вопросы-просьбы отвечаешь не крупным красным текстом, а так)))
но почему-то сообщения WM_NCLBUTTONUP и WM_NCLBUTTONDOWN обрабатываются только при двойном клике мышью на границе... согласно твоему примеру я смог исправить глюки с WM_SIZE, но проблема не решилась - форма по-прежнему перерисовывалась при миллиметровом движении мыши.
я склоняюсь думать, что это либо такая дикая зависимость от ОС (но как от этого избавиться?), либо специфика MDI приложений.. этого я ещё не успел проверить, потому что за компом, на котором прога глючит, бываю редко.
если есть ещё какие-нибудь предложения, буду признателен.


Попробуйте установить свойства окна как неперерисовываемое, кроме того - может дело все же не в злобной ОС :) скорей всего ошибки в коде.

 
Код:
SetWindowPos(hWnd,HWND_TOP,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOREDRAW);
26K
19 марта 2008 года
angel2c
32 / / 29.11.2007
спасибо! завтра же попробую!
про ОС.. а что мне остаётся думать, когда за одним компом всё ок, а за другим пипец?!
p.s. и откуда вы всё это берёте?! ни SetWindowPos, ни WM_NCLBUTTONUP у меня даж в хэлпах нету..
1
20 марта 2008 года
kot_
7.3K / / 20.01.2000
Цитата: angel2c
спасибо! завтра же попробую!
про ОС.. а что мне остаётся думать, когда за одним компом всё ок, а за другим пипец?!
p.s. и откуда вы всё это берёте?! ни SetWindowPos, ни WM_NCLBUTTONUP у меня даж в хэлпах нету..


У нас специальные хелпы. только для избранных компании M$ и Borland делают специальные выпуски. :)
А если серьезно - то описание функций вы можете находить в MSDN - по ссылке http://msdn2.microsoft.com/en-us/library
или в разделе борландовской справки который называется Windows SDK - но лучше пользоваться вариантом от майкрософт - справка борланда уже изрядно устарела.

26K
20 марта 2008 года
angel2c
32 / / 29.11.2007
kot_, спасибо! много нового я узнал в этой теме.
но всё-таки я настаиваю на зависимости от ОС! вот элементарный пример: на форме рисуется что-либо, а в Resize только Refresh - ничего особенного, но на "старом" компе ежемиллисекундная перерисовка! разве это нормально?! разве в коде дело?
теперь логичнее вопрос задать так - как избавиться от этой зависимости? или как узнать параметры ОС, в которой программа нормально работает?
26K
21 марта 2008 года
angel2c
32 / / 29.11.2007
"Кто виноват - программист или Билл Гейтс - вопрос извечный. Конечно, Билл Гейтс - негодяй, но ждать от него милости бесполезно. Поэтому надо использовать функции, которые работают везде, или описать параметры системы, в которых программа работает" (с: мой начальник)

но ведь Resize-Refresh описываются в учебнике для начинающих! если это не везде работает, что я-то могу??:(
1
21 марта 2008 года
kot_
7.3K / / 20.01.2000
Для того, что бы ответить на извечный вопрос кто виноват - надо хотябы видеть что вы делаете. Потому как в 99% случаев в которых виноватым делали Б.Гейтся - основной проблемой оказалось отсутсвие драйвера для прямых рук в системе. Немного подавляющая статистика - не так ли? ОС от майкрософт имеют свои не достатки - и их не мало - но прежде чем вы с ними реально столкнетесь - пройдет времени не мало. Так что или документированный код в студию - или я закрою тему потому как последние сообщения - это флейм не о чем.
26K
27 марта 2008 года
angel2c
32 / / 29.11.2007
да тут не в коде дело.. создайте новое пустое приложение и в OnPaint напишите:
 
Код:
Canvas->Rectangle(10, 10, Form->Left + Form->ClientWidth - 10, Form->Top + Form->ClientHeight - 10);

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

а подскажите, пожалуста, почему дочернее MDI окно при перекрытии другим любым окном теряет то, что на ней нарисовано? а точнее на нем отпечатывается картинка перекрывающего окна.. :confused: то есть если посмотреть на то место дочернего окна, которое было перекрыто, при этом не делая его активным. в простом приложении (не MDI) такого не было..
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог