Надеюсь, вы уже скачали и установили svn-клиент TortoiseSVN, компилятор Embedded Workbench 4.0 Evaluation (IAR) и слили в папку свн по адресу svn://svn.boba.su/SE. Если это еще не сделали то вперёд
Наша задача - создать меню со списком элементов, притом задать им имя и действие. Начнем...
1. Заходим в папку со слитым репозиторием (далее буду называть это слитой свн), копируем и переименовываем папку HelloWorld в любую другую, например GUI_Example. В папке видим файлы: HelloWorld.eww, main.c, main.ewp и скрытую папку .svn (её можно удалить, но не обязательно, конечно если вы не имеете собственного свн).
2. Открываем файл HelloWorld.eww. Слева ищем слово Debug, жмем на стрелку правее и выбираем Release. Убираем всё лишнее и получаем такой код:
BOOK * CreateHWBook() { HWBook= new BOOK; CreateBook(HWBook,onCloseHWBook,&base_page,"Example",-1,0); return(HWBook); }
int main (void) { CreateHWBook(); return(0); }
Этот код также можно сохранить как основу для других эльфов.
Данный код запускает эльф и создаёт для него книгу (далее бук, BOOK). Теперь нам надо создать заголовочный файл (далее модуль), который и будет отвечать за GUI (далее гуи).
3. В папке с нашим проектом создаём файлы gui.c и gui.h. В IAR'е (далее йаре, йар) слева, на панельке щелкаем правой кнопкой мыши и выбираем Add->Add Files..., выбираем файл gui.c. Затем выбираем его (в панельке слева). Видим пустое окно. Вписываем в него следующий код:
А теперь опишу код: Функция void GuiCreateGuiList(void * r0, BOOK * bk) отвечает за само создание меню. Сначала присвоем структуре myBook->gui (о ней мы поговорим позже) указатель на меню-список. Затем функцией GuiObject_SetTitleText(myBook->gui,Str2ID(GUI_NAME,0,SID_ANY_LEN)) установим заголовок меню, его мы задали в константе GUI_NAME. Потом устанавливаем кол-во пунктов(SetNumOfMenuItem(myBook->gui,2);), названия пунктов (OneOfMany_SetonMessage((GUI_ONEOFMANY*)myBook->gui,GuiOnLBMessage);), установим курсор на первый пункт(SetCursorToItem(myBook->gui,0);), установим стиль меню (SetMenuItemStyle(myBook->gui,0);), посмотреть какие стили существуют можно по сслылке
//описание функций GuiBack и GuiOnEnterPressed мы рассмотрим чуть позже //при коротком и длинном нажатии на клавишу Назад GUIObject_Softkey_SetAction(myBook->gui,ACTION_BACK, GuiBack); GUIObject_Softkey_SetAction(myBook->gui,ACTION_LONG_BACK, GuiBack); //при выборе GUIObject_Softkey_SetAction(myBook->gui,ACTION_SELECT1,GuiOnEnterPressed);
И, наконец, покажем наше меню (ShowWindow(myBook->gui);).
отвечает за действие при выборе пункта. Сначала мы функцией ListMenu_GetSelectedItem(myBook->gui) присваиваем переменной item значение текущего выбранного пункта, потом проверяем какой пункт у нас выбран и совершаем действие, в нашем случае выводим сообщение.
Функция:
Код:
int GuiOnLBMessage(GUI_MESSAGE * msg) { int item; switch(msg->msg) { case 1: item=GUIonMessage_GetCreatedItemIndex(msg); if(item==0) SetMenuItemText0(msg,Str2ID(L"Элемент 1",0,SID_ANY_LEN)); if(item==1) SetMenuItemText0(msg,Str2ID(L"Элемент 2",0,SID_ANY_LEN)); } return(1); };
задаёт пунктам имена, работает почти также как и GuiOnEnterPressed, так что подробно расписывать здесь, думаю не надо.
4. Теперь нам надо запустить это дело. Выбираем в панеле файл main.c и создаём структуру:
Код:
typedef struct { BOOK book; GUI_LIST*gui; }MyBOOK;
MyBOOK*myBook;
заместо BOOK * HWBook, где book содержит нашу книгу, а gui указатель на гуи. Его то мы и использовали в нашей менюшке. Теперь необходимо исправить функцию:
Код:
BOOK * CreateHWBook() { HWBook= new BOOK; CreateBook(HWBook,onCloseHWBook,&base_page,"Example",-1,0); return(HWBook); }
меняем на:
Код:
MyBOOK * CreateHWBook() { myBook= new MyBOOK; CreateBook(myBook,onCloseHWBook,&base_page,"Example",-1,0); return(myBook); }
Почти готово. Далее открываем файл gui.h и вписываем в него:
Код:
typedef struct { BOOK book; GUI_LIST*gui; }MyBOOK; extern MyBOOK*myBook; extern void GuiCreateGuiList(void * r0, BOOK * bk);
Сохраняем, закрываем. Заходим опять в IAR. Теперь структуру MyBOOK нужно стереть из main.c, так как мы её добавили в gui.h для того чтобы она могла быть использована в других модулях. В функции main перед return(0); пишем GuiCreateGuiList(0, (BOOK*)myBook);.
void onCloseMYBook(BOOK * book) { if (book) { SUBPROC(elf_exit); } } //------------------------------------------------------------------------------ int isMyElfBook(BOOK * book){ //return 0==strcmp(book->xbook->name,BookName); if(!strcmp(book->xbook->name,BookName)) return(1); return(0); } int checkMyBookExist(void){ if(FindBook(isMyElfBook)){ return(1); } return(0); } MyBOOK * CreateMYBook() { myBook= new MyBOOK; CreateBook(&(myBook->book),onCloseMYBook,&base_page,BookName,-1,0); return(myBook); } //------------------------------------------------------------------------------ void reportElfIsStarted(BOOK * book){ const int bufsize=strlen(BookName)+strlen(" is running"); char * strMsg=new char[bufsize+1]; strcpy(strMsg,BookName); strcat(strMsg," is running"); MessageBox(0x6FFFFFFF,Str2ID(strMsg,6,SID_ANY_LEN),NOIMAGE,1,5000,0); if(strMsg)delete(strMsg); } int main (void) { if(FindBook(isMyElfBook)){ reportElfIsStarted; TerminateElf; } else{ CreateMYBook(); GuiCreateGuiList(0, &(myBook->book)); } return(0); }
lexa4311
Пользователь
Регистрация: 12.12.07 Сообщений: 104 Репутация: -95 Откуда: Беларусь
#7 [01.08.10, 22:32] Re: Урок: создаём GUI, часть 1
mugen, прихлопнули тебя, да, месть арбана жестока, согласен конечно p.s. у меня тоже w810
Предупреждение от den_po Нарушение правил: 5.3.4. Резкое отклонение от темы или обсуждение в одной теме нескольких разных вопросов, не связанных друг с другом, кроме раздела "О жизни".
ПРОСТИТЕ ВЕЛИКОДУШНО, ИЗВОЛЬТЕ ВАС СПРОСИТЬ И ПО ВОЗМОЖНОСТИ ОТВЕТИТЬ НА МОЙ ВОПРОС, РАСЧИТЫВАЮ НА ВАШУ СНИСХОДИТЕЛЬНОСТЬ И МИЛОСТЬ, ПРОШУ ПО ВОЗМОЖНОСТИ НЕ ОТВЕЧАТЬ ТЕМ, КОМУ НЕЧЕГО ОТВЕТИТЬ, НЕ ПРИЗЫВАЮ, НЕ ЗАСТАВЛЯЮ, НЕ УПРЕКАЮ ВАС И НИЧЕГО НЕ ТРЕБУЮ
Вы не можете начинать темы. Вы не можете редактировать свои сообщения. Вы не можете создавать опросы. Вы не можете вкладывать файлы в сообщения. Вы не можете отвечать на сообщения. Вы не можете удалять свои сообщения. Вы не можете голосовать.