⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menus.c

📁 SEAL是DOS 下的32位保护模式的GUI程序
💻 C
📖 第 1 页 / 共 3 页
字号:

p_menuitem  add_menu_item_to_menuitem ( p_menuitem dst, p_menuitem src )
{

  if ( dst ) {

      p_menuitem last = dst;

      while ( last->next ) last = last->next; /* move to last item */

      last->next = src;

  } else dst = src;

  return dst;

};


l_bool      add_menu_item_to_menu ( p_menu p, l_int pos, p_menuitem items )
{

   p_menuitem first = p?p->items:NULL;

   while ( first && pos > 1 ) {


     pos--;
     first = first->next;

   };

   if ( first && first->next != items ) {

     first->next = items;

     return true;

   };

   return false;
};


p_menu      new_menu ( p_menuitem item )
{
  p_menu p = (p_menu)_malloc(sizeof(t_menu));

  if ( p ) {

    clear_type(p, sizeof(t_menu));

    p->items = item;
    p->current = item;

  };

  return p;

};


p_menuitem  new_menu_line ( p_menuitem next )
{
  p_menuitem p = (p_menuitem)_malloc(sizeof(t_menuitem));

  if ( p ) {

    clear_type(p, sizeof(t_menuitem));

    p->next = next;

    return p;

  };

  return next;

};


p_menuitem  new_sub_menu_ex ( l_text name, l_bool enable, l_text info_text,
                              l_font *font, BITMAP *icon, l_font *font_symbol, l_byte chr,
                              p_menu menu, p_menuitem next )
{

  p_menuitem p;

  if ( name ) {

    p = (p_menuitem)_malloc(sizeof(t_menuitem));

    if ( !p ) return next;

    clear_type(p, sizeof(t_menuitem));

    p->next = next;
    p->name = _strdup(name);
    p->enable = enable;
    p->info_text = _strdup(info_text);
    p->font = font;
    p->submenu = menu;
    p->font_symbol = font_symbol;
    p->char_symbol = chr;

    if ( !font ) p->font = standard_menuitem_font;

    if ( !icon )

       p->icon = NULL; //icon_folder(ICON_16);

    else

       p->icon = icon;

    return p;

  };

  return next;

};


void   free_menu_item ( p_menuitem i )
{
   if ( i ) {

     _free(i->name);
     _free(i->info_text);
     _free(i->param);

     if ( i->flags & MIF_SELFICON )

         destroy_bitmap(i->icon);

   };

  _free(i);
};


void   free_menu ( p_menu i )
{
};


p_menuitem  new_menu_item_ex ( l_text name, l_text param, l_int hotkey, l_dword message,
                               l_bool enable, l_text info_text, l_int flags,
                               l_font *font, BITMAP *icon, l_font *font_symbol, l_byte chr,
                               p_menuitem next )
{
  p_menuitem p;

  if ( name && message != 0 ) {

    p = (p_menuitem)_malloc(sizeof(t_menuitem));

    if ( !p ) return NULL;

    clear_type(p, sizeof(t_menuitem));

    p->next = next;
    p->name = _strdup(name);
    p->message = message;
    p->enable = enable;
    p->hotkey = hotkey;
    p->info_text = _strdup(info_text);
    p->param = _strdup(param);
    p->font = font;
    p->font_symbol = font_symbol;
    p->char_symbol = chr;

    if ( !font ) p->font = standard_menuitem_font;

    p->flags = flags;
    p->icon = icon;

    return p;

  };

  return next;
};



l_int       menu_get_item_flags ( p_menu m, l_dword message )
{

   p_menuitem p = m?m->items:NULL;

   while ( p ) {

     if ( p->submenu ) {

        l_int flags = menu_get_item_flags(p->submenu, message);

        if ( flags != -1 ) return flags;

     } else

     if ( p->message == message ) return p->flags;

     p = p->next;

   };

   return -1;


};


l_long    menu_get_item_pos ( p_menu m, p_menuitem x )
{
   p_menuitem p = m?m->items:NULL;
   l_long i = 0;


   while ( p ) {

     if ( p == x ) return i;

     i++;

     p = p->next;

   };

   return -1;

};


p_menuitem    menu_get_lastitem_called ( p_menu m )
{

   p_menuitem p = m?m->items:NULL;

   while ( p ) {

     if ( p->submenu ) {

        p_menuitem last = menu_get_lastitem_called(p->submenu);

        if ( last ) {

            last->lastcall = false;

            return last;

        };

     } else

     if ( p->lastcall ) {  // Fixed 09/09/2001

       p->lastcall = false;

       return p;

     };

     p = p->next;

   };

   return NULL;

};


l_dword     menu_get_hotkey_message ( p_menu m, l_int keycode )
{

   p_menuitem p = m?m->items:NULL;

   while ( p ) {

     if ( p->submenu ) {

        l_dword msg = menu_get_hotkey_message(p->submenu, keycode);

        if ( msg ) return msg;

     } else

     if ( p->hotkey == keycode ) return p->message;

     p = p->next;

   };

   return MSG_NOTHING;

};


l_int  menu_get_max_item ( p_menu m )
{

  if ( m && m->items ) {

     p_menuitem p = m->items;
     l_int i = 0;

     while ( p ) {

       i++;

       p = p->next;

     };

     return i;

  } else

  return 0;


};


t_point  menu_get_ver_size ( p_menu menu, l_int h )
{

  p_menuitem item = menu?menu->items:NULL;

  l_rect     w = 0;
  l_rect     maxw = 0;
  l_rect     maxh = 0;

  while ( item ) {

     if ( item->name ) {

        w   = FONT_GETSTRWIDTH(item->font, item->name, -1);
        w  += FONT_GETSTRWIDTH(item->font, item->param, -1);
        w  += STANDARD_MENUBOUNDSDIFF_SIZE*2;

        maxw = max(w, maxw);

        maxh += h;

     } else

         maxh += STANDARD_MENULINE_SIZE+1;

     item = item->next;

  };

  return point_assign(maxw+60, maxh+4);

};


t_point  menu_get_hor_size ( p_menu menu, l_int h, l_int icon_size )
{

  p_menuitem item = menu?menu->items:NULL;

  l_rect     w = 0;
  l_rect     maxw = 0;
  l_rect     maxh = 0;

  while ( item ) {

     if ( item->name ) {

        maxw  += icon_size;
        maxw  += FONT_GETSTRWIDTH(item->font, item->name, -1);
        maxw  += FONT_GETSTRWIDTH(item->font, item->param, -1)+STANDARD_MENUDIFF_SIZE;

     } else

         maxw += STANDARD_MENULINE_WIDTH+1;

     item = item->next;

  };

  return point_assign(maxw+4, h+4);

};


/* t_hormenu */


void    hormenu_translate_event ( p_object o, t_event *event )
{
  t_rect r = VIEW(o)->get_local_extent(VIEW(o));
  t_point p = VIEW(o)->get_global_point(VIEW(o), point_assign(0, 0));

  RETVIEW(o, event);

  view_translate_event(o, event); /* old translate_event function */

  if ( event->type & EV_MOUSE &&

       OBJECT(mouse)->state & MO_SF_MOUSELDOWN ) { /* mouse events */
         l_dword msg = 0;

       clear_event(event);

       if (mouse->where.x > r.a.x+p.x && mouse->where.x <= r.a.x+p.x+8) {
         while ( OBJECT(mouse)->state & MO_SF_MOUSELPRESS ) {

            o->get_event(o, event);
         };

         return;
       };

       menu_clear_lastitem_called(MENUVIEW(o)->menu);

       msg = desktop->execute_view(desktop, VIEW(o));

       if ( msg != MSG_NOTHING && msg != MSG_CANCEL ) {

          set_event(event, EV_MESSAGE, msg, o);

       };

       o->put_event(o, event);

       clear_event(event);

       if ( o->owner->prefer == o )  /* only one item, so redraw it for  */

           MENUVIEW(o)->draw_current_item(MENUVIEW(o));

  };

};

p_menuview  _hormenu_init_ex ( p_menuview o, t_rect r, l_rect item_size,
                               l_rect icon_size, p_menu menu )
{
  t_rect   l = desktop?desktop->get_limits(desktop):r;
  t_point  s = menu_get_hor_size(menu, item_size, icon_size+5);

  if ( !o ) return NULL;

  clear_type(o, sizeof(t_menuview));

  /* rectangle settings */

  r.b.y = r.a.y + s.y;

  if ( r.b.x < r.a.x+s.x )  r.b.x = r.a.x + s.x;

  view_init(VIEW(o), r);

  /* object's functions */

  OBJECT(o)->done = &menuview_done;
  OBJECT(o)->execute = &hormenu_execute;
  OBJECT(o)->set_state = &menuview_set_state;
  OBJECT(o)->translate_event = &hormenu_translate_event;


  /* view's functions */

  VIEW(o)->draw = &hormenu_draw;
  VIEW(o)->draw_under_rect = &menuview_draw_under_rect;
  VIEW(o)->icon_size = icon_size;

  if (use_skins)                      // OCR - 02/04/2002
     VIEW(o)->transparent = TRUE;

  /* menuview's functions and declarations */

  o->flags |= MF_HORMENU;
  o->menu = menu;
  o->between = point_assign(icon_size+5, 0);
  o->item_size = item_size;

  o->save_desktop = &hormenu_save_desktop;
  o->is_hor_menu_one_of_parents = &menuview_is_hor_menu_one_of_parents;
  o->draw_current_item = &menuview_draw_current_item;
  o->draw_item = &hormenu_draw_item;
  o->at = &menuview_at;
  o->index_of = &menuview_index_of;
  o->get_item_box_ex = &hormenu_get_item_box_ex;
  o->get_mouseitem_box = &menuview_get_mouseitem_box;
  o->get_item_box = &menuview_get_item_box;
  o->get_next_item = &menuview_get_next_item;
  o->next_item = &menuview_next_item;
  o->prev_item = &menuview_prev_item;
  o->run_new_menu = &menuview_run_new_menu;
  o->get_item_from_mouse = &menuview_get_item_from_mouse;
  o->is_mouse_in_one_of_parent_menu = &menuview_is_mouse_in_one_of_parent_menu;
  o->is_mouse_in_one_of_parent_item = &menuview_is_mouse_in_one_of_parent_item;
  o->is_one_of_subs_state = &menuview_is_one_of_subs_state;
  o->top_menuview = &menuview_top_menuview;


  /* function calls */

//  VIEW(o)->set_palette(VIEW(o), pal_hormenu);

  VIEW(o)->brush.color = color_3d_face;
 /* VIEW(o)->brush.color2 = color_menu_face_gardient;
  VIEW(o)->brush.state |= BRUSH_GRADIENT+BRUSH_GRADIENT_HOR;*/

  return o;
};


p_menuview  _hormenu_init ( p_menuview o, t_rect r, p_menu menu )
{

  return hormenu_init_ex(o, r, standard_menuitem_size, standard_menuicon_size, menu);

};



/* t_menuview */

p_menuview  _menuview_init_ex ( p_menuview o, t_rect r, l_rect item_size,
                                l_rect icon_size, p_menu menu )
{

  t_rect   l = desktop?desktop->get_limits(desktop):r;
  t_point  s = menu_get_ver_size(menu, item_size);

  if ( !o ) return NULL;

  clear_type(o, sizeof(t_menuview));

  /* rectangle settings */

  if ( r.a.x + s.x < l.b.x )  r.b.x = r.a.x + s.x; else r.a.x = l.b.x - s.x;
  if ( r.a.y + s.y < l.b.y )  r.b.y = r.a.y + s.y; else r.a.y = l.b.y - s.y;

  r.b.x = r.a.x + s.x;
  r.b.y = r.a.y + s.y;


  view_init(VIEW(o), r);

  /* object's functions */

  OBJECT(o)->done = &menuview_done;
  OBJECT(o)->execute = &menuview_execute;
  OBJECT(o)->set_state = &menuview_set_state;
  OBJECT(o)->translate_event = &menuview_translate_event;


  /* view's functions */

  VIEW(o)->draw = &menuview_draw;
  VIEW(o)->size_limits = &menuview_size_limits;
  VIEW(o)->draw_under_rect = &menuview_draw_under_rect;
  VIEW(o)->icon_size = icon_size;

  VIEW(o)->brush.state &= ~BRUSH_LARGE3D;

  VIEW(o)->brush.state |= BRUSH_LIGHT3D|BRUSH_DRAWBORDER;

  /* menuview's functions and declarations */

  o->flags |= MF_VERMENU;
  o->menu = menu;
  o->between = point_assign(icon_size+5, 0);
  o->item_size = item_size;

  o->save_desktop = &menuview_save_desktop;
  o->is_hor_menu_one_of_parents = &menuview_is_hor_menu_one_of_parents;
  o->draw_item = &menuview_draw_item;
  o->draw_current_item = &menuview_draw_current_item;
  o->at = &menuview_at;
  o->index_of = &menuview_index_of;
  o->get_item_box_ex = &menuview_get_item_box_ex;
  o->get_mouseitem_box = &menuview_get_mouseitem_box;
  o->get_item_box = &menuview_get_item_box;
  o->get_next_item = &menuview_get_next_item;
  o->next_item = &menuview_next_item;
  o->prev_item = &menuview_prev_item;
  o->run_new_menu = &menuview_run_new_menu;
  o->get_item_from_mouse = &menuview_get_item_from_mouse;
  o->is_mouse_in_one_of_parent_menu = &menuview_is_mouse_in_one_of_parent_menu;
  o->is_mouse_in_one_of_parent_item = &menuview_is_mouse_in_one_of_parent_item;
  o->is_one_of_subs_state = &menuview_is_one_of_subs_state;

  o->top_menuview = &menuview_top_menuview;


  /* function calls */

  OBJECT(o)->options |= OB_OF_TOPSELECT;

//  VIEW(o)->set_palette(VIEW(o), pal_menu);

  switch ( translucide ) {
    case 1 : VIEW(o)->trans_effect = 235; break;
    case 2 : VIEW(o)->trans_effect = 215; break;
    case 3 : VIEW(o)->trans_effect = 195; break;
    case 4 : VIEW(o)->trans_effect = 175; break;
    case 5 : VIEW(o)->trans_effect = 155; break;
  };


  VIEW(o)->brush.color = color_menu_face;

  VIEW(o)->brush.color2 = color_menu_face_gardient;

  VIEW(o)->brush.state |= BRUSH_GRADIENT+BRUSH_GRADIENT_HOR;

  return o;
};


p_menuview  _menuview_init ( p_menuview o, t_rect r, p_menu menu )
{

  return menuview_init_ex(o, r, standard_menuitem_size, standard_menuicon_size, menu);

};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -