:: Visual Foxpro, Foxpro for DOS
Панель задач справо
shumik73
Автор

Сообщений: 510
Откуда: Алматы
Дата регистрации: 10.05.2006
Добрый день!
Давно панель задач задумал, тока все никак не получалось.
Вот накидал - посмотрите. Может кому пригодится

Панель находится справо.
Если нажать "свернуть" - прячется в строну
Если ее нужно вызвать достаточно мышку удержать 5 секунд у правого края. И панель заново выплывет


PUBLIC oPanel
oPanel=CREATEOBJECT("form1")
oPanel.Show(0)
DEFINE CLASS form1 AS form
Top = 0
Left = 0
Height = 638
Width = 200
DoCreate = .T.
Caption = "Form1"
TitleBar = 0
AlwaysOnTop = .T.
Name = "form1"
ADD OBJECT check1 AS checkbox WITH Top = 12, Left = 9, Height = 36, Width = 180, Alignment = 0, Caption = "Свернуть", Style = 1, TabIndex = 1, BackColor = RGB(255,200,200), Name = "Check1"
ADD OBJECT timer2 AS timer WITH Top = 48, Left = 72, Height = 23, Width = 23, Interval = 1000, Name = "Timer2"
ADD OBJECT command1 AS commandbutton WITH Top = 72, Left = 12, Height = 72, Width = 172, Caption = "Открыть форму", Name = "Command1"
ADD OBJECT command2 AS commandbutton WITH Top = 408, Left = 12, Height = 36, Width = 168, Caption = "Выход", TabStop = .F., Name = "Command2"
PROCEDURE do_panel_taimer
LPARAMETERS lcType_Panel,oCheck_Panel
*+--------------------------------------------------+
*| Обоаботчик событий для панельного таймера |
*| lcType_Panel - тип панели R или L |
*| oCheck_Panel - ссылка на флаг Check в панели |
*+--------------------------------------------------+
LOCAL lnStep_Panel,lnStep_Max
lnStep_Panel=1 &&Отступ для зоны реагирования
lnStep_Max=5 &&Кол-во циклов ожиадания, до того как развернуть панель
IF BETWEEN(MCOL(_screen.Name),lnStep_Panel,WCOLS(_screen.Name)-lnStep_Panel)
*+----------------------------------+
*| Если мышка летает внутри окна |
*+----------------------------------+
*_screen.Caption= STR(MCOL(_screen.Name),7,3)+" из "+STR(WCOLS(_screen.Name),7,3)
This.AddProperty("Wait_Panel",0) &&Сбросим счетчи ожиадания
ELSE
*+---------------------------------+
*| Счетчик присутствия на границе |
*+---------------------------------+
IF TYPE("This.Wait_Panel")#"N"
This.AddProperty("Wait_Panel",0)
ENDIF
This.Wait_Panel=This.Wait_Panel+1
&&Если долго ждал
IF THIS.Wait_Panel>lnStep_Max THEN
*+----------------------------------------------+
*| Если мышка приблизилась к левому краю |
*| правая панель спрятана - то ее развернуть |
*+----------------------------------------------+
IF lcType_Panel="L" AND MCOL(_screen.Name)<=lnStep_Panel
MESSAGEBOX("Окно слево")
ENDIF
*+----------------------------------------------+
*| Если мышка зашкалила за правый край, |
*| левая панель спрятана - то ее развернуть |
*+----------------------------------------------+
IF lcType_Panel="R" AND MCOL(_screen.Name)>=WCOLS(_screen.Name)-lnStep_Panel AND !EMPTY(oCheck_Panel.Value)
oCheck_Panel.Value=0
oCheck_Panel.InteractiveChange()
ENDIF
ENDIF
ENDIF
_screen.Caption=STR(THIS.Wait_Panel)
ENDPROC
PROCEDURE do_panel_move
LPARAMETERS lcType_Panel,oCheck_Panel,oTimer_Panel,oThisform
*+--------------------------------------------------+
*| Обоаботчик событий для панельного таймера |
*| lcType_Panel - тип панели R или L |
*| oCheck_Panel - ссылка на флаг Check в панели |
*+--------------------------------------------------+
LOCAL lnStep_Panel,lnStep_Max
lnStep_Panel=INT(oThisform.Width/5) &&Отступ для зоны реагирования
DO CASE
CASE lcType_Panel="R" AND !EMPTY(oCheck_Panel.Value)
*+--------------------------+
*| Спрятать правую панель |
*+--------------------------+
Value_Min=_screen.Width-Thisform.Width
Value_Max=_screen.Width+lnStep_Panel
FOR Value_Now=Value_Min TO Value_Max STEP lnStep_Panel
oThisform.Move(Value_Now)
INKEY(0.1)
ENDFOR
oTimer_Panel.Interval=100
CASE lcType_Panel="R" AND EMPTY(oCheck_Panel.Value)
*+--------------------------+
*| Показать правую панель |
*+--------------------------+
Value_Min=_screen.Width+lnStep_Panel
Value_Max=_screen.Width-Thisform.Width-lnStep_Panel
FOR Value_Now=Value_Min TO Value_Max STEP -lnStep_Panel
IF Value_Now<_screen.Width-oThisform.Width
Value_Now=_screen.Width-oThisform.Width
ENDIF
oThisform.Move(Value_Now)
INKEY(0.1)
IF Value_Now=_screen.Width-oThisform.Width
EXIT
ENDIF
ENDFOR
oTimer_Panel.Interval=0
CASE lcType_Panel="L" AND !EMPTY(oCheck_Panel.Value)
*+--------------------------+
*| Спрятать левую панель |
*+--------------------------+
CASE lcType_Panel="L" AND EMPTY(oCheck_Panel.Value)
*+--------------------------+
*| Показать левую панель |
*+--------------------------+
ENDCASE
ENDPROC
PROCEDURE check1.Init
Thisform.Top=0
Thisform.Left=_screen.Width-Thisform.Width
Thisform.Height=_screen.Height
ENDPROC
PROCEDURE check1.InteractiveChange
Thisform.Do_Panel_Move("R",Thisform.Check1,Thisform.Timer2,Thisform)
This.Caption=IIF(!EMPTY(This.Value),"Развернуть","Свернуть")
ENDPROC
PROCEDURE timer2.Timer
Thisform.Do_Panel_Taimer("R",Thisform.Check1)
ENDPROC
PROCEDURE command1.Click
PUBLIC oForm
oForm=CREATEOBJECT("Form")
oForm.Show()
Thisform.Check1.Value=1
Thisform.Check1.InteractiveChange()
ENDPROC
PROCEDURE command2.Click
Thisform.Release()
ENDPROC
ENDDEFINE



Исправлено 1 раз(а). Последнее : shumik73, 29.03.21 11:24
Ratings: 0 negative/1 positive
Re: Панель задач справо
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
Прикольная мысля!
Спасибо.


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.
Ratings: 0 negative/0 positive
Re: Панель задач справо
Alsim

Сообщений: 3636
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
Согласен, интересная штука!
Жалко, исторически все проги делаю as_top_level, ну не люблю на скрине.
Особенно выбешивало в свое время, когда программа вроде проверки файлов отчётности с одной формой на весь экран растопыривалось
***
На заре "творчества" пытался лепить что-то вроде панели у какого-то Аутлука.
Там слева панелька была с картинками и двигалась по вертикали, группировалась и т.п.
Потом насобачился менюшку к главной форме, где журналы документов, приделывать и пошло дело.
***
Надо подумать, может и на на формах такую движуху реализовать
***
Спасибо!
Ratings: 0 negative/0 positive
Re: Панель задач справо
Каратаев

Сообщений: 3974
Откуда: Алматы
Дата регистрации: 04.12.2001
Интересно... Забрал, пригодится. Спасибо!


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 17 (Гостей: 17)

© 2000-2024 Fox Club 
Яндекс.Метрика