Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/33: Рейтинг темы: голосов - 33, средняя оценка - 4.52
Irokez

Определить вкладку под курсором

15.08.2006, 21:14. Показов 7023. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем.



Мне нужно вывести попуп меню при правом клике на вкладке tabstrip.

С этим проблем нет, но нужно показывать разные меню в зависимости от вкладки.



Вопрос в том, как в событии MouseDown определить на какой именно вкладке находиться указатель мыши.



Подобная ситуация была с тулбаром, но там ширина кнопок одинакова, и они, в отличии от вкладок, не сдвигаются вправо-влево.



Одним словом: ХЕЛП
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.08.2006, 21:14
Ответы с готовыми решениями:

Символ под курсором в чужом окне
день добрый, спецам. сразу прошу прощения за возможно ламерский вопрос. а вопрос вот в чём - надо прописать в своём textbox'се символ из...

Открыть\закрыть вкладку модемы, считать эту вкладку
Здравствуйте одним из трёх способов открываю вкладку модемы 'control.exe — служит для работы с панелью управления 'telephon.cpl —...

VB 6 Как узнать класс текстбокса или кнопки находящегося под курсором
У кого нить есть код который показывает класс текстобокса или кнопки находящегося под курсором?

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
Но уж коли пошла такая пляска:
Code
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub TabStrip1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
    
    If x <= TabStrip1.Tabs(1).Width Then
            MsgBox TabStrip1.Tabs(1).Caption
    ElseIf x <= TabStrip1.Tabs(1).Width + TabStrip1.Tabs(2).Width Then
            MsgBox TabStrip1.Tabs(2).Caption
    ElseIf x <= TabStrip1.Tabs(1).Width + TabStrip1.Tabs(2).Width + TabStrip1.Tabs(3).Width Then
            MsgBox TabStrip1.Tabs(3).Caption
    Else
            MsgBox TabStrip1.Tabs(4).Caption
    End If
End Sub
VladConn
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
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Option Explicit
Private Type POINTAPI
  x As Long
  y As Long
End Type
Private Type TCHITTESTINFO
  pt As POINTAPI
  flags As Long
End Type
Private Const TCM_FIRST As Long = &H1300
Private Const TCM_HITTEST As Long = (TCM_FIRST + 13)
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
  ByVal hwnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  ByRef lParam As Any) As Long
' Есть ещё и такой вариант:
Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" ( _
  ByVal hwnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  ByVal lParam As Long) As Long
Private Sub TabStrip1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
  Dim num As Long
  Dim nn As TCHITTESTINFO
  
  If Button = vbRightButton Then
    nn.pt.x = x / Screen.TwipsPerPixelX
    nn.pt.y = y / Screen.TwipsPerPixelY
    num = SendMessage(TabStrip1.hwnd, TCM_HITTEST, 0, nn)
    Me.Caption = num
    '
    ' и т.д. .....
    '
  End If
End Sub
Скачай API Guide и API Viewer (см. Google) - там и функции, и константы, и примеры.
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

Все дело в том, что я не хочу активизировать вкладку. Мне просто нужно ее свойство КЕУ
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.08.2006, 20:06
Помогаю со студенческими работами здесь

Определить, что находится под курсором
Доброго времени суток!!! Как узнать находится ли в момент клика мыши, под курсором рамка заголовка?

Wxpython. Определить страницу под курсором
Использую wxpython для оконного приложения. Есть некий класс - LibPalette, который наследуется от wx.Notebook. Это окно вида (см. рис.) ...

Как определить цвет под курсором
как определить?

Определить какая панель под курсором.
Проблема следующая: при создании формы на ней в цикле создается сетка из множества панелей(20x40) procedure...

WxPython. wx.Panel. Определить что под курсором
С помощью wx.DC нарисовал контур фигуры (см. приложение) на wx.Panel. Вопрос: возможно ли (может быть с помощью каких-либо hit-тестов)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru