Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.02;
Скачать: CL | DM;

Вниз

экран + мышка   Найти похожие ветки 

 
Алексий   (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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.028 c
2-1150194681
ййййййййй
2006-06-13 14:31
2006.07.02
А что функция beep в win2000 не работает? :(


15-1149743871
Ega23
2006-06-08 09:17
2006.07.02
С Днём рождения! 8 июня


2-1150038020
Fiallo4ka
2006-06-11 19:00
2006.07.02
Запросы


2-1150311706
STALKER2
2006-06-14 23:01
2006.07.02
TTreeView


3-1146725967
Серебров Евгений Леонидович
2006-05-04 10:59
2006.07.02
База Данных