Robert писал(а) 17. Января 2007 :: 13:40:Уважаемый, Александр.
1. 1С, вроде бы, использует некую структуру, через которую можно получить доступ к тексту строки меню, иконке, тексту подсказки. Стандартное меню позволяет хранить значение DWORD для каждого пункта меню. Я предполагаю, что 1С в этом значении сохраняет ссылку на свою структуру. Что можете посоветовать?
Нет, в этом DWORD'е 1С зачем-то хранит ид команды, который и так можно получить.
Описание подсказки скорее всего лежит в ресурсах, в stringtable под этим номером.
Попробуй сделать
CString str;
str.LoadString(CmdID);Где лежит сама строка названия меню - скорее всего в CMenu7::m_stringMap, или m_ContextStringMap, или m_PopUpStringMap.
С иконкой сложнее:
Все иконки (панельки инструментов (основного окна, не форм), значки меню) лежат слитыми в виде одной длинной битмапы в тайном месте.
Рядом лежит массив, в котором перечисляются иды команд этих картинок.
Перебирая массив, находишь номер, под которым лежит иконка нужной команды, и можешь скопировать кусок из этой длинной битмапы.
А теперь код:
Первое, это заголовок класса:
class SECToolBarMgr : public SECToolBarManager
{
public:
// SECControlBarManager
SECMDIFrameWnd* m_pFrame;
// SECToolBarManager
CDWordArray m_enabledList; // List of windows which have been
// disabled (EnableMainFrame)
CPtrArray m_defaultBars; // Array of default toolbars
CPtrArray m_notifyWnds; // Wnd's to pass toolbar notifications
CWnd* m_pNoDropWnd; // Wnd that won't accept dropped btns
BOOL m_bMainFrameEnabled; // TRUE if EnableMainFrame called
BOOL m_bConfig; // TRUE if in toolbar customize mode
BOOL m_bToolTips; // TRUE if tooltips enabled
BOOL m_bFlyBy; // TRUE if flyby help enabled
BOOL m_bCoolLook; // TRUE if "Cool" look enabled
BOOL m_bLargeBmp; // TRUE if using large bitmaps
const void/*SECBtnMapEntry*/* m_pBtnMap; // Maps ID's to button types.
CObject* m_pObj; // Aux version of button map.
SECCustomToolBar* m_pConfigFocus; // Toolbar with current config focus
void/*SECCurrentCommand*/* m_pCmd; // Holds status about current command
UINT* m_lpMenuBarBtnIDs; // IDs for default menu bar layout
UINT m_nMenuBarBtnCount; // No. of btns in m_lpMenuBarBtnIDs
void* m_hz;
CBitmap m_bmp1; // Manages all our bitmap resources
int m_count1;
int m_resIDSmall;
int m_resIDBig;
UINT* m_cmdIDs;
int m_height;
int m_width;
CDC m_DC1;
CDC m_DC2;
CDC m_DC3;
CBrush m_brush;
CBitmap m_bmp2;
int m_count2;
CBitmap m_bmp3;
int m_count3;
};
Второе, как достучаться до него:
SECToolBarMgr* tlb=(SECToolBarMgr*)CTBManager::GetSECManager();
if(!tlb)
return;
// Здесь лежит битмапа с иконками:
tlb->m_bmp1;
// Здесь количество иконок:
tlb->m_count1;
// А здесь массив с идами команд для этих иконок:
tlb->m_cmdIDs;
// Это размеры одной иконки
tlb->m_height;
tlb->m_width;