powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Указатель мыши и границы окна
7 сообщений из 7, страница 1 из 1
Указатель мыши и границы окна
    #32274739
Kozerog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Можно ли задать такой режим, что-бы указатель мыши не выходил за границы модального окна?

2. Как эффектно(эффективно) выделить активную кнопку в форме VFP не изменяя PICTURE ?
...
Рейтинг: 0 / 0
Указатель мыши и границы окна
    #32274775
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> 1. Можно ли задать такой режим, что-бы указатель мыши не выходил за границы модального окна?

Держи пример.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
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:
Код: plaintext
1.
DECLARE integer GetFocus IN WIN32API 
thisform.hWnd=GetFocus()

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

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

Ну тут, как говорится, на вкус и цвет.. Текст можно выделить цветом или шрифтом. Если на кнопке нет текста, то подложи под нее shape и показывай его в зависимоти от того, активна она или нет.
...
Рейтинг: 0 / 0
Указатель мыши и границы окна
    #32276111
Kozerog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
==> NNN Спасибо

1. Попробую.

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

Это что-же под каждую кнопку подкладывать? А у самой кнопки с PICTURE(не с текстом) нет ли подходящего свойства ?
...
Рейтинг: 0 / 0
Указатель мыши и границы окна
    #32276146
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Kozerog

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

А версия фокса какая? В 8-й можно изменить цвет фона кнопки с помощью свойства BackColor.
...
Рейтинг: 0 / 0
Указатель мыши и границы окна
    #32277601
Kozerog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
==> 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. Как Вы получаеие выделение текстов программ в сообщениях, хотел повторить не получилось.
...
Рейтинг: 0 / 0
Указатель мыши и границы окна
    #32277604
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Kozerog

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

А вот такой код будет работать под vfp6?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
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, а каким образом - неважно :)

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

Код: plaintext
1.
Без пробелов между квадратными скобками:
[ src ] Текст программы [ /src ]
...
Рейтинг: 0 / 0
Указатель мыши и границы окна
    #32277681
Смотри Api функцию ClipCursor()
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Указатель мыши и границы окна
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]