TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое

Обсуждение только плагинов и утилит для Total Commander.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

MVV
А от чего ж у меня без звёздочки работает? :)
Или я не с теми командами проверял... Изображение
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

VadiMGP,
Я пытался как-то контекстное меню отобразить, но оно каким-то хитрым способом показывается. Технически, можно отправить правый клик таб-контролу (указав координаты нужной вкладки, полученные через TCM_GETITEMRECT), а потом перехватить сообщение WM_INITMENUPOPUP главного окна и там в меню подсмотреть, есть ли галочка, и заодно удалить все элементы меню, чтобы оно не появлялось на экране - я так делаю, определяя режим панели. Но здесь всё происходит асинхронно.

Flasher,
Заблокированность вкладки в TCFS2Tools определяется только по тому, начинается ли заголовок вкладки со звёздочки.
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

MVV писал(а):Я пытался как-то контекстное меню отобразить, но оно каким-то хитрым способом показывается.
Да, это я тоже пытался. И тоже безуспешно. К тому же так ни шиша не выйдет с табами, которые в данный момент за пределами контрола. И я плюнул.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

VadiMGP, а у меня сегодня получалось отправлять сообщение для таба за пределами видимости, координаты у него были отрицательны, но тем не менее меню показывалось с его галочкой. Тупо по номеру таба брал прямоугольник и отправлял нажатие кнопки мыши внутри него.
Если специально поставить флаг ожидания ответа, потом дождаться его и считать результат, то это вполне реально. Мне в TCFS2Tools так делать проблематично, т.к. для обработки сообщений надо вызывать оконную процедуру, в которой я нахожусь. Но если в случае режима панели я просто установил флаг, послал себе же сообщение cm_SrcCustomViewMenu (отображение и обработка меню оказались внутри), снял флаг, то здесь обработка идёт после возврата из процедуры, т.е. после того, как мне надо вернуть результат.
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

MVV писал(а):а у меня сегодня получалось отправлять сообщение для таба за пределами видимости,
Интересно. Я точно помню, что у меня этот фокус не прошел. Правда это было много лет назад, может на семерке поведение контрола изменилось. Но, все равно, у меня та же проблема с асинхронностью. Впрочем, если найду время, еще поковыряюсь.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Осенило, решил проблему с асинхронностью.

Код: Выделить всё

			SendMessage(htabs, TCM_GETITEMRECT, ti, (LPARAM)&rc);
			LPARAM mlp = MAKELPARAM(rc.left, rc.top);
			SendMessage(htabs, WM_RBUTTONDOWN, MK_RBUTTON, mlp);
			SendMessage(htabs, WM_RBUTTONUP, 0, mlp);
			g_pCheckedItem = &nl;
			while (g_pCheckedItem) {
				MSG msg;
				GetMessage(&msg, hWnd, 0, 0);
				myMainWndProc(msg.hwnd, msg.message, msg.wParam, msg.lParam);
			}

			wchar_t buf[64];
			wsprintf(buf, L"Tab %d checked id is %d.", ti, nl);
			MessageBox(hWnd, buf, L"TCFS2Tools", 0);
А в это время в myMainWndProc...

Код: Выделить всё

	if (g_pCheckedItem) {
		if (uMsg == WM_INITMENUPOPUP) {
			HMENU hmenu = (HMENU)wParam;
			*g_pCheckedItem = menuGetCheckedItem(hmenu);
			g_pCheckedItem = 0;

			for (int i = 0, i_end = GetMenuItemCount(hmenu); i < i_end; ++i) RemoveMenu(hmenu, 0, MF_BYPOSITION);
			return 0;
		}
	}
Так, для простой блокировки получаем значение 9, а для блокировки со сменой каталога - 11.
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

MVV
То есть, просто вторичный message loop на главное окно? А я-то предполагал делать отдельный поток и синхронизироваться с ним. Но так, конечно, проще.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Да, просто вторичный цикл обработки. Нам не хочется возвращаться из оконной процедуры, но если мы будем стоять на месте, тотал будет висеть, а цикл как раз позволяет во вложенных вызовах оконной процедуры обработать нужное нам сообщение WM_INITMENUPOPUP.
Но тонкие моменты всё же остаются. Если я посылаю нажатие/отжатие кнопки мыши через PostMessage, как и полагается, способ не работает.
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

Вроде есть еще способ. Вместо пары

Код: Выделить всё

SendMessage(htabs, WM_RBUTTONDOWN, MK_RBUTTON, mlp);
SendMessage(htabs, WM_RBUTTONUP, 0, mlp); 
можно послать

Код: Выделить всё

SendMessage(hwnd,0x433, 0xBC1, idx);
где idx - индекс таба начиная с 1, причем отрицательный индекс означает правую панель.
MVV писал(а):Так, для простой блокировки получаем значение 9, а для блокировки со сменой каталога - 11.
Кстати, любопытство замучило - а почему 9 и 11?
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

VadiMGP писал(а):Вроде есть еще способ.
Очень интересно! Не подумал бы, что внутренние команды могут принимать параметры. Про cm_DirTabsShowMenu я вчера вспоминал, но для только активной вкладки она мало полезна. Но с учётом того, что если lParam = 0, то она работает для текущей вкладки активной панели, а если больше/меньше нуля, то для произвольной, дык это вообще шикарный способ, он даже от асинхронности избавляет, т.е. и цикл сообщений не нужен!

Код: Выделить всё

				T2T.pCheckedItem = &nl;
				SendMessage(hWnd, WM_TC_COMMAND, cm_DirTabsShowMenu, is_left ? (ti + 1) : -(ti + 1));
				return nl;
VadiMGP писал(а):Кстати, любопытство замучило - а почему 9 и 11?
Это какие-то внутренние идентификаторы пунктов меню, соответствующих полной и неполной блокировке. А почему они равны 9 и 11, Гислер его знает...
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

MVV писал(а):Это вообще шикарный способ, он даже от асинхронности избавляет, т.е. и цикл сообщений не нужен!
Я только не знаю насколько он обратно совместим с предыдущими версиями и битностями ТС. Я это обнаружил только сейчас в 8.51 - 64 бита.
У меня пока осторожная радость.
MVV писал(а):идентификаторы пунктов меню
А, ясно. А я взял просто порядковый номер пункта. Просто из тех соображений, что в будущих версиях ТС у ресурсов больше шанса измениться, чем у внешнего вида меню. Швейцарцы - они такие консервативные. Но, в общем - не суть. И то и то - как повезет.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

MVV
Раз открылись такие перспективы. Вот бы добавить теперь эти команды в Tools:
Переименовать/Заблокировать вкладку (в диалоге)
Копировать вкладку на противоположную панель
Закрыть дубликаты вкладок текущей панели
Сохранить вкладки текущей панели в файл
Сохранить вкладки обеих панелей в файл
И есть ли возможность две последние команды задействовать без диалога, т.е. с указанием пути к tab-файлу?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

VadiMGP писал(а):Я только не знаю насколько он обратно совместим с предыдущими версиями и битностями ТС. Я это обнаружил только сейчас в 8.51 - 64 бита.
Я проверил с TC 7.56a, меню открывается для заданной вкладки.
Flasher писал(а):Раз открылись такие перспективы. Вот бы добавить теперь эти команды в Tools:
Думаю, это возможно, хотя я пока не вижу, как тотал получает уведомление о щелчке по пункту этого меню. Похоже, тотал получает его как результат вызова TrackPopupMenu, но тогда неизвестно, как повлиять на него.
И есть ли возможность две последние команды задействовать без диалога, т.е. с указанием пути к tab-файлу?
А это вряд ли. От диалога всё равно не уйти, а экспериментировать с окнопрыгом с постоянно изменяемыми диалогами выбора файлов не хочется ни разу.
Последний раз редактировалось MVV Чт фев 05, 2015 11:36, всего редактировалось 2 раза.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

MVV писал(а):Думаю, это возможно, хотя я пока не вижу, как тотал получает уведомление о щелчке по пункту этого меню.
А зачем тебе знать про уведомление? Обычный клик тут не подойдёт?
MVV писал(а):а экспериментировать с окнопрыгом с постоянно изменяемыми диалогами выбора файлов не хочется ни разу.
На это я даже не рассчитывал. Просто ты написал про параметры, я было подумал, что возможна подмена диалога.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

MVV писал(а):хотя я пока не вижу, как тотал получает уведомление о щелчке по пункту этого меню
На 99% уверен, что по возврату из TrackPopupMenu
Ответить