Прозоречни менюта в MFC (Microsoft Foundation Class Library)
Автор Socialnost.com
сряда, 22 септември 2010
Менюто е съвкупност от команди и настройващи параметри в програма, организирана във вид на списък или йерархия от списъци създадена с цел бърз и лесен достъп до потребителя. Отделните елементи на менюто се нари1ат избор(option) или единица (item). Менюто обикновено се поставя с едно действие на потребителя. Изборите обикновено са текстови и се посочват от мишката,стрелки от клавиатурата или буква от тяхното име. Когато менюто има голям брой избори те се групират тематично и се показват само имената на темите. При избор на тема се показва нейното под меню. Така се получават падащи (pull-down, drop-down),менюта или каскадни (излизащи настрани). Скритите менюта появяващи се при положение на потребителя се наричат изскачащи (pop-up). Ако те имат различни избори според мястото , където изскачат се наричат контекстни. Един основен прозорец на приложение може да има лента с прозоречно меню, горния ляв ъгъл системно меню, а може да има и контекстно меню викащо се с десен бутон на мишката. От гледна точка на програмата прозоречното меню се нарича приложно меню от най – високо ниво а, под менютата се наричат падащи (drop-down) менюта. На всеки избор от менюто съответства цяло число наречено идентификатор на меню единица (item - ID). В MFC има клас CMenu за работа с менюта. Този клас има публична член – данна hMenu , която е манипулатор на менюто. 1. Прозоречно меню в програмата се записва: А)програмно – създава се обект на CMenu ч/з ф-циiтe CreateMenu(),InsertMenu() и др. се създава празно меню и последователно се прибавят неговите единици. Б)програмно – индиректно – дефинират се и се инициализират серия от записи struct на библиотеката APIWin 32, които дефинират структурата и изборите на менюто и ч/з член-ф LoadMenuIndirect() се зарежда в прозореца и се показва. В)чрез ресурсния редактор – се изграждат ресурси на менюто. Тези ресурси имат идентификатор който се използва за да могат ресурсите да се свържат с обект на CMenu. Когато създаваме начално приложение с Аpp Wizard в основния му прозорец има меню с ресурсен идентификатор IDRMainFrame . един начин да се зареди меню от най- високо ниво в основния прозорец е да се използва функцията CFrameWnd::Create(), която създава самия прозорец Create(NULL”My application”WS_OVERLAPPEDWINDOW,rectDefalt,NULL,MAKEINRESOURCE(IDR_MAINFRAME)).Друг начин с функцията CFrameWnd::LoadFrame() – задава прамка на прозореца LoadFrame (IDR_MAINFRAME.WS_OVERLAPPEDWINDOW,NULL,NULL) Г)да се създаде обект на CMenu menu; Menu.LoadMenu(IDR_MAINFRAME); SetMENU(&menu); DrawMenuBar(); Menu.Detach(); - развързваме менюто от обекта ,менюто става независимо CMenu menu Short, menuLong; menuShort.LoadMenu(IDR_SHORTMENU); menuLong.LoadMenu(IDR_LONGMENU); if(bMenuType) – според някакво условие SetMenu(&menuLong) зареждаме Else SetMenu(&menuShort); DrawMenuBar(); 2.Отговаряне на изборите в менюто – когато потребителя избира от менюто Window генерира серия от съобщения(sms-смс) WM_INITMENU – потребителя е щракнал в/у избор от най – високо ниво WM_INITMENUPOPUP – появява се преди да се покаже падащото меню WM_MENUSELECT – появява се при посочване, но без избиране на меню единица WM_COMMAND – при избор на меню единица Носи във себе си идентификатор на меню 1. чрез клас Wizard можем да създадем функция на това съобщение void CMainFrame::OnCommand(WPARAM wParam,LPARAM lParam) { if (wParam==ID_FILE_OPEN){//обработка на File->Open}} Друг начин да отговорите на избор в меню е в ClassWizard да свържем ID-то на избора с действието (ID_FILE_OPEN със ON_COMMAND) и ще има вида Void CMainFrame::OnFileOpen(){//обработка File->Open} Понякога е удобно да се обработят няколко подобни избора с една и съща функция Color Red ID_COLOR_RED Green ID_COLOR_GREEN Blue ID_COLOR_BLUE UINT nID=(UINT)LOWORD(getCurrentMessage()->wParam);взимаме ID-то на избора =>switch(nID) {case ID_COLOR_RED;//обраборка на Color->Red Break; Case ID_COLOR_GREEN;}} Ако ID –тата имат поредни стойности то можем да направим една обща функция като свържем ID-то с най-малка стойност и действието ON_COMMAND_RANGE Void CMainFrame::OnColor(UINT nID){ UINT nCurrentColor= nID_ID_COLOR_RED; Switch(nCurrentColor){ Case 0; break case;}} 3.Промяна на избор на меню в MFC (Microsoft Foundation Class Library) – един начин за да се промени избор на меню е чрез обект на менюто. Например поставянето на отметка пред избора Red става по следния начин CMenu *pMenu=GetMenu(); pMenu->CheckMenuItem(ID_COLOR_RED,MF_CHECKED) най – добре промените в падащото или изскачащото меню е да се извърши в момента на тяхното показване, тогава се генерира смс WM_MENUPOPUP, за което можем да направим функция. Void CMainFrame::OnInitMenuPopup(CMenu *pMenu Pop Up, UINT nIndex,BOOL b SysMenu){if (!b SysMenu &&(nIndex==COLOR_MENU_INDEX)){ pMenuPopup->CheckMenuItem(ID_COLOR_RED,MF_CHECKED); pMenuPopup->CheckMenuItem(ID_COLOR_GREEN,MF_CHECKED); }} nIdex – индекс на менюто от най – висок ранг bSysMenu – системно меню на прозореца. Друг начин да свържем ID-то на съответния избор с действието On_UPDATE_COMMAND. Създава се функция Void CMainFrame::OnUpdateColorRed(CCmdUT*pCmdUI->SetCheck());}-задаваме пред Red да има отметка. pCmdUI – указател сочещ обект към избора на менюто. Този обект има следната член-ф CCmndUI::SetCheck() – слага или маха отметка към избора ::Enable()- активира или деактивира избор SetRadio() – слага или маха точка предименюто SetText() – променя текста на менюто
Любопитно: Преди да продължим с менютата и прозорците в Microsoft Foundation Class Library, научете повече какво е кеш памет и кеширане на информация и данни в компютърните системи.
4.Програмно запълване или модифициране на менюто – когато менюто зависи от състоянието мойе да се зададе програмно и да се попълни с единици. CMenu menuMian; - създаваме обекта на главното меню menuMain.CreateMenu(); - то е празно CMenu menuuPopup(); menuPopup.CreateMenu(); - празно под меню menuPopup.AppendMenu(); - добавяме елементи в подменюто (MF_STRING,ID_TOOLS_ADD,”&Add”); menuMain.AppendMenu(MF_POPUP,(UINT)menuPopupDetach(),”&Tools”); - освобождаваме менюто menuPopup.CreateMenu() – създаваме ново подменю menuPopupAppenMenu(MF_STRING,ID\_SHAPE_CIRCLE,”&Circle”); menuMain.AppendMenu(MF_POPUP,(UINT)menuPopup.Detach(),”&Shape); След като създадем структурата с SetMenu го свързваме с прозореца, DrawBar – рисуваме го в прозореца и освобождаваме обекта с Detach(); SetMenu(&menu Main); DrawMenuBar(); Menju.Main.Detach(); Класът CMenu има следните ф-ции за модификации на менюто CMenu::AppendMenu() – вмъква 1-ца в края му ::InsertMenu() – вмъква 1-ца на оказаното място ::ModifyMenu() – променя текста или друга характеристика ::DeleteMenu() – изтрива избор от менюто и под меню свързано с този избор ::RemoveMenu() – изтрива избор от менюто CMenu *pMenu=getMenu() – този указател да сочи менюто pMenu->DeleteMenu(1,MF_BYPOSITION); pMenu->DeleteMenu(IP_SHAPE_CIRCLE,MF_BYCOMMAND); Модификация на избор pMenu->ModifyMenu(ID_TOOLS_ADDMF_STRING\MF_BYCOMMAND,ID_TOOLS_MUL,&Multiple);
По време на вечерята в петък с широк консенсус са били обсъдени темите за Иран, ядрените амбиции на Северна Корея, и размириците в Сирия
Съдбата на Еврозоната - в дневния ред на срещата на Г-8 По време на вечерята в петък с широк консенсус са били обсъдени темите за Иран, ядрените амбиции на Северна Корея, и размириците в Сирия
Участие са заявили 13 национални, 29 регионални и 22 общински музея
Нощ на музеите са осми път в София Участие са заявили 13 национални, 29 регионални и 22 общински музея
Това е изключителен успех за българската природозащита
Първо гнездо на белоглави лешояди в Стара планина от 50 г. насам Това е изключителен успех за българската природозащита
Велико Търново, Русе, Търговище, Разград, Силистра, Шумен, Добрич, Варна, Бургас, Сливен, Ямбол, Хасково и Кърджали
Жълт код за обилни валежи е обявен в 13 области Велико Търново, Русе, Търговище, Разград, Силистра, Шумен, Добрич, Варна, Бургас, Сливен, Ямбол, Хасково и Кърджали
Строги рестрикции и солени глоби наложиха местните власти
Квебек забрани студентските протести Строги рестрикции и солени глоби наложиха местните власти