В свое время меня очень заинтересовал плагин от NeoReel. Как всем известно, созданные утилиты помещаются в отдельный пункт главного меню Open Reality, но NeoReel переименовал этот пункт. Я решил проделать тот же трюк и получилось.

mymenu
Мой вариант переименования заключается в следующем. В MoBu запускается плагин-менеджер. Пример такого плагина можно найти в Samples к OpenReality SDK в директории
\miscellaneous\custommanager_template

?дея такая — находим хэндл MoBu окна, получаем хэндл на главное меню и переименовываем нужный нам пункт меню. Кстати подпункты также можно настроить под себя с помощью WinAPI.

1) получение билдеровского окна

Алгоритм нахождения нужного окна пришлось расположить не в вызове FBCreate, а в событие EventIdle. Дело в том, что в момент инициализации менеджера, интерфейс Mobu еще не до конца инициализирован.

1
2
3
4
5
6
7
FBSystem lSystem;
lSystem.OnUIIdle.Add( this, (FBCallback) &ToolManager::EventIdle );
...
if (mFirstLoad) {
EnumWindows( EnumProc, 0 );
mFirstLoad = false;
}

2) пишем обработчик поиска окна, где в случае успеха, получаем хэндл на главное меню и переименовываем Open Reality.

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
BOOL CALLBACK EnumProc( HWND hwnd, LPARAM lParam )
{
char szTitle[MAX_PATH];
GetWindowText( hwnd, szTitle, MAX_PATH );

if (strstr( szTitle, "MotionBuilder" ) != NULL)
{
//-- store motion builder window handle
a_gWnd = hwnd;

HMENU lMenu = GetMenu( hwnd );
if (!lMenu)
return true; // continue searching
MENUITEMINFO mii;

int itemsCount = GetMenuItemCount( lMenu );
UINT Id;
char szMenuString[255];

for (int i=0; iId = GetMenuItemID( lMenu, i );
GetMenuString( lMenu, i, szMenuString, 255, MF_BYPOSITION );

if (strstr( szMenuString, "&Open Reality" ) != NULL )
{
mii.cbSize = sizeof( mii );
mii.fMask = MIIM_STRING;
mii.dwTypeData = szMenuString;
mii.cch = 255;

GetMenuItemInfo( lMenu, i, TRUE, &mii );

sprintf( szMenuString, "&My Menu" );
if ( SetMenuItemInfo( lMenu, i, TRUE, &mii ) == 0 )
{
printf( "error while renaming menu\n" );
DisplayErrorText( GetLastError() );
}

//
// build custom menu
//
// You could add here your own menu items
}
}

//-- redraw main menu bar
DrawMenuBar( hwnd );

return false;
}

return true;
}

Вот такой трюк, удачи!

Переименование OpenReality меню
Метки:                

9 thoughts on “Переименование OpenReality меню

  • Среда Март 17, 2010 на 13:02
    Постоянная ссылка

    i see, well i guess i can explain a litte more in depth :).

    so i do get a handle for the motionbuilder window but then GetMenu() just returns a 0x000000 adress. is there another way to get this menu handle perhaps?

    i was wondering what version of motionbuilder you’ve done this in.

    and i really dont understand this line:

    a_gWnd = hwnd;

  • Среда Март 17, 2010 на 17:16
    Постоянная ссылка

    cause 2010 is built on the Qt framework… there might be another way to access to a menu bar, which is in progress…
    You could try to do that if you would like
    1. MoBu handle you have to convert to a Qt widget
    QWidget *pWidget = QWidget::find( (WId) hwnd );
    2. When there is a way to see widget className
    const QMetaObject* metaObject = pWidget->metaObject();
    const char *className = metaObject->className();
    printf(className);
    3. By going through main widget children, search onto QMenu or QMenuBar item to get access on it
    4. These might be enough to add new menu actions

  • Среда Март 17, 2010 на 17:25
    Постоянная ссылка

    Qt is in 2010…
    If you will have any progress with that, share it please with me if It’ll be possible for you of course…

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *