Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2011, 09:15   #1
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
Восклицание Проблемы при потере фокуса приложения

Всем привет.
Вот опять балуюсь с Delphi. Делаю элементарную вешь. Есть панель, которую можно таскать мышкой по форме (не Drag&Drop). Для этого обрабатываю OnMouseDown, ..Up, ..Move. Во время переноса рисую на канве desktop'а прямоугольник эмитирующий эту панель (Pen.Mode := pmXor и закрашиваем старый - рисуем новый).
Как многие наверно уже догадались, если во время переноса нажать Alt+Tab, а потом вернутся в приложение, то начинаются глюки. Ясень перь, что нужно обработать Application.OnDeactivate. Так и делаю. В нём закрашиваю нарисованный прямоугольник и "прекращаю процедуру переноса".
Все нормально, но есть один глюк. Если прямоугольник проходил по рамке окна, то там остаются полосочки. Хотя по идее рамка должна перерисоваться, она ведь меняет цвет. Почему полоски-то остаются?

P.S.: Delphi 7, Winows 7

Последний раз редактировалось Sibedir; 10.02.2011 в 09:17.
Sibedir вне форума Ответить с цитированием
Старый 10.02.2011, 13:01   #2
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Да что ж вы извращаетесь-то ?
Это же проще делается (неоднократно упоминалось на форуме) :
Код:
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
const
  SC_DragMove = $F012;
begin
  ReleaseCapture;
  Panel1.perform(WM_SysCommand,SC_DragMove,0);
end;
asmodey1 вне форума Ответить с цитированием
Старый 10.02.2011, 13:23   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Спасибо. А чтобы при переносе только рамка отображалась?
Sibedir вне форума Ответить с цитированием
Старый 10.02.2011, 15:09   #4
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Вот этого не припоминаю...
Попробуйте поиграть значением параметра SC_DragMove = $F012.
Кстати, очень интересные эффекты наблюдаются при некоторых значениях.
Например, $F022, $F032...

Последний раз редактировалось asmodey1; 10.02.2011 в 15:13.
asmodey1 вне форума Ответить с цитированием
Старый 10.02.2011, 16:06   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

А откуда вообще взялось это $F012 и где можно найти полный перечень. На MSDN не пойму где искать.

Кстати, доперло, почему эти черточки остаются. Я стираю (закрашиваю обратно) прямоугольник в Application.OnDeactivate, а он срабатывает уже после потери фокуса, а соответственно и перерисовки рамки.

.........немного погодя
Опытным путем установленно, что м/у началом потери фокуса (Alt+Tab) и его окончанием (Msg.message = 45057) ни каких сообщений (кроме мыши, клавы, WM_PAINT, и WM_TIMER) приложению не передается (искал через TApplicationEvents.OnMessage).
Что, остается ловить Alt+Tab и тогда закрашивать что-ли? А как быть если фокус потерян иным способом?

Последний раз редактировалось Sibedir; 11.02.2011 в 10:38.
Sibedir вне форума Ответить с цитированием
Старый 10.02.2011, 16:47   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> где можно найти полный перечень

http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

Не уверен насчёт полноты, правда.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 10.02.2011 в 16:50.
veniside вне форума Ответить с цитированием
Старый 10.02.2011, 17:24   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Нет, это полный перечень, просто "the four low-order bits of the wParam parameter are used internally by the system". Т.е. константы
sc_SizeLeft = $F001;
sc_SizeRight = $F002;
sc_SizeTop = $F003;
sc_SizeTopLeft = $F004;
sc_SizeTopRight = $F005;
sc_SizeBottom = $F006;
sc_SizeBottomRight = $F008;
sc_SizeBottomLeft = $F007;
sc_DragMove = $F012;
можно смело отнести к недокументированным возможностям (что, кстати, не гарантирует корректной работы в будущих версиях windows)

Sibedir, можно включить окну transparent и нарисовать/сделать видимым прозрачный прямоугольник во время перетаскивания, хотя в упор не понимаю зачем
пыщь
JTG вне форума Ответить с цитированием
Старый 11.02.2011, 10:35   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Затем, чтобы пока тащишь, элемент оставался на своем месте. Вообще, главное здесь не как перетащить (для этого и существует Drag&Drop). Вопрос был в полосочках, а теперь он в отловке события "начала потери фокуса". А вообще, мне идея с прозрачным оконным элементом понравилась.

Последний раз редактировалось Sibedir; 11.02.2011 в 10:37.
Sibedir вне форума Ответить с цитированием
Старый 16.05.2011, 22:47   #9
Jeraldino74
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 45
По умолчанию

Доброго времени суток.

Проблема: Есть два edit. Как сделать, чтобы второй edit дублировал первый, после потери фокуса с первого edit?
Jeraldino74 вне форума Ответить с цитированием
Старый 23.05.2011, 21:27   #10
Jeraldino74
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 45
По умолчанию

Подскажите. Не могу разобраться.
Jeraldino74 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перекидывание фокуса при нажатии на таб Lokos Общие вопросы Delphi 7 08.02.2011 05:08
Проблемы с шаблоном при закрытии приложения klimov0512 Microsoft Office Excel 0 06.09.2010 19:55
Ошибка при наведении фокуса на Edit Gumer Общие вопросы Delphi 2 21.04.2010 00:13
сохранение изменений в DBGrid/DBGridEh, при изменении фокуса ячейки dalien БД в Delphi 6 30.07.2009 15:36
создание dll при старте приложения и удаление при завершении TyoshA Общие вопросы Delphi 7 13.07.2009 13:56