![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Цитата:
![]() |