Resize
подскажите, как узнать, что пользователь прекратил изменять размер окна?
подскажите, как узнать, что пользователь прекратил изменять размер окна?
Когда событие Resize перестанет возникать :)
Ну как ты можешь еще это узнать подругому? Выдавай ему окошко с вопросом - "Ты уже кончил?" :)
дело в том, что в событии resize у меня находится refresh, и при изменении размера форма перерисовывается... так вот хотелось бы, чтобы она перерисовалась один раз в конце, когда пользователь прекратит изменять размер..
таймер тоже не годится, хотя бы из соображений о том, как выбрать оптимальное время - если маленькое, то пользователь не успеет "подобрать" нужный размер окна, если большое, то при малом изменении придётся ещё и ждать - тоже не есть хорошо.
могу лишь сказать, что я работаю за более менее новым компом - и здесь всё в порядке - refresh происходит тогда, когда я отпускаю кнопку мыши, закончив менять размер окна. но на другом компе (ему лет 7) вот такой глюк.
можно ли как-то отловить отпускание кнопки мыши на границе формы?
дело в том, что в событии resize у меня находится refresh, и при изменении размера форма перерисовывается... так вот хотелось бы, чтобы она перерисовалась один раз в конце, когда пользователь прекратит изменять размер..
таймер тоже не годится, хотя бы из соображений о том, как выбрать оптимальное время - если маленькое, то пользователь не успеет "подобрать" нужный размер окна, если большое, то при малом изменении придётся ещё и ждать - тоже не есть хорошо.
могу лишь сказать, что я работаю за более менее новым компом - и здесь всё в порядке - refresh происходит тогда, когда я отпускаю кнопку мыши, закончив менять размер окна. но на другом компе (ему лет 7) вот такой глюк.
можно ли как-то отловить отпускание кнопки мыши на границе формы?
В таком случае необходимо обрабатывать событие нажатия кнопки. Например нажатие кнопки мыши - проверить границы формы - и если нужно установить флаг - отпускание - соответственно флаг сбросить и перерисовать. Можно кстати даже границы не проверять - просто устанавливать и сбрасывать флаг - а перерисовку выполнять только по отжатию кнопки мыши.
З.Ы. Ну да в душе я добрый ))
как можно отследить нажатия кнопок мыши, когда курсор уже не обычная стрелочка (когда на форме), а растягивающий?
void __fastcall WMSize(TWMSize &Message);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize)
END_MESSAGE_MAP(TForm)
а вместо Resize:
{
Refresh();
}
но результат тот же! даже хуже.. теперь помимо глюка с изменением размера окна появились глюки при нажатии на стандартные кнопки окна свернуть/развернуть - при развёртке на полный экран размеры становятся почему-то больше размеров родительского окна (но с этим я справился), а при восстановлении в начальный размер окно рефрешится два раза (!) - сначала с непонятными размерами, потом с нормальными. вот такая лажа:( скажите, как же быть? как отслеживать работу мышки над границей формы?
void __fastcall WMSize(TWMSize &Message);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize)
END_MESSAGE_MAP(TForm)
а вместо Resize:
{
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]
Остальное доработать я думаю труда не составит?
но почему-то сообщения WM_NCLBUTTONUP и WM_NCLBUTTONDOWN обрабатываются только при двойном клике мышью на границе... согласно твоему примеру я смог исправить глюки с WM_SIZE, но проблема не решилась - форма по-прежнему перерисовывалась при миллиметровом движении мыши.
я склоняюсь думать, что это либо такая дикая зависимость от ОС (но как от этого избавиться?), либо специфика MDI приложений.. этого я ещё не успел проверить, потому что за компом, на котором прога глючит, бываю редко.
если есть ещё какие-нибудь предложения, буду признателен.
но почему-то сообщения WM_NCLBUTTONUP и WM_NCLBUTTONDOWN обрабатываются только при двойном клике мышью на границе... согласно твоему примеру я смог исправить глюки с WM_SIZE, но проблема не решилась - форма по-прежнему перерисовывалась при миллиметровом движении мыши.
я склоняюсь думать, что это либо такая дикая зависимость от ОС (но как от этого избавиться?), либо специфика MDI приложений.. этого я ещё не успел проверить, потому что за компом, на котором прога глючит, бываю редко.
если есть ещё какие-нибудь предложения, буду признателен.
Попробуйте установить свойства окна как неперерисовываемое, кроме того - может дело все же не в злобной ОС :) скорей всего ошибки в коде.
про ОС.. а что мне остаётся думать, когда за одним компом всё ок, а за другим пипец?!
p.s. и откуда вы всё это берёте?! ни SetWindowPos, ни WM_NCLBUTTONUP у меня даж в хэлпах нету..
про ОС.. а что мне остаётся думать, когда за одним компом всё ок, а за другим пипец?!
p.s. и откуда вы всё это берёте?! ни SetWindowPos, ни WM_NCLBUTTONUP у меня даж в хэлпах нету..
У нас специальные хелпы. только для избранных компании M$ и Borland делают специальные выпуски. :)
А если серьезно - то описание функций вы можете находить в MSDN - по ссылке http://msdn2.microsoft.com/en-us/library
или в разделе борландовской справки который называется Windows SDK - но лучше пользоваться вариантом от майкрософт - справка борланда уже изрядно устарела.
но всё-таки я настаиваю на зависимости от ОС! вот элементарный пример: на форме рисуется что-либо, а в Resize только Refresh - ничего особенного, но на "старом" компе ежемиллисекундная перерисовка! разве это нормально?! разве в коде дело?
теперь логичнее вопрос задать так - как избавиться от этой зависимости? или как узнать параметры ОС, в которой программа нормально работает?
но ведь Resize-Refresh описываются в учебнике для начинающих! если это не везде работает, что я-то могу??:(
а в Resize добавьте Refresh(). так вот на одном компе когда вы измените окончательно размер окна, тогда прямоугольник и перерисуется, а на другом будет перерисовываться во время изменения размера...
а подскажите, пожалуста, почему дочернее MDI окно при перекрытии другим любым окном теряет то, что на ней нарисовано? а точнее на нем отпечатывается картинка перекрывающего окна.. :confused: то есть если посмотреть на то место дочернего окна, которое было перекрыто, при этом не делая его активным. в простом приложении (не MDI) такого не было..