Add(MainForm,2953706,126,70)
{
}
Add(MenuEx,3447409,322,175)
{
Menu=#4:меню|4:меню|4:меню|4:меню|0:|
Font=[Calibri,12,0,0,204]
SelCheckColor=128
Bitmaps=[]
Point(doIdxHighlight)
link(MenuItemIdx,14021391:doGetString,[(366,181)(366,131)(107,131)(107,195)])
}
Add(Str_Enum,4778939,182,175)
{
Delimiter=""
link(onEnum,6631447:doConvert,[])
}
Add(MathParse,4657920,182,217)
{
DataCount=1
MathStr="%1 - 1"
ResultType=0
Point(reCalc)
link(X1,4778939:NumSubStr,[])
}
Add(Convertor,6631447,224,175)
{
Mode=1
link(onResult,8466411:doAdd,[])
}
Add(StrList,14021391,126,147)
{
Strings=#4:1000|4:0100|4:0010|4:0001|
Point(doGetString)
Point(onGetString)
link(onGetString,4778939:doEnum,[(167,160)(167,181)])
}
Add(MT_Add,8466411,273,175)
{
InputMT=1
link(onAdd,3447409:doIdxHighlight,[])
link(Data,4657920:reCalc,[(279,163)(240,163)(240,261)(195,261)])
}
Этот топик читают: Гость
|
Ответов: 1536
Рейтинг: 176
|
|||
|
Нужно, чтобы подсвечивалась только выбранный пункт меню, всё остальное "тухло".
|
|||
| карма: 1 |
| ||
| файлы: 1 | меню.gif [744.6KB] [1053] |
|
Ответов: 1946
Рейтинг: 175
|
|||
|
Да тут проблема в KOL.
Кто разбирается: зайдите на 897 строчку файла XPMenus.pas и ниже добавьте такой код: Чтобы получилось: Вы увидите, что сообщение выдаёт каждый раз единицу! Т.е. снять состояние (флаг) подсветки невозможно, а оно реализуется в kol. ------------ Дoбавленo в 11.10: Оказывается, проблема даже не в KOL, а в windows. Кто хочет копнуть глубже: 1. В КОЛ есть описание: 2. Также есть реализация: 3. Задействуется ф-ция SetInfo: 4. И вот тут ф-ция винды SetMenuItemInfo, которая и выдаёт такой косяк, как описывает LeonCrew здесь: http://rsdn.ru/forum/winapi/2209306.all Возникла проблема, не возможно снять установленый флаг "подсветки" итема меню. Устанавливается очень просто: memset(&mmi, 0, sizeof(MENUITEMINFO)); mmi.cbSize = sizeof(MENUITEMINFO); mmi.fMask = MIIM_STATE; mmi.fState = MFS_HILITE; SetMenuItemInfo(hMenu, m_iOverMenuItemId, FALSE, &mmi); И сбрасываться должен просто: memset(&mmi, 0, sizeof(MENUITEMINFO)); mmi.cbSize = sizeof(MENUITEMINFO); mmi.fMask = MIIM_STATE; mmi.fState = MFS_UNHILITE; SetMenuItemInfo(hMenu, m_iOverMenuItemId, FALSE, &mmi); Нигде никаких ошибок не возвращает, просто не сбрасывается флаг и все... Решил подсмотреть как делает MS в данном случае, но там оказалось все гениально просто, они напрямую работают со структурой итема и не используют никакие функции. Тогда решил посмотреть, а как реализована сама функция SetMenuItemInfo и вот тут удивился.... ... if (lpmii->fMask & MIIM_STATE) { /* * Preserve private bits (~MFS_MASK). * Also preserve MFS_HILITE | MFS_DEFAULT if already set; if not set, * let the caller turn them on. */ UserAssert(!(lpmii->fState & ~MFS_MASK)); pItem->fState &= ~MFS_MASK | MFS_HILITE | MFS_DEFAULT; pItem->fState |= lpmii->fState; if (pItem->fType & MFT_SEPARATOR) pItem->fState |= MFS_DISABLED; fRedraw = TRUE; } ... Получается, что единожды установленый флаг MFS_HILITE или MFS_DEFAULT больше не сбрасывается... Кто как решил данную проблему "подсветки" итема? Вывод: стандартными средствами это не исправить (поправьте, если ошибаюсь). Надо искать обходные пути. |
|||
| карма: 10 |
|
|
Ответов: 9906
Рейтинг: 351
|
|||
|
Ну вот...
А то сразу kol, kol ... ------------ Дoбавленo в 12.14: И ведь что занимательно: сбросить подсветку таки можно. Если почесать левой ногой правое ухо |
|||
| карма: 9 |
|
|
Ответов: 1536
Рейтинг: 176
|
|||
|
Получается, программно подсветку установить можно, а вот снять, только ручками.
|
|||
| карма: 1 |
|
|
Ответов: 9906
Рейтинг: 351
|
|||
|
Получается, что через SetMenuItemInfo -- фигу с маслом.
Теоретически, существует еще HiliteMenuItem, но у меня чего-то нет настроения для тренировки на ней. Без гарантированного результата ... Может у nesco такое настроение будет (его же элемент). |
|||
| карма: 9 |
| ||
| Голосовали: | 3042 |
|
Ответов: 1946
Рейтинг: 175
|
|||
|
Ещё можно сделать так. Поскольку отрисовкой выделения занимается наш файл XPMenus.pas (ф-ция _DrawItem), то эта ф-ция может определять выделенность не по флагу odsHotList (т.е. не по Menu.Items[Idx].Highlight), а по собственному флагу - глобальной переменной. По doHighlight в такую переменную будет записываться true/false, а _DrawItem будет её считывать и уже на её основе решать, рисовать выделение или нет.
Единственная опаность - не помешает ли это выделению, которое происходит не по doHighlight, а, например, по проведению над меню мышью. Но это тоже можно решить с помощью комбинации odsHotList и собственной глобальной переменной. |
|||
| карма: 10 |
|
|
Разработчик
Ответов: 26322
Рейтинг: 2147
|
|||
|
Galkov писал(а): Может у nesco такое настроение будетНикакого желания чего-то ковырять в настоящее время нет, от слова совсем. |
|||
| карма: 22 |
|
|
Ответов: 1946
Рейтинг: 175
|
|||
|
Вот пример с HiliteMenuItem
Или так: Но оба варианта хорошо работают, лишь когда нет вложенных пунктов. Иначе получается фигня. С чем это может быть связано? |
|||
| карма: 10 |
|
|
Ответов: 1946
Рейтинг: 175
|
|||
|
ser_davkin, вот программное решение проблемы:
code_37176.txt Суть здесь в том, что скрытие/показ пункта реализуется в КОЛ через его удаление и создание заново с теми же параметрами. А так как мы перед скрытием сняли флаг подсветки, то и появляется пункт заново без подсветки. А вот без удаления пункта просто снять подсветку, как уже говорил, не удастся. |
|||
| карма: 10 |
| ||
| файлы: 1 | code_37176.txt [783B] [734] | ||
| Голосовали: | ser_davkin |
|
Ответов: 1536
Рейтинг: 176
|
|||
|
3042 писал(а): вот программное решение проблемыGalkov писал(а): Если почесать левой ногой правое ухо |
|||
| карма: 1 |
|
10



Поиск
Друзья
Администрация