Отображение информации о выделенном меню...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Отображение информации о выделенном меню...

Сообщение BV » 16.05.2005 (Пн) 21:21

Как реализовать отображение информации на StatusBar’е о каком-либо пункте меню, когда на этот пункт наводишь курсор?

Для примера можно открыть WordPad, меню "Файл", навести курсор на подменю "Открыть" и на StatusBar’е появится текст: "Открытие существующего документа".
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.05.2005 (Пн) 21:32

Нужен сабклассинг.
К толстой книге Аппельмана прилагается пример конкретно того, что тебе нужно - но он использует платную Desaware SpyWorks и в чистом виде не запустится. Выкладывать код?
Изображение

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 16.05.2005 (Пн) 21:34

BV
Создаешь панель в Custom, в дизайн-тайме.

Потом пишешь в нужном месте,
Код: Выделить всё
StatusBar1.Panels(1).Text="Куку"
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 16.05.2005 (Пн) 21:37

Вчитался... Проблема, найти это самое нужное место :)
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 16.05.2005 (Пн) 22:07

2 tyomitch

Если это единственный способ, то выложи...
Но может есть что-то ещё?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.05.2005 (Пн) 23:55

BV писал(а):2 tyomitch

Если это единственный способ, то выложи...
Но может есть что-то ещё?

Ой, я ступил, там без исходников :-(

Ну просто нужно обрабатывать WM_MENUSELECT
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 17.05.2005 (Вт) 0:11

Многоговорящий ответ... :)
Ну словлю я этот WM_MENUSELECT, и что мне с ним делать-то дальше?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.05.2005 (Вт) 6:13

Что, что :)
Посмотри наше PopupMenu 2, там событие SelectionChange есть :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.05.2005 (Вт) 8:16

BV писал(а):Многоговорящий ответ... :)
Ну словлю я этот WM_MENUSELECT, и что мне с ним делать-то дальше?

См. пост FAKK2 ;-)
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 17.05.2005 (Вт) 10:36

Спасибо за ответы.
Но мне всё ещё не понятно кое-что:

2 GSerg

Вот PopupMenu 2 это что и это где?... :roll:
Ведь в обычном меню события сводятся к одному - Click...
На пять букв посылать не надо - был: подходящих тем не найдено...


2 tyomitch

Да нет же, вот если я получу это сообщение, как мне узнать, какое именно меню сейчас выделенно? Это передаётся в xParam'мах?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.05.2005 (Вт) 10:42

PopupMenu на кирпичном заводе, весьма рекомендую ознакомиться.
Lasciate ogni speranza, voi ch'entrate.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 17.05.2005 (Вт) 12:43

2 alibek

Ну был я там - нет такой темы... :(
Может тема как-то иначе называется?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.05.2005 (Вт) 19:16

BV писал(а):Да нет же, вот если я получу это сообщение, как мне узнать, какое именно меню сейчас выделенно? Это передаётся в xParam'мах?

MSDN пропил, да? ;-)
Parameters
wParam
The low-order word specifies the menu item or submenu index. If the selected item is a command item, this parameter contains the identifier of the menu item. If the selected item opens a drop-down menu or submenu, this parameter contains the index of the drop-down menu or submenu in the main menu, and the lParam parameter contains the handle to the main (clicked) menu; use the GetSubMenu function to get the menu handle to the drop-down menu or submenu.
The high-order word specifies one or more menu flags. This parameter can be one or more of the following values.
MF_BITMAP Item displays a bitmap.
MF_CHECKED Item is checked.
MF_DISABLED Item is disabled.
MF_GRAYED Item is grayed.
MF_HILITE Item is highlighted.
MF_MOUSESELECT Item is selected with the mouse.
MF_OWNERDRAW Item is an owner-drawn item.
MF_POPUP Item opens a drop-down menu or submenu.
MF_SYSMENU Item is contained in the window menu. The lParam parameter contains a handle to the menu associated with the message.

lParam
Handle to the menu that was clicked.
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 17.05.2005 (Вт) 20:15

2 tyomitch

Э... :oops: Да нет... Я не пьющий...
Спасибо! :)

У меня ещё только один вопрос: как реализовать отображение информации на StatusBar’е о какой-либо кнопке на ToolBar'е, когда на неё наводишь курсор?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 19.05.2005 (Чт) 11:25

2 tyomitch

Попробую спросить иначе: подскажи, какое сообщение мне ловить для ToolBar'а? Ну не знаю я...
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.05.2005 (Чт) 13:41

А что, MouseMove не возникает?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 19.05.2005 (Чт) 17:58

Возникает, но там же передаются координаты и состояние кнопок мыши... и только. А как мне узнать, над какой кнопкой ToolBar'а в данный момент находится курсор?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.05.2005 (Чт) 20:58

Возьми код с http://bbs.vbstreets.ru/viewtopic.php?p=61325#61325 , только замени MouseDown на MouseMove
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 19.05.2005 (Чт) 22:00

Взял код, заменил процедуру (тестировал на ToolBar'е CommonControls 5.0 с 10 разными кнопками), в отладке пишет только "Попали в кнопку 0", независимо от того, над чем курсор...

Да... Проверял на Win98 SE в VB 6.0...


Да что, никто никогда не сталкивался с этим?! Никто не пользовался ToolBar'ом? Что - совсем никто не знает?...
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 19.05.2005 (Чт) 22:14

Вон оно что! Этот метод работает только с CommonControls 6.0, блин!
А у меня везде CC 5.0, потому что CC 6.0 новому оформлению Windows XP не подлежат...


2 Гуры

Как мне проделать это на именно CommonControls 5.0?
Ведь можно как-то, точно можно!...
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.05.2005 (Чт) 23:34

BV писал(а):(тестировал на ToolBar'е CommonControls 5.0 с 10 разными кнопками)

Тогда измени класс с "msvb_lib_toolbar" на "ToolbarWindow32"
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 20.05.2005 (Пт) 12:56

И вот откуда ты всё знаешь? Спасибо. :)

Если ты не против, то я добавлю тебя в ‘Credits’ моей программы, но для этого мне нужно знать твоё Имя, Фамилию и e-mail.

И ещё – я Эпплмана не читал, но если эти знания оттуда, то обязательно прочту. Стоит ли?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.05.2005 (Пт) 13:03

1. Spy++ рулит
2. Буду очень рад :-) Чтобы узнать эту инфу, нужно кликнуть по кнопочке "www" внизу любого моего поста.
3. Нет, не оттуда - из MSDN :-)
Изображение

Black_T
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 17.01.2006 (Вт) 18:25

Сообщение Black_T » 22.01.2006 (Вс) 11:06

А ни у кого нет исходника с примером как в StatusBAR поместить информацию о кнопке Toolbara на которой находится сейчас курсор ?

Ведь допустим при наведении на кнопку, код выгладит довольно просто
Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
StatusBar1.SimpleText = "Command1"
End Sub

Код с http://bbs.vbstreets.ru/viewtopic.php?p=61325#61325
у меня почему-то не хочет запускаться, пишет
"Only comments may appear after End Sub, End Function, or End property"

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.01.2006 (Вс) 11:12

И куда же ты его вставил, что он это пишет?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Black_T
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 17.01.2006 (Вт) 18:25

Сообщение Black_T » 22.01.2006 (Вс) 11:29

GSerg

Сейчас поместил верхнюю часть в модуль,
нижнюю в форму.
Другую ошибку выдает на Dim pt As POINTAPI
"User defined type not defined"

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 22.01.2006 (Вс) 11:47

Потому что тип объявлен как Private. Убери это слово. И у функций его тоже нужно заменить на Public.
Нет ничего невозможного для человека с интеллектом.

Black_T
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 17.01.2006 (Вт) 18:25

Сообщение Black_T » 22.01.2006 (Вс) 12:03

Kostyan
Да, спасибо, разобрался
Теперь все ОК!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 159

    TopList