Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Указатель мыши и границы окна  [new]
Kozerog
Member

Откуда: М О
Сообщений: 126
1. Можно ли задать такой режим, что-бы указатель мыши не выходил за границы модального окна?

2. Как эффектно(эффективно) выделить активную кнопку в форме VFP не изменяя PICTURE ?
24 сен 03, 22:21    [351597]     Ответить | Цитировать Сообщить модератору
 Re: Указатель мыши и границы окна  [new]
NNN 
Guest
> 1. Можно ли задать такой режим, что-бы указатель мыши не выходил за границы модального окна?

Держи пример.
LOCAL loForm as Form 

loForm=NEWOBJECT('form1')
READ EVENTS

DEFINE CLASS form1 AS form
DoCreate = .T.
Caption = "Form1"
Name = "Form1"
ADD OBJECT command1 AS commandbutton WITH ;
Top = 216, ;
Left = 276, ;
Height = 25, ;
Width = 85, ;
Caption = "Lock", ;
Name = "Command1"
PROCEDURE bin2int
LPARAMETERS tcString as String
LOCAL i as Integer
LOCAL lnValue as Integer
lnValue=0
FOR i= 1 TO 4
lnValue=lnValue+ASC(SUBSTR(tcString,i,1))*255^(i-1)
ENDFOR
RETURN lnValue
ENDPROC
PROCEDURE Init
DECLARE integer ClipCursor IN WIN32API string @ lpRect
DECLARE integer GetClientRect IN WIN32API integer lhWnd, string @ lpRect
DECLARE integer ClipCursor IN WIN32API as UnClipCursor integer
DECLARE integer ClientToScreen IN WIN32API integer lhwnd, string @ lpPoint
DECLARE integer OffsetRect IN WIN32API string @ pRect, integer x, integer y
this.Visible= .T.
ENDPROC
PROCEDURE Unload
=UnClipCursor(0)
CLEAR DLLS
CLEAR EVENTS
ENDPROC
PROCEDURE command1.Click
IF this.Caption='Lock'
this.Caption='Unlock'
LOCAL lpRect as String
LOCAL lpPoint as String
LOCAL x as Integer
LOCAL y as Integer
lpRect=REPLICATE(CHR(0),16)
lpPoint=REPLICATE(CHR(0),8)
=GetClientRect(thisform.HWnd, @lpRect)
=ClientToScreen(thisform.hwnd, @lpPoint)
x=thisform.bin2int(LEFT(lpPoint,4))
y=thisform.bin2int(RIGHT(lpPoint,4))
=OffsetRect(@lpRect, x, y)
=ClipCursor(@lpRect)
ELSE
this.Caption='Lock'
=UnClipCursor(0)
ENDIF
ENDPROC
ENDDEFINE

Пример будет нормально работать в 7-й версии и выше. Для более ранних нужно вычислить hWnd самому. Например, добавить к форме свойство hWnd и выполнить такой код в Form.Activate:
DECLARE integer GetFocus IN WIN32API 

thisform.hWnd=GetFocus()

И еще учти, что границы для мыши действуют для ВСЕХ приложений.

> 2. Как эффектно(эффективно) выделить активную кнопку в форме VFP не изменяя PICTURE ?

Ну тут, как говорится, на вкус и цвет.. Текст можно выделить цветом или шрифтом. Если на кнопке нет текста, то подложи под нее shape и показывай его в зависимоти от того, активна она или нет.
25 сен 03, 00:30    [351651]     Ответить | Цитировать Сообщить модератору
 Re: Указатель мыши и границы окна  [new]
Kozerog
Member

Откуда: М О
Сообщений: 126
==> NNN Спасибо

1. Попробую.

2. <подложи под нее shape и показывай его в зависимоти от того, активна она или нет>.

Это что-же под каждую кнопку подкладывать? А у самой кнопки с PICTURE(не с текстом) нет ли подходящего свойства ?
25 сен 03, 20:46    [353260]     Ответить | Цитировать Сообщить модератору
 Re: Указатель мыши и границы окна  [new]
NNN 
Guest
2Kozerog

> А у самой кнопки с PICTURE(не с текстом) нет ли подходящего свойства ?

А версия фокса какая? В 8-й можно изменить цвет фона кнопки с помощью свойства BackColor.
25 сен 03, 21:41    [353306]     Ответить | Цитировать Сообщить модератору
 Re: Указатель мыши и границы окна  [new]
Kozerog
Member

Откуда: М О
Сообщений: 126
==> NNN

1.VFP6.0 SP5
2.Cвойства BackColor у кнопок здесь нет. Видимо единственное решение -смена PICTURE для каждой кнопки. Т.е. для каждой кнопки нужно держать две картинки

3. Проверил Ваш пример на VFP6.0 SP5.

Fox-у не понравилось второе определение DECLARE integer ClipCursor.

Слегка подправил - и заработало, см ниже(мои исправления KO):

*********************************************************
LOCAL loForm as Form
loForm=NEWOBJECT('form1')
READ EVENTS

DEFINE CLASS form1 AS form
DoCreate = .T.
Caption = "Form1"
Name = "Form1"
ADD OBJECT command1 AS commandbutton WITH ;
Top = 216, ;
Left = 276, ;
Height = 25, ;
Width = 85, ;
Caption = "Lock", ;
Name = "Command1"
PROCEDURE bin2int
LPARAMETERS tcString as String
LOCAL i as Integer
LOCAL lnValue as Integer
lnValue=0
FOR i= 1 TO 4
lnValue=lnValue+ASC(SUBSTR(tcString,i,1))*255^(i-1)
ENDFOR
RETURN lnValue
ENDPROC
PROCEDURE Init
DECLARE integer ClipCursor IN WIN32API string @ lpRect
DECLARE integer GetClientRect IN WIN32API integer lhWnd, string @ lpRect
* KO DECLARE integer ClipCursor IN WIN32API as UnClipCursor integer
DECLARE integer ClientToScreen IN WIN32API integer lhwnd, string @ lpPoint
DECLARE integer OffsetRect IN WIN32API string @ pRect, integer x, integer y
this.Visible= .T.
ENDPROC
PROCEDURE Unload
=ClipCursor(0) && KO
CLEAR DLLS
CLEAR EVENTS
ENDPROC
PROCEDURE command1.Click
IF this.Caption='Lock'
this.Caption='Unlock'
LOCAL lpRect as String
LOCAL lpPoint as String
LOCAL x as Integer
LOCAL y as Integer
lpRect=REPLICATE(CHR(0),16)
lpPoint=REPLICATE(CHR(0),8)
=GetClientRect(thisform.HWnd, @lpRect)
=ClientToScreen(thisform.hwnd, @lpPoint)
x=thisform.bin2int(LEFT(lpPoint,4))
y=thisform.bin2int(RIGHT(lpPoint,4))
=OffsetRect(@lpRect, x, y)
=ClipCursor(@lpRect)
ELSE
this.Caption='Lock'
=ClipCursor(0) && KO
ENDIF
ENDPROC
ENDDEFINE
******************************************************


P.S. Как Вы получаеие выделение текстов программ в сообщениях, хотел повторить не получилось.
28 сен 03, 10:32    [355202]     Ответить | Цитировать Сообщить модератору
 Re: Указатель мыши и границы окна  [new]
NNN 
Guest
2Kozerog

> Видимо единственное решение -смена PICTURE для каждой кнопки. Т.е. для каждой кнопки нужно держать две картинки

А вот такой код будет работать под vfp6?
DEFINE CLASS colorcomm AS form

DoCreate = .T.
Caption = "Form1"
Name = "Form1"
ADD OBJECT command1 AS commandbutton WITH ;
Top = 204, ;
Left = 192, ;
Height = 25, ;
Width = 73, ;
Caption = "Command1", ;
Name = "Command1"
ADD OBJECT command2 AS commandbutton WITH ;
Top = 204, ;
Left = 288, ;
Height = 25, ;
Width = 73, ;
Caption = "Command2", ;
Name = "Command2"
PROCEDURE command1.LostFocus
this.ColorSource= 4
ENDPROC
PROCEDURE command1.GotFocus
this.ColorScheme= 1
this.ColorSource= 2
ENDPROC
PROCEDURE command2.GotFocus
this.ColorScheme= 1
this.ColorSource= 2
ENDPROC
PROCEDURE command2.LostFocus
this.ColorSource= 4
ENDPROC
ENDDEFINE

Если работает, то можно поиграться с ColorScheme и выбрать приемлитый вариант.

> Fox-у не понравилось второе определение DECLARE integer ClipCursor.
Слегка подправил - и заработало, см ниже(мои исправления KO):


Там главное вместо структуры (представленной в виде строки) передать NULL, а каким образом - неважно :)

> Как Вы получаеие выделение текстов программ в сообщениях, хотел повторить не получилось.

Без пробелов между квадратными скобками:

[ src ] Текст программы [ /src ]
28 сен 03, 11:08    [355208]     Ответить | Цитировать Сообщить модератору
 Re: Указатель мыши и границы окна  [new]
Давыдов Андрей
Guest
Смотри Api функцию ClipCursor()
28 сен 03, 21:06    [355304]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить