Все для Sony Ericsson, патчи, эльфы, моддинг, прошивка
  
Логин: Пароль: Запомнить: Привет гость! Зарегистрируйся или авторизируйся для получения доп. возможностей!
Разделы
PDA версия сайта
TrackIDentify
Новости
Статьи
Файлы
Патчи
Патчи A2
Патчи db2020
Эльфы
Исходники эльфов
Wiki
Форум
Опросы
Обратная связь
Развернуть/Свернуть
 
Развернуть/Свернуть

Урок: создаём GUI, часть 1 : Эльфостроение : Эльфы : Форум : Для Sony Ericsson патчи эльфы моддинг прошивка
/  Список форумов
   /  Эльфы
      /  Эльфостроение
   /  Урок: создаём GUI, часть 1
На печать 
Правила 


arban


Elfmaker


Регистрация: 2.3.08
Сообщений: 802
Репутация: 3111





 
  #1 [22.02.09, 22:00] Урок: создаём GUI, часть 1   

 
Урок: создаём графический интерфейс (GUI).

Надеюсь, вы уже скачали и установили 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. Убираем всё лишнее и получаем такой код:

Код: 

#include "..\\\\include\\Lib_Clara.h"
#include "..\\\\include\\Dir.h"

BOOK * HWBook;

int TerminateElf(void * ,BOOK* book)
{
  FreeBook(book);
  return(1);
}

typedef struct
{
  BOOK * book;
}MSG;

int ShowAuthorInfo(void *mess ,BOOK* book)
{
  MSG * msg = (MSG*)mess;
  MessageBox(0x6fFFFFFF,STR("Hello Wordl!\\n\\nExample elf.."),0, 1 ,5000,msg->book);
  return(1);
}

const PAGE_MSG HW_PageEvents[]@ "DYN_PAGE" ={
  ELF_TERMINATE_EVENT , TerminateElf,
  ELF_SHOW_INFO_EVENT  , ShowAuthorInfo,
  0,0
};

PAGE_DESC base_page ={"HW_BasePage",0,HW_PageEvents};


void elf_exit(void)

{
  kill_data(&ELF_BEGIN, (void(*)(void*))mfree_adr());
}

void onCloseHWBook(BOOK * book)
{
  if (book)
  {
    SUBPROC(elf_exit);
  }
}

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. Затем выбираем его (в панельке слева). Видим пустое окно. Вписываем в него следующий код:

Код: 

#include "..\\\\include\\Lib_Clara.h"
#include "..\\\\include\\Dir.h"
#include "gui.h"
#define GUI_NAME L"Example"

void GuiBack(BOOK *bk, void *lt)
{  
  FreeBook((BOOK*)myBook);
}

void GuiOnEnterPressed(BOOK *bk, void *lt)
{     
  int item=ListMenu_GetSelectedItem(myBook->gui);
  if(item==0)
  {
      MessageBox(0x6fFFFFFF,STR("Элемент 1"),0, 1 ,5000,0);
  }
  if(item==1)
  {
      MessageBox(0x6fFFFFFF,STR("Элемент 2"),0, 1 ,5000,0);
  }
}

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);
};

void GuiCreateGuiList(void * r0, BOOK * bk)
{  
  myBook->gui=CreateListObject(bk,0);
  GuiObject_SetTitleText(myBook->gui,Str2ID(GUI_NAME,0,SID_ANY_LEN));
  SetNumOfMenuItem(myBook->gui,2);
  OneOfMany_SetonMessage((GUI_ONEOFMANY*)myBook->gui,GuiOnLBMessage);
  SetCursorToItem(myBook->gui,0);
  SetMenuItemStyle(myBook->gui,0);
  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);  
};



А теперь опишу код:
Функция 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);), посмотреть какие стили существуют можно по сслылке

http://supertrubka.org/wiki/doku.php?id=elflib:functions:setmenuitemstyle.

А теперь зададим действия для софт-клавиш:

Код:

//описание функций 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);).

Функция:

Код:
 
void GuiBack(BOOK *bk, void *lt)
{  
  FreeBook((BOOK*)myBook);
}


отвечает за выход из нашей меню, в ней мы освобождаем созданный нами бук (FreeBook((BOOK*)myBook);). Вместе с буком у нас удалиться и наш гуи.

Функция:
Код: 

void GuiOnEnterPressed(BOOK *bk, void *lt)
{     
  int item=ListMenu_GetSelectedItem(myBook->gui);
  if(item==0)
  {
      MessageBox(0x6fFFFFFF,STR("Элемент 1"),0, 1 ,5000,0);
  }
  if(item==1)
  {
      MessageBox(0x6fFFFFFF,STR("Элемент 2"),0, 1 ,5000,0);
  }
}


отвечает за действие при выборе пункта. Сначала мы функцией 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);.

5. Всё готово! В файле main.c у вас должно быть:

Код: 

#include "..\\\\include\\Lib_Clara.h"
#include "..\\\\include\\Dir.h"
#include "gui.h"

MyBOOK * myBook;

int TerminateElf(void * ,BOOK* book)
{
  FreeBook(book);
  return(1);
}

typedef struct
{
  BOOK * book;
}MSG;

int ShowAuthorInfo(void *mess ,BOOK* book)
{
  MSG * msg = (MSG*)mess;
  MessageBox(0x6fFFFFFF,STR("Hello Wordl!\\n\\nExample elf.."),0, 1 ,5000,msg->book);
  return(1);
}

const PAGE_MSG HW_PageEvents[]@ "DYN_PAGE" ={
  ELF_TERMINATE_EVENT , TerminateElf,
  ELF_SHOW_INFO_EVENT  , ShowAuthorInfo,
  0,0
};

PAGE_DESC base_page ={"HW_BasePage",0,HW_PageEvents};


void elf_exit(void)

{
  kill_data(&ELF_BEGIN, (void(*)(void*))mfree_adr());
}

void onCloseHWBook(BOOK * book)
{
  if (book)
  {
    SUBPROC(elf_exit);
  }
}

MyBOOK * CreateHWBook()
{
  myBook= new MyBOOK;  
  CreateBook(myBook,onCloseHWBook,&base_page,"Example",-1,0);
  return(myBook);
}

int main (void)
{
  CreateHWBook();  
  GuiCreateGuiList(0, (BOOK *)myBook);
  return(0);
}



В gui.c:

Код: 

#include "..\\\\include\\Lib_Clara.h"
#include "..\\\\include\\Dir.h"
#include "gui.h"
#define GUI_NAME L"Example"

void GuiBack(BOOK *bk, void *lt)
{  
  FreeBook((BOOK*)myBook);
}

void GuiOnEnterPressed(BOOK *bk, void *lt)
{     
  int item=ListMenu_GetSelectedItem(myBook->gui);
  if(item==0)
  {
      MessageBox(0x6fFFFFFF,STR("Элемент 1"),0, 1 ,5000,0);
  }
  if(item==1)
  {
      MessageBox(0x6fFFFFFF,STR("Элемент 2"),0, 1 ,5000,0);
  }
}

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);
};

void GuiCreateGuiList(void * r0, BOOK * bk)
{  
  myBook->gui=CreateListObject(bk,0);
  GuiObject_SetTitleText(myBook->gui,Str2ID(GUI_NAME,0,SID_ANY_LEN));
  SetNumOfMenuItem(myBook->gui,2);
  OneOfMany_SetonMessage((GUI_ONEOFMANY*)myBook->gui,GuiOnLBMessage);
  SetCursorToItem(myBook->gui,0);
  SetMenuItemStyle(myBook->gui,0);
  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);  
};



В gui.h:

Код: 

typedef struct
{
BOOK book;
GUI_LIST*gui;
}MyBOOK;
extern MyBOOK * myBook;
extern void GuiCreateGuiList(void * r0, BOOK * bk);



Всё, теперь можно скомпилировать наш эльф. Просто жмём F7, если всё сделали правильно, то внизу должен появиться лог:

Код:

Building configuration: main - Release 
Updating build tree... 
gui.c 
main.c 
Linking 


Идём в папку Release/Exe/ и забираем наш эльф main.elf. Вот и всё! Мы научились создавать простейшую меню со списком пунктов.

(c)arban




LG Optimus
My SVN | Elflib Wiki | Elf SVN
Спасибо сказали: Slawwan, Grinvich11, Ugolovnik, Va_st, Pharaon, Alex__E, CyberMaster, Fanse, DuXeN0N, qwert, Хамяг, scorpion16_Richi, InvisibleW, Alex_E, SiLoN, DuMOHsmol, toha257

MODDER-GT


Elfmaker


Регистрация: 26.8.09
Сообщений: 75
Репутация: 536
Откуда: Россия г.Россошь




 
  #2 [24.04.10, 13:16] Re: Урок: создаём GUI, часть 1   

 
..Убираем всё лишнее и получаем такой код... где именно убираем?




Sе K790i R8BF003 CID 52 RED
Sе K810i R8BF003 CID 52 RED
Sе C510i R1FA035 CID 53 BROWN

arban


Elfmaker


Регистрация: 2.3.08
Сообщений: 802
Репутация: 3111





 
  #3 [24.04.10, 14:28] Re: Урок: создаём GUI, часть 1   

 
MODDER-GT, в файле main.c

Да и вообще, урок устарел и ошибки, возможно, есть




LG Optimus
My SVN | Elflib Wiki | Elf SVN
Спасибо сказали: MODDER-GT

cachok9999


Вникающий


Регистрация: 25.8.08
Сообщений: 29
Репутация: 1





 
  #4 [25.04.10, 18:18] Re: Урок: создаём GUI, часть 1   

 
Defined,
can you make a GUI to put an Image background?
Regards




BIG RESPECT:
Sе albertnet3, Sе Blacklizard, Sе den_po, Sе zylka, Sе mmcorp, Sе Vov4ик, Sе IronMaster, Sе mmcorp,

arban


Elfmaker


Регистрация: 2.3.08
Сообщений: 802
Репутация: 3111





 
  #5 [19.07.10, 11:29] Re: Урок: создаём GUI, часть 1   

 
Жестокий код. А инициализацию myBook кто делать будет? Посмотри исходники на свн, как сказал JokerXT, как там всё устроено и т.д.




LG Optimus
My SVN | Elflib Wiki | Elf SVN

Pavlus


Опытный


Регистрация: 23.12.08
Сообщений: 223
Репутация: 174
Откуда: Украина.Сумы.Конотоп




 
  #6 [19.07.10, 12:10] Re: Урок: создаём GUI, часть 1   

 
Вот, кажется так правильно:
Код: 
#include "..\\include\Lib_Clara.h"
#include "..\\include\Dir.h"
#include "gui.h"

MyBOOK * myBook;
u16 timer;
char *BookName="MyBook";

void elf_exit(void)

{
  kill_data(&ELF_BEGIN, (void(*)(void*))mfree_adr());
}
int TerminateElf(void * ,BOOK* book)
{
  FreeBook(book);
  return(1);
}

typedef struct
{
  BOOK * book;
}MSG;

int ShowAuthorInfo(void *mess ,BOOK* book)
{
  MSG * msg = (MSG*)mess;
  MessageBox(EMPTY_SID,STR("Hello Wordl!\n\nExample elf.."), NOIMAGE, 1, 5000,msg->book);
  return(1);
}

const PAGE_MSG MY_PageEvents[]@ "DYN_PAGE" ={
  ELF_TERMINATE_EVENT , TerminateElf,
  ELF_SHOW_INFO_EVENT  , ShowAuthorInfo,
  0,0
};

PAGE_DESC base_page ={"MY_BasePage",0,MY_PageEvents};

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. Резкое отклонение от темы или обсуждение в одной теме нескольких разных вопросов, не связанных друг с другом, кроме раздела "О жизни".




ПРОСТИТЕ ВЕЛИКОДУШНО, ИЗВОЛЬТЕ ВАС СПРОСИТЬ И ПО ВОЗМОЖНОСТИ ОТВЕТИТЬ НА МОЙ ВОПРОС, РАСЧИТЫВАЮ НА ВАШУ СНИСХОДИТЕЛЬНОСТЬ И МИЛОСТЬ, ПРОШУ ПО ВОЗМОЖНОСТИ НЕ ОТВЕЧАТЬ ТЕМ, КОМУ НЕЧЕГО ОТВЕТИТЬ, НЕ ПРИЗЫВАЮ, НЕ ЗАСТАВЛЯЮ, НЕ УПРЕКАЮ ВАС И НИЧЕГО НЕ ТРЕБУЮ
'Фу' сказали: arban, MODDER-GT


Похожие темы
 ТемаОтветыАвторПросмотрыОбновление
  Урок: разбираем списки, часть 12arban633230.09.10, 21:31
  Урок 1. Создаём вибру10ZEN1314919.06.10, 17:36
  Урок 2. создаём окно12ZEN1476017.06.10, 14:51
  Урок: создаём GUI, часть 21arban740923.02.09, 20:23
  лишняя часть3=paha=472017.03.09, 18:51

  • Поиск
  • Права
Вы не можете начинать темы.
Вы не можете редактировать свои сообщения.
Вы не можете создавать опросы.
Вы не можете вкладывать файлы в сообщения.
Вы не можете отвечать на сообщения.
Вы не можете удалять свои сообщения.
Вы не можете голосовать.

Главная Новости Статьи Файлы Патчи Форум Опросы PDA
- Генерация страницы: 0.14 секунд | 10 Запросов | HTML: 57.74 КБ -