Что нового

Как узнать размер рабочей области окна без полосы прокрутки?

agikon

Знающий
Сообщения
789
Репутация
16
вот на картинке видно что размер рабочей области берется с полосой прокрутки http://postimage.org/image/5p4zdr06b/

как программно определить есть эта полоса прокрутки или нет?
и если есть полоса то от общей ширины вычитать ширину этой полосы прокрутки.
такое возможно?
 

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
464
Re: Как узнать размер рабочей области окна?

Код:
ControlGetPos ( "title", "text", controlID )

Из справки...
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
16
Re: Как узнать размер рабочей области окна?

не совсем понял.
ну от я хочу чтобы по клике мышкой по этой области запускалась вот эту функция и в окошке показывало ширину и высоту рабочей области окна, ну той области где кликнул мышей.
так вот как это сделать?

если я не знаю заголовок этой рабочей области.
ведь в ControlGetPos ( "title", "text", controlID ) требуется ввести название окна, а я ж не знаю какое там название.
вернее я же и хочу чтобы это оопределяла сама программа, ну как WindowInfo
 

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
464
Re: Как узнать размер рабочей области окна?

Код:
#include <WinAPI.au3>
Global $tStruct = DllStructCreate($tagPOINT)

HotKeySet("{F2}", "doit")
HotKeySet("{Esc}", "ext")

While 1
	Sleep(100)
WEnd


Func Ext()
	Exit
EndFunc   ;==>Ext


Func doit()
	DllStructSetData($tStruct, "x", MouseGetPos(0))
	DllStructSetData($tStruct, "y", MouseGetPos(1))
	$hWnd = _WinAPI_WindowFromPoint($tStruct)
	$sControl = ControlGetFocus($hWnd)
	$aPos = ControlGetPos($hWnd, "", $sControl)
	ConsoleWrite("X : "&$aPos[0] & @LF)
	ConsoleWrite("Y : "&$aPos[1] & @LF)
	ConsoleWrite("Ширина "&$aPos[2] & @LF)
	ConsoleWrite("Высота: "&$aPos[3] & @LF)
EndFunc   ;==>doit



Запускай в редакторе SCITE води мышкой по окнам(контролам) - нажимай F2
 

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
413
Re: Как узнать размер рабочей области окна?

Или так:

Код:
#include <WinAPIEx.au3>
#include <APIConstants.au3>

HotKeySet('{ESC}', '_Exit')

While 1
	$tPoint = _WinAPI_GetMousePos()
	$hWnd = _WinAPI_GetAncestor(_WinAPI_WindowFromPoint($tPoint), $GA_ROOT)
	$iList = _WinAPI_EnumChildWindows($hWnd, 0)
	If (Not @error) Then
	    For $i = $iList[0][0] To 1 Step -1
		    If (Not _WinAPI_IsWindowVisible($iList[$i][0])) Then
			    ContinueLoop
		    EndIf
		    If _WinAPI_PtInRect(_WinAPI_GetWindowRect($iList[$i][0]), $tPoint) Then
			    $iPos = _WinAPI_GetPosFromRect(_WinAPI_GetWindowRect($iList[$i][0]))
			    If IsArray($iPos) Then
	                ToolTip('Class: ' & _WinAPI_GetClassName($iList[$i][0]) & @CR & 'Size:   ' & $iPos[2] & 'x' & $iPos[3], 0, 0)
	            EndIf	
			    ExitLoop
	 	    EndIf
	    Next
	EndIf
	Sleep(50)
Wend	

Func _Exit()
	Exit
EndFunc
 

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
464
Re: Как узнать размер рабочей области окна?

Viktor1703

А что делает функции _WinAPI_GetAncestor
Только по русски :smile:
 

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
413
Re: Как узнать размер рабочей области окна?

Извлекает дескриптор предка заданного окна.
 

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
464
Re: Как узнать размер рабочей области окна?

Ясно, но что то перемудрено слишком :smile: и еще вываливается с ошибкой
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
16
Re: Как узнать размер рабочей области окна?

ребята спасибо, работает.

но вот у меня вопрос ещё появился.
можно ли как то так сделать, чтобы в эту область не входила полоса прокрутки?
а то в разных окнах по разному, в одном не учитывает полосу прокрутки, а в другом учитывает.
а почему оно так я не пойму.
вобщем можно сделать так чтобы для всех окон не учитывать?
 

AZJIO

Меценат
Меценат
Сообщения
2 755
Репутация
1 150
Re: Как узнать размер рабочей области окна?

agikon
можно ли как то так сделать, чтобы в эту область не входила полоса прокрутки?
Функция GetSystemMetrics (_WinAPI_GetSystemMetrics) может быть использована для извлечения размеров различных частей неклиентской области, такие как строка заголовка, меню и полосы прокрутки.
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
16
Re: Как узнать размер рабочей области окна?

AZJIO
спасибо, но вот как её прикрутить к коду что привёл inververs ?
то есть, убрать только все полосы прокрутки.
как это правильно записать?
помогите пожалуймта, в справке не могу такую функцию найти что-то.
 

AZJIO

Меценат
Меценат
Сообщения
2 755
Репутация
1 150
Re: Как узнать размер рабочей области окна?

agikon
Как прикрутить не знаю. Как найти, скрин:
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
16
Re: Как узнать размер рабочей области окна?

я искал в русской и там нет, а вот в этой да есть но там толко вот это написано:
Код:
_WinAPI_GetSystemMetrics 
--------------------------------------------------------------------------------

Retrieves the specified system metric or system configuration setting
#Include <WinAPI.au3>
_WinAPI_GetSystemMetrics($iIndex)

Parameters

$iIndex The system metric or configuration setting to be retrieved 

Return Value

Success: The requested system metric 
Failure: 0


с этого ничего не ясно.
может есть на русском?
ну согласитесь с этих строк много не узнаешь.

ну от смотрите, _WinAPI_GetSystemMetrics это апи функция, а вот конкретно за полосы прокрутуи что отвечает? как их в коде увидеть?
 

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
464
Re: Как узнать размер рабочей области окна?

agikon
Смысл в чем. Вам дали API с помощью которого вы сможете узнать любую системную настройку. Т.к вы хотите получать ширину клиентской области без ширины scroll bar, то логично было бы произвести операцию вычитание ширины :smile:

Так например, что бы получить ширину вертикального скролла выполняйте код:
Код:
#include <WinApi.au3>
$SM_CXVSCROLL=0x2
ConsoleWrite(_WinAPI_GetSystemMetrics($SM_CXVSCROLL) & @LF)


pS. Если нажать на
Код:
_WinAPI_GetSystemMetrics
то откроется русское описание этой API ;)
pS2/ Если для вас это сложно, то быть может вам еще рано реализовывать задачу обозначенную в первом вашем сообщении.. Может быть лучше начать с азов.. вывести msgbox например
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
16
Re: Как узнать размер рабочей области окна?

inververs
если надать то открывается толко синтаксис этой функции, то есть как правильно её писать и всё.
а вот про $SM_CXVSCROLL там же ж ничего нет.

а по теме то как отнять ширину полосы?
это математической операцией надо сделать, то есть от общей ширины отнять полосу прокрутки, то есть так
Код:
$all_chirina - $polosa_prokrutki = $clear_chirina



или так
Код:
#include <WinAPI.au3>
Global $tStruct = DllStructCreate($tagPOINT)

HotKeySet("{F2}", "doit")
HotKeySet("{Esc}", "ext")

While 1
    Sleep(100)
WEnd


Func Ext()
    Exit
EndFunc   ;==>Ext


Func doit()
    DllStructSetData($tStruct, "x", MouseGetPos(0))
    DllStructSetData($tStruct, "y", MouseGetPos(1))
    $hWnd = _WinAPI_WindowFromPoint($tStruct)
    $sControl = ControlGetFocus($hWnd)
    $aPos = ControlGetPos($hWnd, "", $sControl)
    ConsoleWrite("X : "&$aPos[0] & @LF)
    ConsoleWrite("Y : "&$aPos[1] & @LF)
    ;ConsoleWrite("Ширина "&$aPos[2] & @LF)
    ConsoleWrite("Высота: "&$aPos[3] & @LF)

$SM_CXVSCROLL=0x2
ConsoleWrite(_WinAPI_GetSystemMetrics($SM_CXVSCROLL) & @LF)
EndFunc   ;==>doit

?
 

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
464
Re: Как узнать размер рабочей области окна?

Читайте справку :scratch:
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
16
Re: Как узнать размер рабочей области окна?

Код:
_WinAPI_GetSystemMetrics
--------------------------------------------------------------------------------

Retrieves the specified system metric or system configuration setting
#Include <WinAPI.au3>
_WinAPI_GetSystemMetrics($iIndex)

Parameters

$iIndex The system metric or configuration setting to be retrieved

Return Value

Success: The requested system metric
Failure: 0


ну в справке вот что написано.
ну этого же явно не достаточно.

или что именно читать?
подскажите пожалуйста.
 

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
464
Re: Как узнать размер рабочей области окна?

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724385(v=vs.85).aspx
Вот полное описание.
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
16
Re: Как узнать размер рабочей области окна?

ну я в консоли посмотрел и $SM_CXVSCROLL действительно выдало 17 пикселей что действительно соответствует размеру полосы прокрутки.

но вот что означает запись?
Код:
$SM_CXVSCROLL=0x2

вернее 0x2 это что означает?
 

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
464
Re: Как узнать размер рабочей области окна?

agikon
Вам наверное нужно в раздел Для тех кто только что установил AutoIT и пытается написать операционную систему с нуля
 
Верх