Orion9

|
Posted: Fri Jun 20, 2025 14:07 Post subject: |
|
|
| AkulaBig wrote: | | Приноравливаться надо. |
Это действительно вопрос привычки, о чём я писал. Но других вариантов не много. На панелях я обычно использую стандартную подсказку в зависимости от расширений. Если мне нужно получить расширенную информацию по какому-то файлу, я просто навожу на него указатель с удержанием CTRL или SHIFT+CTRL. Если я вижу, что на панели есть несколько файлов, для которых нужна расширенная подсказка, тогда использую закрепление подсказки через CapsLock.
| AkulaBig wrote: | | Ctrl в ТС64 не работает. Так что остается только CapsLock. |
Не работает при вызове подсказки на файловых панелях, но речь шла о главной панели инструментов, где CTRL работает. Да, возможно, не многим это нужно, но у меня количество кнопок на главной панели инструментов давно перевалило за сотню, и часто хочется видеть, какую именно команду выполняет та или иная кнопка при наведении на нее указателя. Пришлось доработать функцию вызова подсказки и учесть разделители на панели.
 Hidden text | Code: | # наведение на главную панель инструментов
ControlSetHint /F /D:50 28 "ButtonBarHint"
Func ButtonBarHint()
# состояние CapsLock и Ctrl
If BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) = 0 Then
If Not IsPressed(0x11) Then Return
EndIf
# состояние Shift
Local bMap = IsPressed(0x10)
# дескриптор горизонтальной панели
Local hWnd = RequestInfo(28)
If hWnd = 0 Then
Return "Окно панели не найдено " & hWnd
EndIf
# дескриптор монитора окна ТС
Local hMon = DllCall("MonitorFromWindow", "hwnd", AUTORUN_TCHANDLE, "dword", 2)
# информация о масштабировании экрана
Local nScale = 0, bRes
bRes = DllCall("Shcore.dll\GetScaleFactorForMonitor", "hwnd", hMon, "dword*", @nScale)
# буфер для структуры MONITORINFOEX
Local buf = Buffer(104)
buf.Zero()
buf.SetNum(0, "dword", 104)
DllCall("GetMonitorInfoW", "ptr", hMon, "ptr", buf.ptr)
# имя монитора
Local sMon = buf.GetStr(40)
# локальные переменные
Local x, y, w, h, mx, my, idx, row, rows, rowh, bar, txt, b, extra
# чтение информации о файле панели в wincmd.ini
IniRead bar %COMMANDER_INI% "Buttonbar" "Buttonbar" "%COMMANDER_PATH%\DEFAULT.BAR"
# раскрытие переменной окружения
bar = Set (bar)
# в wincmd.ini указано только имя файла
If FileGetDir(bar) = "" Then bar = COMMANDER_PATH & "\" & bar
# чтение текста окна панели
txt = WinGetText(hWnd)
# на панель загружен временный .bar файл
If Not StrPos(bar, txt) Then
bar = COMMANDER_PATH & "\Bars\" & txt
EndIf
# проверка существования файла панели
If Not FileExist(bar) Then
bar = COMMANDER_PATH & "\" & txt
If Not FileExist(bar) Then Return "Файл панели не найден " & bar
EndIf
Local i, j, nButton = 0, nDiv = 0, nCount = 0
Local aBar = List(), aMap = List(), oButton = Map(), oCmd = Map()
IniRead nCount %bar% "Buttonbar" "Buttoncount" 0
If aBar.Count = 0 Then
aBar.LoadFromFile(bar)
EndIf
Local key, val, found
For j = 0 To aBar.Count - 1
found = 0
If StrLeft(aBar[j], 6) = "button" Then
found = 1
ElseIf StrLeft(aBar[j], 3) = "cmd" Then
found = 2
EndIf
If found > 0 Then
key = StrLower(StrPart(aBar[j], "=", 1))
val = StrLen(StrPart(aBar[j], "=", 2))
If found = 1 Then
oButton.Set (key, val)
Else
oCmd.Set (key, val)
EndIf
EndIf
Next
For i = 1 To nCount
key = "button" & i
val = oButton.Get(key, 0)
If val > 0 Then
# количество кнопок
nButton += 1
aMap.Add(1)
Else
# количество разделителей
nDiv += 1
aMap.Add(0)
EndIf
Next
# карта панели
If bMap Then
txt = auCRLF & "" & auCRLF
For i = 0 To aMap.Count - 1
txt &= aMap[i] & " "
If i > 0 and Mod(i, 50) = 0 Then txt &= auCRLF
Next
EndIf
Free(aBar, oButton, oCmd)
# координаты и размеры окна панели
WinGetPos("x", "y", "w", "h", hWnd)
# координаты указателя мыши
MouseGetPos("mx", "my")
# чтение информации о высоте кнопок
IniRead b %COMMANDER_INI% "Buttonbar" "Buttonheight"
# масштабирование экрана
If nScale > 0 Then b = Round(b*nScale/100,0)
# количество рядов кнопок на панели
rows = Floor(h/b)
If rows = 0 Then Return "Error number of rows = 0"
# количество дополнительных пикселей
extra = Mod(h,b)
# ширина разделителя
Local div = Floor(b/3)
# высота одного ряда
rowh = b + 3
# номер ряда под указателем
row = Ceil((my - y)/rowh)
# абстрактные координаты по оси х
Local tx = (mx - x + 1) + ((row - 1) * w), cx = 0
# индекс кнопки в ряду
If nDiv = 0 Then
idx = (Floor((mx - x)/b) + 1) + (row-1)*(Floor(w/b))
Else
j = 1
idx = 0
For i = 0 To aMap.Count - 1
cx += (aMap[i] = 0 ? div : b)
ex = j*w - cx
If i + 1 <= aMap.Count - 1 Then
If ex < (aMap[i+1] = 0 ? div : b) Then
cx += ex
j += 1
EndIf
Else
cx += ex
EndIf
If cx >= tx Then
idx = i + 1
Break
EndIf
Next
EndIf
# чтение информации о кнопке из .bar фйла
Local sMenu, sButton, sCmd, sParam, sPath, sIcon
If idx > 0 Then
IniRead sMenu %bar% "Buttonbar" %'"menu" & idx' ""
IniRead sButton %bar% "Buttonbar" %'"button" & idx' ""
IniRead sCmd %bar% "Buttonbar" %'"cmd" & idx' ""
IniRead sParam %bar% "Buttonbar" %'"param" & idx' ""
IniRead sPath %bar% "Buttonbar" %'"path" & idx' ""
IniRead sIcon %bar% "Buttonbar" %'"iconic" & idx' ""
EndIf
Free(aMap)
# возврат текста
Return "mouse=" & mx & ", " & my & auCRLF & _
"bar=" & x & ", " & y & ", " & w & ", " & h & auCRLF & _
"map=" & tx & ", " & cx & auCRLF & _
"row=" & row & " of " & rows & auCRLF & _
"height=" & rowh & " (" & extra & ")" & auCRLF & _
"buttons=" & nButton & " + " & nDiv & " divs" & auCRLF & _
"width=" & b & ", " & div & auCRLF & _
"mon=" & HMon & " scale=" & nScale & "%" & auCRLF & _
"" & auCRLF & _
"index=" & idx & " of " & nCount & auCRLF & _
"menu=" & sMenu & auCRLF & _
"button=" & sButton & auCRLF & _
"cmd=" & sCmd & auCRLF & _
"param=" & sParam & auCRLF & _
"path=" & sPath & auCRLF & _
"iconic=" & sIcon & (bMap ? txt : "")
EndFunc |
Сейчас буквально выстраивается "карта" панели, чтобы расчитать все координаты. Но по-другому, видимо, нельзя.
CapsLock или CTRL - вызов подсказки. SHIFT - показ карты.
Тестировал не очень глубоко, так что за полную работоспособность ручаться не могу. |
|