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

📄 app.c

📁 SEAL是DOS 下的32位保护模式的GUI程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************
 * SEAL 2.0                                                       *
 * Copyright (c) 1999-2002 SEAL Developers. All Rights Reserved.  *
 *                                                                *
 * Web site: http://sealsystem.sourceforge.net/                   *
 * E-mail (current maintainer): orudge@users.sourceforge.net      *
 ******************************************************************/

/*
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include <seal.h>
#include <app.h>
#include <dialogs.h>
#include <skin.h>
#include <screen.h>

#define image_close     IMG_WCLOSE
#define image_min       IMG_WMIN
#define image_max       IMG_WMAX
#define image_dclose    IMG_DWCLOSE
#define image_dmin      IMG_DWMIN
#define image_dmax      IMG_DWMAX
#define image_abt       IMG_ABOUT
#define image_dabt      IMG_DABOUT

#define image_sysmenu   IMG_APP16
#define image_sysmenu32 IMG_APP32

#define msg_icons(x)    GETBMPID(4+x)
#define Pikachu 100000

// BITMAP *title_active_bgnd;      /* active title background */
// BITMAP *title_pasive_bgnd;      /* pasive title background */

t_appinfo appinfo; /* for transfers */


p_skin apppastitle = NULL;
p_skin appacttitle = NULL;
p_skin appbody = NULL;


p_appwin  (*appwin_init) ( p_appwin o, t_rect r, l_text caption, l_int flags, hdlx_t id,
                           void (*trans_ev)( p_object o, t_event *e )) = &_appwin_init;
p_appwin  (*window_init) ( p_appwin o, t_rect r, l_text caption, l_int flags );

p_appwin  (*message_init_ex) ( p_object owner, p_appwin o, t_rect r, l_text caption, l_int flags,
                               l_char    iflags,
                               l_dword  bflags, void (*trans_ev)( p_object o, t_event *e ),
                               l_text in_text, va_list argp ) = &_message_init_ex;

p_window   (*frame_init) ( p_window o, t_rect r ) = &_frame_init;

/* appwin functions */

p_menuitem standard_system_menu_items(p_appwin o, p_menuitem next)
{
  p_menuitem r;
  if ((WINDOW(o)->flags & WF_MAXIMIZE) || (WINDOW(o)->flags & WF_MINIMIZE)) {
    l_bool min = (WINDOW(o)->flags & WF_MINIMIZE);
    l_bool max = (WINDOW(o)->flags & WF_MAXIMIZE);

    r = new_menu_item_ex(TXT_MINIMIZE, 0, 0, MSG_MINIMIZE, min, "Minimize window", 0, 0, ( get_depth(screen) < 16 ) ? NULL : IMG_WMIN, 0, 0,
        new_menu_item_ex(TXT_MAXIMIZE, 0, 0, MSG_MAXIMIZE, max, "Maximize window", 0, 0, ( get_depth(screen) < 16 ) ? NULL : IMG_WMAX, 0, 0,
        new_menu_item_ex(TXT_CLOSE, "Alt+F4", 0, MSG_CLOSE, TRUE, "Close window", 0, 0, ( get_depth(screen) < 16 ) ? NULL : IMG_WCLOSE, 0, 0,
    next)));
  } else r = new_menu_item_ex(TXT_CLOSE, "Alt+F4", 0, MSG_CLOSE, TRUE, "Close window", 0, 0, ( get_depth(screen) < 16 ) ? NULL : IMG_WCLOSE, 0, 0, next);

  return r;
};



void  appwin_setup ( p_object o )
{
  p_icobutton b;
  t_rect   r;
  t_rect   s;
  l_int    cx = (APPWIN(o)->pastitle?APPWIN(o)->pastitle->d.a.x+8:10);

  view_setup(o);

  r = VIEW(o)->get_local_extent(VIEW(o));
  s = VIEW(o)->size_limits(VIEW(o));

  if ( get_depth(screen) < 16 ) {

  p_button b;

  r = rect_assign(r.b.x-19, r.a.y+cx-8, r.b.x-3, r.a.y+cx+8);

  b = button_init(_malloc(sizeof(t_button)), r, "5", MSG_CLOSE, BF_PUSH+BF_NORMAL);

  if ( b ) { /* make close button */

    /* ignore size limits of window */
    OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
    /* can't be selected */
    OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
    /* fot is symbol TTF font in size 10,10 */
    VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
    /* move button, when window is growing, but still fixed size */
    VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;

  };
  /* insert close button to window */
  o->insert(o, OBJECT(b));

  if ( WINDOW(o)->flags & WF_MAXIMIZE ) {

    /* maximize button */

    r = rect_move(r, -18, 0);
    b = button_init(_malloc(sizeof(t_button)), r, "0", MSG_MAXIMIZE, BF_PUSH+BF_NORMAL);

    if ( b ) {

         /* ignore size limits of window */
         OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
         /* can't be selected */
         OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
         /* fot is symbol TTF font in size 10,10 */
         VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
         /* move button, when window is growing, but still fixed size */
         VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;

    };

    /* insert maximize button to window */
    o->insert(o, OBJECT(b));

  };

  if ( WINDOW(o)->flags & WF_MINIMIZE ) {

    /* minimize button */
    r = rect_move(r, -18, 0);
    b = button_init(_malloc(sizeof(t_button)), r, "1", MSG_MINIMIZE, BF_PUSH+BF_NORMAL);

    if ( b ) {

         /* ignore size limits of window */
         OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
         /* can't be selected */
         OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
         /* fot is symbol TTF font in size 10,10 */
         VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
         /* move button, when window is growing, but still fixed size */
         VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;

    };

    /* insert minimize button to window */
    o->insert(o, OBJECT(b));

  };




  } else {

  r = rect_assign(r.b.x-19, r.a.y+cx-8, r.b.x-3, r.a.y+cx+8);

  b = icobutton_init(sf_malloc(sizeof(t_icobutton)), r, image_close, TXT_CLOSE, MSG_CLOSE, ((!image_dclose)?BF_UNDERSEL:BF_NOSEL)+BF_PUSH+BF_NORMAL);

  if ( b ) { /* make close button */

    /* ignore size limits of window */
    OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
    /* can't be selected */
    OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
    /* fot is symbol TTF font in size 10,10 */
    //VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
    /* move button, when window is growing, but still fixed size */
    VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;

    VIEW(b)->transparent = true;

    b->dwnicon = image_dclose;

  };
  /* insert close button to window */
  o->insert(o, OBJECT(b));



  if ( WINDOW(o)->flags & WF_MAXIMIZE ) {

    /* maximize button */

    r = rect_move(r, -18, 0);
    b = icobutton_init(sf_malloc(sizeof(t_icobutton)), r, image_max, TXT_MAXIMIZE, MSG_MAXIMIZE, ((!image_dmax)?BF_UNDERSEL:BF_NOSEL)+BF_PUSH+BF_NORMAL);

    if ( b ) {

         /* ignore size limits of window */
         OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
         /* can't be selected */
         OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
         /* fot is symbol TTF font in size 10,10 */
         //VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
         /* move button, when window is growing, but still fixed size */
         VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;

         VIEW(b)->transparent = true;
         b->dwnicon = image_dmax;
    };

    /* insert maximize button to window */
    o->insert(o, OBJECT(b));

  };


  if ( WINDOW(o)->flags & WF_MINIMIZE ) {

    /* minimize button */
    r = rect_move(r, -18, 0);
    b = icobutton_init(sf_malloc(sizeof(t_icobutton)), r, image_min, TXT_MINIMIZE, MSG_MINIMIZE, ((!image_dmin)?BF_UNDERSEL:BF_NOSEL)+BF_PUSH+BF_NORMAL);

    if ( b ) {

         /* ignore size limits of window */
         OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
         /* can't be selected */
         OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
         /* fot is symbol TTF font in size 10,10 */
         //VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
         /* move button, when window is growing, but still fixed size */
         VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;

         VIEW(b)->transparent = true;
         b->dwnicon = image_dmin;
    };

    /* insert minimize button to window */
    o->insert(o, OBJECT(b));

  };
  if ( WINDOW(o)->flags & WF_ABOUT ) {

    /* maximize button */

    r = rect_move(r, -18, 0);
    b = icobutton_init(sf_malloc(sizeof(t_icobutton)), r, image_abt, TXT_ABOUT, MSG_ABOUT, ((!image_dabt)?BF_UNDERSEL:BF_NOSEL)+BF_PUSH+BF_NORMAL);

    if ( b ) {

         /* ignore size limits of window */
         OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
         /* can't be selected */
         OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
         /* fot is symbol TTF font in size 10,10 */
         //VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
         /* move button, when window is growing, but still fixed size */
         VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;

         VIEW(b)->transparent = true;
         b->dwnicon = image_dabt;
    };

    /* insert maximize button to window */
    o->insert(o, OBJECT(b));

  };


  }; // >= 16 graphics end


  if ( WINDOW(o)->flags & WF_SYSMENU ) {

    /* system menu button */
    r = VIEW(o)->get_local_extent(VIEW(o));
    r = rect_assign(r.a.x+3, r.a.y+cx-8, r.a.x+21, r.a.y+cx+8);
    b = icobutton_init(sf_malloc(sizeof(t_icobutton)), r, APPWIN(o)->icon16, "System menu", MSG_SYSMENU, BF_PUSH+BF_NORMAL);

    if ( b ) {

         /* ignore size limits of window */
         OBJECT(b)->set_options(OBJECT(b), VW_OF_IGNORELIM, true);
         /* can't be selected */
         OBJECT(b)->set_options(OBJECT(b), OB_OF_SELECTABLE, false);
         /* fot is symbol TTF font in size 10,10 */
         //VIEW(b)->font = get_font_in_size("Symbols", 10, 10);
         /* move button, when window is growing, but still fixed size */
//         VIEW(b)->align |= TX_ALIGN_RIGHT+TX_ALIGN_FIXEDX;
         VIEW(b)->transparent = true;
    };

    /* insert system menu button to window */
    o->insert(o, OBJECT(b));

  };

};

t_rect  appwin_size_limits ( p_view o ) {

  t_rect r = o->get_local_extent(o);

  r.a.x += 2;
  r.a.y += APPWIN(o)->pastitle ? get_skin_height(APPWIN(o)->pastitle,16)+1 : 19;
  r.b.x -= 2;
  r.b.y -= 2;

  return r;
};

void  appwin_set_state ( p_object o, l_dword st, l_bool set ) {
  if ( APPWIN(o)->pastitle ) {
    view_set_state(o, st, set);
    if ( st & OB_SF_SELECTED ) {
      TEST_SUB_VIEWS(o, WINDOW(o)->draw_title(WINDOW(o)));
      view_draw_on_rect(VIEW(o),rect_assign(0, 0, rect_sizex(VIEW(o)->bounds),get_skin_height(APPWIN(o)->pastitle,16)+1));
    };
  } else
    win_set_state(o,st,set);
};

void  appwin_draw ( p_view o ) {

  if ( APPWIN(o)->body ) {

    t_rect  r = o->get_local_extent(o);
    t_point p;
    BITMAP *out;

    r.a.y += get_skin_height(APPWIN(o)->pastitle,16);

    out = o->begin_paint(o, &p, r);

    if ( out )
      draw_skin(out,APPWIN(o)->body,rect_move(r,p.x,p.y),NULL);

    o->end_of_paint(o, r);

    WINDOW(o)->draw_title(WINDOW(o));

  } else win_draw(o);

};

void  appwin_draw_title ( p_window o ) {

  t_rect  r = APPWIN(o)->pastitle?rect_assign(0,0,rect_sizex(VIEW(o)->bounds),get_skin_height(APPWIN(o)->pastitle,16)):rect_assign ( 2, 2, rect_sizex(VIEW(o)->bounds)-3, 18 );
  t_rect  safe = r;
  t_rect  t;
  t_point p;

  BITMAP *out = VIEW(o)->begin_paint(VIEW(o), &p, safe);

  if ( out ) {
      if ( APPWIN(o)->pastitle && APPWIN(o)->acttitle ) {
	    p_skin skin = ( OBJECT(o)->state & OB_SF_SELECTED ) ? APPWIN(o)->acttitle : APPWIN(o)->pastitle;
	    r = rect_move(r,p.x,p.y);
	    draw_skin(out,skin,r,&r);
	    textout_draw_rect(out, VIEW(o)->font, o->caption, -1, r.a.x+((o->flags & WF_SYSMENU)?25:4), r.a.y,
                           r.b.x, r.b.y, TX_ALIGN_CENTERY, get_skin_fcolor(skin), TX_NOCOLOR, 0);
      } else {
      l_color fcolor = color_window_pass_title_text;
      l_color bcolor1 = color_window_pass_title_face;
      l_color bcolor2 = color_window_pass_title_face_gardient;

      if ( OBJECT(o)->state & OB_SF_SELECTED ) {
        fcolor = color_window_act_title_text;
        bcolor1 = color_window_act_title_face;
        bcolor2 = color_window_act_title_face_gardient;
      };

      fade_rect(out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, bcolor1, bcolor2, FR_HOR);

      textout_draw_rect(out, VIEW(o)->font, o->caption, -1, r.a.x+p.x+((o->flags & WF_SYSMENU)?25:4), r.a.y+p.y,
                           r.b.x+p.x, r.b.y+p.y, TX_ALIGN_CENTERY, fcolor, TX_NOCOLOR, 0);

    };

  };

  VIEW(o)->end_of_paint(VIEW(o), safe);

};


void      appwin_translate_event ( p_object o, t_event *event )
{

  RETVIEW(o, event);

  if ( APPWIN(o)->app_trans_ev ) {

⌨️ 快捷键说明

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