Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Autorun 
Author Message
Orion9



PostPosted: Sun Jun 22, 2025 00:31    Post subject: Reply with quote

AkulaBig wrote:
Можно конечно все стандартные иконки показать.

Да нет. Дело не в стандартных иконках, а в том, что кнопок накопилось много за годы использования, особенно в последнее время. А стандартных иконок на всей панели у меня может процентов 10 от общего количества, не больше.
AkulaBig wrote:
Это мое принципиальное значение - никакого расширенного меню.

А я бы не спешил. Многие программы в своем интерфейсе используют такую фишку, как "режим эксперта" и "режим простого пользователя", и это, на мой взгляд, правильно. Если бы я делал публичную сборку, я бы точно использовал такой подход. Но поскольку я делаю только для себя, то у меня всего одно расширенное меню как раз на пол экрана )
Loopback wrote:
DllCall и Callback исправил, ориентировочно завтра выложу минорную версию.

Класс. Спасибо. Ждём.
Loopback wrote:
- узнать, включены ли значки
- узнать их размер
- получить панель, над которой находится курсор (ItemAtCursor)
- получить хэндл панели (RequestInfo)
- получить координаты этой панели (WinGetPos)
- вычислить прямоугольник, где может находиться курсор, с помощью размера значка
- получить координаты курсора (MouseGetPos)
- проверить, находится ли курсор в границах прямоугольника

Нет, всё-таки не мог я дать такому алгоритму пропасть. Немного сделал по-другому, но основная идея та же.
Code:
If FieldIndex = 1 Then
   
       Local x, y, w, h, mx, my
       Local hWnd = RequestInfo(ItemAtCursor("panel"))
       WinGetPos("", "", "w", "h", hWnd)
       If w > 0 Then
          MouseGetPos("x","y")         
          Static buf = Buffer(8)   # POINT
          buf.Zero()
          buf.SetNum(0, "long", x, "long", y)
          DllCall("ScreenToClient", "hwnd", hWnd, "ptr", buf.ptr)
          x = buf.GetNum(0)
          MediaInfoNum = 1
          Switch Round(x/w*100,0)
             Case 1 To 10
                b_CTRL = 1
                b_SHIFT = 1
             Case 10 To 90
                b_CTRL = 1
             Case 90 To 100
                MediaInfoNum = 4               
          EndSwitch         
       EndIf

Как видите, строк совсем немного, но какой эффект! Я бы назвал это волшебным хинтом ) Панель делится на три части. Первые 10% слева выводят один хинт, 80% посередине выводят второй, последние 10% справа - третий. Счастью нет предела.

Строка If FieldIndex = 1 Then из тела рабочей функции JointHint, полный код которой привести не могу, так как он сильно завязан на множество других функций. Но для работоспособности любого кода необходимые параметры нужно задать в Switch...EndSwitch.
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group