Проблема с меню под PalmOS

Средства разработки, технические вопросы, отвечает (по мере сил) Отдел Разработок
Закрыто
PDev
Новенький (0 lvl)
Сообщения: 8
Зарегистрирован: Пн мар 15, 2004 14:20

Проблема с меню под PalmOS

Сообщение PDev » Пн апр 26, 2004 17:42

Коллеги, подскажите, что деласть с кривыми меню с русскими бувками под PalmOS (уплывание размеров): отловить menuOpenEvent и пробежаться по всему MenuBarType и пересчитать размеры в соответствии со шрифтом, или сделать свой механизм меню?

В Cobalt/Garnet так же все плохо?

Аватара пользователя
GuinPin
Кандидат (3 lvl)
Сообщения: 152
Зарегистрирован: Пн дек 15, 2003 06:32

Сообщение GuinPin » Чт апр 29, 2004 13:30

На самом деле дело не в кривых меню :)
Лучше было бы, если бы ты указал среду разработки.
Например, при использовании компилятора ресурсов PilRc можно указать используемый набор символов и менюшки будут рассчитываться нормально.
С уважением, Сошников Иван

PDev
Новенький (0 lvl)
Сообщения: 8
Зарегистрирован: Пн мар 15, 2004 14:20

Сообщение PDev » Чт апр 29, 2004 14:19

А тут среда разработки тоже непричем, т.к. нельзя размеры шрифтов указать сразу под все русификаторы (или font-хаки) !

Сейчас работает такой код по "пересчету менюшек":

Код: Выделить всё

bool TMenuFixComponent::handleEvent(void* event_)
{
  EventPtr event=(EventPtr)event_;

  if(event->eType==menuOpenEvent) {
    MenuBarType *menu=MenuGetActiveMenu();
    FontID saveFont=FntSetFont(boldFont); // menu font

    int x=4, // menuTitleXOffset
        width,maxWidth,maxCmdCharWidth;
    char *text;

    for(int i=0;i<menu->numMenus;i++) {
      MenuPullDownPtr pullDownMenu=menu->menus+i;

      text=pullDownMenu->title;
      width=FntCharsWidth(text,StrLen(text))+8; // 8 = 2*menuTitleXOffset
      pullDownMenu->titleBounds.topLeft.x=x;
      pullDownMenu->titleBounds.extent.x=width;

      pullDownMenu->bounds.topLeft.x=x+1;
      x+=width;

      maxWidth=0; maxCmdCharWidth=0;


      for(int j=0;j<pullDownMenu->numItems;j++) {
        MenuItemType *menuItem=pullDownMenu->items+j;

        text=menuItem->itemStr;
        if(*text==MenuSeparatorChar) continue;

        width=FntCharsWidth(text,StrLen(text));
        if(width>maxWidth) maxWidth=width;

        if(menuItem->command) {
          width=FntCharWidth(menuItem->command);
          if(width>maxCmdCharWidth) maxCmdCharWidth=width;
        }
      }

      if(maxCmdCharWidth) maxCmdCharWidth+=3+3+3+3+ /* spaceInsidePullDownFrame */
                           FntCharWidth(chrCommandStroke);
  
      pullDownMenu->bounds.extent.x=maxWidth+maxCmdCharWidth;

      if(pullDownMenu->bounds.topLeft.x+pullDownMenu->bounds.extent.x>=160) 
          pullDownMenu->bounds.topLeft.x=159-1-pullDownMenu->bounds.extent.x;
    }

    FntSetFont(saveFont); 
  }

  return false;
}

Закрыто

Вернуться в «Программирование для КПК»