Форум: "Начинающим";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];
Внизэкран + мышка Найти похожие ветки
← →
Алексий (2006-06-06 09:22) [0]всем привет,появился такой вопрос,заказчику понадобилось чтобы программа пряталсь справа за экраном,и если курсор поднести к правой части экрана - программа должна "выезжать",подскажите с чем работать,как это должно выглядеть. Спасибо
← →
tButton © (2006-06-06 09:24) [1]GetCursorPos
Screen.Width
можно просто полностью её не прятать
тогда
onMouseMove + флаги состояния
← →
Loginov Dmitry © (2006-06-06 09:46) [2]Алексий (06.06.06 9:22)
как это должно выглядеть
Ну наверное так же, как с панелью задач при установке галочки "скрывать автоматически"
← →
Алексий (2006-06-06 09:55) [3]
> Loginov Dmitry
ага,так!
ту tButton,
делаю в onmove формы
var
P:TPoint;
begin
getcursorpos(P);
дальше как я понимаю надо делать условие что если p.X > там чего то,то включить таймер,в таймере form.left := form.left - 20;
так?
← →
Loginov Dmitry © (2006-06-06 10:31) [4]Имхо, тады лучше просто ловить сообщения CM_MOUSEENTER и CM_MOUSELEAVE, а дальше запускать таймер, и по таймеру двигать форму.
← →
Алексий (2006-06-06 11:03) [5]ок,объявдяю их в private
procedure CMMouseEnter(var msg:TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;
но компилятор ругается
сорри,я новичек еще
← →
Loginov Dmitry © (2006-06-06 11:12) [6]Попробуй нажать Ctrl+Shift+C
← →
Алексий (2006-06-06 11:27) [7]
> Попробуй нажать Ctrl+Shift+C
спс,получилось,но почему то работает не совсем правильно,навожу,форма "отъезжает",увожу корсар с формы и она не всегда возаращается на свое место,т.е. не сразу срабатывает onenter
почему?
← →
ЮЮ © (2006-06-06 11:31) [8]
> навожу,форма "отъезжает",увожу
> почему?
Это что, стандартное поведение форм в Windows или результат работы твоего кода? Потому, что так код написан.
← →
Алексий (2006-06-06 11:33) [9]в onenter :
form1.Left:=form1.Left-clientwidth;
onleave:
form1.Left:=screen.Width-Width+clientwidth;
form1.Top:=screen.WorkAreaHeight-height;
← →
ЮЮ © (2006-06-06 11:40) [10]Чьи clientwidth, Width?
Формулы в onenter и в onleave разные и, по-моем, и не должны восстанавливать form1.Left
← →
tButton © (2006-06-06 11:44) [11]хм.
я же говорил про onMove + флаги
флаги:
_hiding
_showing
_hiden
_showen
проверяем в онМув флагcase flag of
_hiding: flag:=_showing; // если форма прячется - заставляем её показываться
_hiden: flag:=_showing; // такая же беда если форма спрятана
end;
в обработчике таймераcase flag of
_hiding: if left<maxleft
then left:=left+1
else flag:=_hiden
_showing: if left>minleft
then left:=left-1
else flag:=_showen;
end;maxleft
- крайнее правое положение формы
вычисляется заранее исходя из ширины экранаminleft
- крайнее левое положение формы
вычисляется заранее исходя из ширины экрана
это очень примерно, но уже рабочеспособно
← →
tButton © (2006-06-06 11:49) [12]а
ещё переход из состояния _showen в состояние _hiding
можно сделать в том же таймере
т.е. в onMove
записываем в глобальную переменную результат функции getTickCount
в таймере считаем разницу между текущим значением getTickCount и запомненым
если больше какого-то определённого значения - меняем флаг
← →
Алексий (2006-06-06 15:53) [13]tButton, прошу прощения,но я первый раз слышу что такое флаги, где можно на эту тему почитать?
спасибо
← →
tButton © (2006-06-06 16:34) [14]=)
обычно - в любом учебнике по программированию, хотя я не знаю что сейчас в учебниках пишут =)
флаг - логическая (boolean) али ещё какая переменная, которая описывает состояние чего-нибудь принимая различные значения. обычно это таки boolean переменные принимающие значения true/false т.е. типа вкл/выкл
твой вариант -type
twndflag = (_hiding, _showing, _hiden, _showen);
...
flag: tWndFlag;
забыл, как эта хренотень называется =)
лучше у других по спрашивай =)
у меня проблемы с переводом с Дельфи на русский =)
← →
Алексий (2006-06-06 22:52) [15]т.е. у меня должно так выгдялеть:
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
twndflag = (_hiding, _showing, _hiden, _showen);
var
Form1: TForm1;
flag: tWndFlag;
потом
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
case flag of
_hiding: flag:=_showing;
_hiden: flag:=_showing; end;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
minleft,maxleft:integer;
begin
minleft:=form1.Left;
maxleft:=form1.ClientWidth;
case flag of
_hiding: if left<maxleft
then left:=left+1
else flag:=_hiden;
_showing: if left>minleft
then left:=left-1
else flag:=_showen;
end;
end;
что не так?
← →
Юрий Зотов © (2006-06-07 01:20) [16]См. SHAppBarMessage и APPBARDATA в справке WinAPI.
← →
tButton © (2006-06-07 01:43) [17]
> minleft:=form1.Left;
> maxleft:=form1.ClientWidth;
как минимум вот это
minleft = screen.width - self.width;
maxleft = screen.width - <сколько_пикселей_формы_должны_торчать_в_виде_корешка>;
← →
Алексий (2006-06-07 14:11) [18]+ ко всему добавил в oncreate
form1.Left:=screen.Width-Width;
form1.Top:=screen.WorkAreaHeight-height;
поменял
minleft = screen.width - self.width;
maxleft = screen.width - <сколько_пикселей_формы_должны_торчать_в_виде_корешка>;
все норм,как надо,но почему работает только один раз при запуске,т.е. компилю,форма прячется,потом навожу на пиксель форма обратно покаывается и все, потом уже никаких действий не происходит,почему?
тамер то включен,интервал 1
← →
tButton © (2006-06-08 05:43) [19]
> ещё переход из состояния _showen в состояние _hiding
> можно сделать в том же таймере
> т.е. в onMove
> записываем в глобальную переменную результат функции getTickCount
> в таймере считаем разницу между текущим значением getTickCount
> и запомненым
> если больше какого-то определённого значения - меняем флаг
т.е.
добавляешь глобальную переменную, напримерlmove: longword;
вonMove
добавляешьlmove:=GetTickCount
в обработчик таймера добавляешьif abs(GetTickCount-lmove)>3000
then flag:=_hiding;
т.о.
каждый раз когда ты водишь мышкой по форме у тебя запоминается текущее значение системного таймера
каждый раз в таймере ты считаешь разницу между текущим и запомненым значениями таймера
если разница превышает три секунды (3000мс) - меняешь флаг на _hiding и форма начинает уезжать
но. этот метод не самый верный. пользователь может просто тупить в форму, может вводить какой-то текст
поэтому забывай всё что я сказал =)
и делай так
в таймере проверяй находится ли указатель мыши (GetCursorPos) в пределах формы (получи rect формы + PointInRect) если нет - меняй флаг
если да - не меняй ничего =)
в таком случае форма будет терпеливо ждать пока от неё "уберут руки" =)
← →
Loginov Dmitry © (2006-06-08 12:09) [20]
object Form1: TForm1
Left = 192
Top = 114
Width = 475
Height = 480
Caption = "Form1"
Color = clSkyBlue
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "MS Sans Serif"
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Timer1: TTimer
Interval = 100
OnTimer = Timer1Timer
Left = 16
Top = 152
end
end
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, AppEvnts;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
IsShowing, IsHide, IsHiding: Boolean;
HideWidth: Integer;
procedure BeginEnter();
procedure BeginLeave();
function MouseInFormRect(): Boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if IsShowing or IsHiding then Exit;
if MouseInFormRect then
begin
if IsHide then BeginEnter;
end
else
BeginLeave
end;
procedure TForm1.BeginEnter;
begin
IsShowing := True;
// Здесь можно сделать выезд формы с анимацией
Left := Screen.WorkAreaWidth - Width;
IsShowing := False;
IsHide := False;
end;
procedure TForm1.BeginLeave;
begin
IsHiding := True;
// Здесь можно сделать "отъезд" формы с анимацией
Left := Screen.WorkAreaWidth - HideWidth;
IsHiding := False;
IsHide := True;
end;
function TForm1.MouseInFormRect: Boolean;
var
MousePos: TPoint;
begin
GetCursorPos(MousePos);
if (MousePos.X > Left) and (MousePos.X < Screen.WorkAreaWidth) and
(MousePos.Y > Top) and (MousePos.Y < Screen.WorkAreaHeight) then
Result := True
else
Result := False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
HideWidth := 20;
Left := Screen.WorkAreaWidth - HideWidth;
Top := 0;
Height := Screen.WorkAreaHeight;
IsHide := True;
end;
end.
← →
Алексий (2006-06-08 20:50) [21]ок спасибо огромное!,добавил чтобы на секунду была задержка,а потом скрывалась и обратно на 1мсек,еще такой маленький вопросик,как сделать так чтобы не убиралась форма пока используються компоненты на ней,т.е. у меня там Popupmenu вылезает за пределы формы,и она уберается,а меню остается;)
← →
tButton © (2006-06-09 06:09) [22]
> еще такой маленький вопросик,как сделать так чтобы не убиралась
> форма пока используються компоненты на ней,т.е. у меня там
> Popupmenu вылезает за пределы формы,и она уберается,а меню
> остается;)
* сделать задержку больше и применять её комбинировано с проверкой нахождения мыши в форме
* подогнать попап так чтоб не вылезал с формы или заменить его чем-нибудь другим.
← →
ЮЮ © (2006-06-09 08:15) [23]В TPopupMenu.OnPopup отключать таймер, в запускаем действии - включать
← →
tButton © (2006-06-09 08:45) [24]
> в запускаем действии - включать
а если для каждого действия отдельный обработчик?
хотя тоже решаемо
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.093 c