![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Привет..
Вопрос в следующем: Есть форма, которая прячется путем Код:
form1.hide; На форме таймер, в таймере код: Код:
var P:TPoint; ... {Показывает форму, если курсор находится сверху слева} if (Mouse.CursorPos.X<1) and (Mouse.CursorPos.Y<1) then begin Form1.Show; end; {скрывает форму если кликнули НЕ в форму} if GetAsyncKeyState(VK_LBUTTON)<> 0 then begin GetCursorPos(P); if (P.X > Form1.Left+form1.Width) or (P.y > form1.Top+ Form1.Height) or (P.Y < Form1.Top) then begin Form1.Hide; end; end; Вся соль в том, что когда беру любой ярлык, неважно откуда, подвожу его в угол, форма появляется и сразу исчезает. Если убрать код проверки клика вне формы - всё получается как надо... Как можно вылечить данный недуг? Спасибо заранее. |
#2
|
||||
|
||||
![]() Есть понятие клиентской и неклиентской части формы, они не совпадают по размерам, последняя немного (на толщину рамки с трёх сторон и шапки сверху) больше, а в условии вычисления момента скрытия это видимо и не учитывается - клик идёт формально ПО форме, а фактически НЕ, да ещё и событие "захода" на форму генерится только один раз, а "сдвига" по рамке несколько, возможно нужно добавить флажок как индикатор прохождения этого "терминатора"
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (15.01.2016)
|
#3
|
|||
|
|||
![]() Цитата:
![]() Как проблему вижу я: мне кажется, форма появляется и сразу исчезает из-за постоянного if GetAsyncKeyState(VK_LBUTTON)<> 0 then, так как в таймере 2 условия: на то что курсор в углу и то что кнопка зажата... А когда я пытаюсь добавить ярлык(путем drag&drop) эти условия срабатывают обе. От этого мигание формы (появление-скрытие).. Не знаю как быть.. Обе проверки мне нужны, но как сделать что бы программа поняла, когда я пытаюсь перенести ярлык, а когда я просто ткнул мимо формы? Есть ли способ проверки клика вне формы, без GetAsyncKeyState ? Это проверка зажата ли кнопка, а мне надо отследить именно клик, а не постоянное зажатое положение мыши. Последний раз редактировалось Gareth, 15.01.2016 в 16:34. |
#4
|
||||
|
||||
![]() Цитата:
Для этого есть API функция GetCapture, пример из drkb Код:
procedure TForm1.FormDeactivate(Sender: TObject); begin ReleaseCapture; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin If GetCapture = 0 then SetCapture(Form1.Handle); if PtInRect(Rect(Form1.Left, Form1.Top, Form1.Left + Form1.Width, Form1.Top + Form1.Height), ClientToScreen(Point(x, y))) then Form1.Caption := 'Мышка на форме' else Form1.Caption := 'Мышка за пределами формы'; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (15.01.2016)
|
#5
|
|||
|
|||
![]() Цитата:
![]() |