|
Irokez
|
|
Определить вкладку под курсором15.08.2006, 21:14. Показов 7042. Ответов 22
Метки нет (Все метки)
Привет всем.
Мне нужно вывести попуп меню при правом клике на вкладке tabstrip. С этим проблем нет, но нужно показывать разные меню в зависимости от вкладки. Вопрос в том, как в событии MouseDown определить на какой именно вкладке находиться указатель мыши. Подобная ситуация была с тулбаром, но там ширина кнопок одинакова, и они, в отличии от вкладок, не сдвигаются вправо-влево. Одним словом: ХЕЛП |
|
| 15.08.2006, 21:14 | |
|
Ответы с готовыми решениями:
22
Символ под курсором в чужом окне Открыть\закрыть вкладку модемы, считать эту вкладку
|
|
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
|
|
| 15.08.2006, 21:39 | |
|
Irokez,
Вообще-то, стандартное (ожидаемае) попап меню должно выскакивать на активную вкладку. Как это ожидать какое-то меню от неактивного элемента? Это как-то против правил... Да, а такие меню, если я хорошо помню, пишутся для Mouse_Up VladConn
0
|
|
|
Irokez
|
|
| 15.08.2006, 21:49 | |
|
аналог такой панели есть в Опере. (в 1С и, думаю, есть еще примеры)
там открывается меню для вкладки, не зависимо от того активна она или нет. Про маусап согласен, но это дела не меняет, так как при щелчке правой кнопкой вкладка не активизируется всеравно. |
|
|
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
|
|
| 15.08.2006, 22:03 | |
|
Irokez,
Я могу повторить опять: это нестандартное поведение GUI. И что потом делать с меню? Вызывать его какой-то пункт? Так вкладка неактивна. Делать меню с мертвыми пунктами и одним живым - на активацию вкладки? Это странно - меню на активацию вкладки: т.е. кликни правой, потом левой. Так проще сразу левой. VladConn
0
|
|
|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
| 15.08.2006, 22:38 | |
|
На самом деле есть смысл в словах Irokez.
К примеру, в Visual Studio 2005. Меня всегда бесило, что для того чтобы закрыть вкладку мне обязательно нужно ее выбрать. Т.е. она выбирается сама, хотя закрытие вкладки происходит по среднему клику мыши. А если на вкладке дизайн большой формы, то приходится ждать N секунд, что, мягко говоря, неудобно. Т.к. в стандартном TabStrip по клику правой кнопкой выбор вкладки не происходит, то, думаю, нет никого другого выхода, кроме как сабкласить эту вкладку и все клики правой кнопкой "переделывать" в клики левой. Правда, тем самым будет достигнут именно тот эффект, который я описал выше, но иного выхода я не знаю.
0
|
|
|
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
|
|
| 15.08.2006, 22:45 | |
|
Alexej Spirin,
Мы наверноe подразумеваем разное: я не знаю, как можно закрыть вкладку в тэбстрип, кликая на нее. Если на открытую вкладку кликать, то она никуда не исчезает. Кстати, именно потому, что то, что хочет Irokez, было бы нестандартное, неожидаемое поведение контроля, и нет легко доступного способа его исполнить. VladConn
0
|
|
|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
| 15.08.2006, 22:50 | |
|
> я не знаю, как можно закрыть вкладку в тэбстрип, кликая на нее.
Я имел ввиду Visual Studio 2005. Там окна - вкладки. Ну потипа как в Опере. Полностью согласен, что у Irokez НЕстандартная задача. Но думаю, что все-таки можно ее решить так, как я написал выше.
0
|
|
|
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
|
|
| 15.08.2006, 23:13 | |
|
OK, давай обсуждать задачу с табстрип, а не с окнами в Опере. Вот и задается встречный вопрос: а зачем это надо? И насколько это надо? Вот посмотри: есть правила движения (как и правила постройки GUI), все едут в правой полосе, останавливаются на зеленый и т.д. Вдруг один водитель решил поправить правила: вместо огней поворота, например, махать газетой - заодно и мух отгонит. И ехать по левой стороне - так бывает иногда короче. Что произойдет? Произойдут житейские проблемы. Внезапно окажется, что трудно управлять машиной, и в целом поездка окажется более длительной или наоборот, слишком быстро закончится. В стандартных контролях, если следовать стандартам интерфейса, нет ничего такого, чтобы затрудняло их кодирование. Я не имею ввиду мультипликацию, игры, фантастику, чего-то необычного. Я имею ввиду приложение для работы в оффисе.
0
|
|
|
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
|
||||||
| 15.08.2006, 23:41 | ||||||
|
Но уж коли пошла такая пляска:
0
|
||||||
|
Irokez
|
|
| 16.08.2006, 13:22 | |
|
2VladConn
Я согласен, что для табстрип моя задача ну совсем не стандартная, но для панели окон - очень даже обычная. Я, наверное, не прав, что для панели окон решил приспособить табстрип и подозреваю, что ребята из Оперы делали что-то свое, но уж очень велик соблазн использовать именно этот контрол в виду его почти 100-процентной схожести и возможностей настройки. И он меня на все сто удовлетворяет, кроме сабжевой проблемы. Теперь по поводу твоего решения. Об этом я сказал еще в первом посте. Пока вкладок мало - никаких проблем, но как только их становится больше , чем может вместить родительская форма - появляются две кнопочки со стрелками и первая вкладка уезжает за край формы. Вот тут твой алгоритм (как и любой, основанный на определении ширины вкладок) даст неправильный результат. Так что пока я считаю вопрос открытым. |
|
|
Comanche
|
|
| 16.08.2006, 13:29 | |
|
2 Irokez:
В ответ на NM_RCLICK (ну или на бэйсиковский Mouse_Down при правой кнопке) шлёшь TCM_HITTEST и ловишь return value от SendMessage(). А вообще - советую: MSDN Home > MSDN Library > Win32 and COM Development > User Interface > Windows Shell > Windows Controls > Individual Control Information > Tab Controls (или другой интересующий тип контрола) > Tab Controls Reference > Messages (или Notifications) |
|
|
Irokez
|
|
| 16.08.2006, 16:29 | |
|
2Comanche
Спасибо. Это именно то что нужно. И за совет спасибо. Но вот возникли траблы с реализацией. Вот мой код: Public Type POINTAPI x As Long y As Long End Type Public Type TCHITTESTINFO pt As POINTAPI flags As Long End Type Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long ' какой тип должен быть у lParam? что я только не лепил - ошибка и все. Private Sub Tabs_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) Dim a As RECT, b As POINTAPI Dim lngReturn As Long, num As Long, wHWND as long Dim nn As TCHITTESTINFO If Button = vbRightButton Then nn.pt.x = x nn.pt.y = y num = SendMessage(ttt.hwnd, TCM_HITTEST, 0, nn) Call GetCursorPos(b) 'у меня хендел окна вписан с префиксом в key закладки wHWND=CLng(Mid(tabs.Tabs(num).key, 2)) lngReturn = TrackPopupMenu(GetSystemMenu(wHWND, False), TPM_LEFTBUTTON Or TPM_RIGHTBUTTON Or TPM_RETURNCMD, b.x, b.y, 0, wHWND, a) SendMessagebyLong wHWND, WM_SYSCOMMAND, lngReturn, 0 End If End Sub Если можно тоже самое сделать проще - подскажите. И, кстати, где можно найти значения констант? А то я в яндексе ищу, а это чревато ошибками. В мсдне написано, что в файле commctrl.h, но где его взять?.. Нашел пример на делфи - переделал, вроде, а что-то не то... |
|
|
Comanche
|
||||||
| 16.08.2006, 18:25 | ||||||
|
||||||
|
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
|
|
| 16.08.2006, 20:40 | |
|
Ладно, в таком случае можно просто брать ширину формы, когда сумма ширин вкладок ее превышает. Впрочем, Comanche как спец в API, дал очевидно более элегентный ответ.
0
|
|
|
Irokez
|
|
| 16.08.2006, 22:28 | |
|
Оч странно, но у меня пишет "Несовпадение типов" когда тип Any
что посоветуете? |
|
|
Comanche
|
|
| 19.08.2006, 18:12 | |
|
А у тебя точно VB 6.0? м.б. ты всё это под VBA или VB5 делаешь? по-моему, возможность указывать в API-декларациях "Any" в качестве типа появилась только в VB6... хотя не уверен на все сто...
|
|
|
0 / 0 / 0
Регистрация: 21.05.2009
Сообщений: 101
|
|
| 19.08.2006, 18:54 | |
|
была у меня такая же проблема, т.е. сделать панель MDI. сделал ее из контрола C1Tab от фирмы ComponentOne. там есть свойство MouseOver (определяет кнопку, над которой находится курсор), на которое я вешал всплывающую подсказку для кнопки. вот в принципе и всё. есть правда одна проблемка - контрол не бесплатный, но это легко решается
0
|
|
|
1 / 1 / 1
Регистрация: 18.06.2008
Сообщений: 329
|
|
| 20.08.2006, 11:43 | |
|
Можно активизировать вкладку так:
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cbuttons As Long, ByVal dwExtraInfo As Long) Private Const MOUSEEVENTF_LEFTDOWN = &H2 Private Const MOUSEEVENTF_LEFTUP = &H4 '————————————————————————— mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0&, 0&, 0&, 0&
0
|
|
|
1 / 1 / 1
Регистрация: 18.06.2008
Сообщений: 329
|
|
| 20.08.2006, 11:54 | |
|
Да, еще DoEvents может потребоваться.
mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0&, 0&, 0&, 0& DoEvents MsgBox Tab1.Tab
0
|
|
|
Irokez
|
|
| 21.08.2006, 20:06 | |
|
2 Labuda
А вот этого мне не надо! Я хочу чтобы за мои программы платили, и поэтому не хочу воровать чужие. ))) 2 Letter_D Все дело в том, что я не хочу активизировать вкладку. Мне просто нужно ее свойство КЕУ |
|
| 21.08.2006, 20:06 | |
|
Помогаю со студенческими работами здесь
20
Определить, что находится под курсором
Как определить цвет под курсором Определить какая панель под курсором.
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|