根据配置文件中,对一些功能的描述,可以动态的创建一些子菜单,来实现程序的灵活配置。但是需要注意,当动态的创建后,重绘界面时,需要删除掉软件的注册表信息,才可以实时的显示正确的界面。
以下是示例代码:
//读工程目录下的tool.ini配置文件
CString sPath = "";
CMenu *pMenu = CMenu::FromHandle(m_wndMenuBar.GetDefaultMenu());
CMenu *pToolMenu = pMenu->GetSubMenu(4);
//菜单
if (1 != pApp->m_bEnable) //配置
{
CMenu* pMeaTool = pMenu->GetSubMenu(3);
if (pMeaTool) pMeaTool->DeleteMenu(ID_CAL_MPSS, MF_BYCOMMAND);
}
sPath.Format("%s\\tools.ini", pApp->m_sAppFounderPath);
char pData[256];
for (int i = 0; i < 3; i++)
{
CString strKey="";
strKey.Format("tool%d", i);
m_UserCommand[i].bEnable = GetPrivateProfileInt(strKey, "enable", 0, sPath);
memset(pData, 0, 256);
GetPrivateProfileString(strKey, "arguments", "", pData, 256, sPath);
m_UserCommand[i].sArg = pData;
memset(pData, 0, 256);
GetPrivateProfileString(strKey, "command", "", pData, 256, sPath);
m_UserCommand[i].sOrder = pData;
memset(pData, 0, 256);
GetPrivateProfileString(strKey, "directory", "", pData, 256, sPath);
m_UserCommand[i].sDirPath = pData;
memset(pData, 0, 256);
GetPrivateProfileStringA(strKey, "menu", "", pData, 256, sPath);
m_UserCommand[i].sMenuName.Format("%s",pData);
m_UserCommand[i].nRelaDir = GetPrivateProfileInt(strKey, "reladir", 0, sPath);
}
BOOL bAdd = FALSE;
if (m_UserCommand[0].bEnable==TRUE || m_UserCommand[1].bEnable == TRUE || m_UserCommand[2].bEnable == TRUE)
{
bAdd = pToolMenu->AppendMenuA(MF_SEPARATOR);
}
if (m_UserCommand[0].bEnable)
{
bAdd = pToolMenu->AppendMenu(MF_STRING, ID_TOOL_USER1, TEXT(m_UserCommand[0].sMenuName.GetBuffer(0)));
}
if (m_UserCommand[1].bEnable)
{
bAdd = pToolMenu->AppendMenu(MF_STRING, ID_TOOL_USER2, TEXT(m_UserCommand[1].sMenuName.GetBuffer(0)));
}
if (m_UserCommand[2].bEnable)
{
bAdd = pToolMenu->AppendMenu(MF_STRING, ID_TOOL_USER3, TEXT(m_UserCommand[2].sMenuName.GetBuffer(0)));
}
DrawMenuBar();
// m_wndMenuBar.CreateFromMenu(pMenu->GetSafeHmenu(), TRUE, TRUE);
if (1 == pApp->m_bDeleteReg)
{
//删除注册表内容 可以实时更新界面的变化
RegDeleteTree(HKEY_CURRENT_USER, "SOFTWARE\\inc\\摄影测量系统");
}