delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2001/11/15/16:34:20

From: degoble AT gtech (David. E. Goble)
Newsgroups: comp.os.msdos.djgpp
Subject: help with allegro program
Date: Wed, 14 Nov 2001 22:17:08 GMT
Organization: Gtech.Computing
Message-ID: <3bf2ed47.13317482@gtech>
X-Newsreader: Forte Free Agent 1.21/32.243
NNTP-Posting-Host: 203.48.5.230
X-Trace: 16 Nov 2001 07:36:45 +1050, 203.48.5.230
Lines: 202
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

Hi All;

I need some help with my allegro program. I am just experimenting with
it, learning as I go.

How do I change this program, so that it only exits thru the menu item
quit? Selecting the about menu item drops thru to the report the
results.

/* test of using allegro lib 
    
	gcc foo.c -o foo.exe -lalleg 
*/

#include <stdlib.h>
#include <stdio.h>

#include "allegro.h"
#include "example.h"

void credits_proc(void)
{
char buf1[256], buf2[80], buf3[80];

   /* and report the results */
   sprintf(buf1, "Writtren By David. E. Goble");
   sprintf(buf2, "");
   sprintf(buf3, "");
   alert(buf1, buf2, buf3, "OK", NULL, 0, 0);
}

int quit_proc()
{
   return D_CLOSE;
}

MENU apple_menu[]=
{
   {"&About",               credits_proc,  NULL,  0, NULL},
   {"",                     NULL,          NULL,  0, NULL},
   {NULL,                   NULL,          NULL,  0, NULL}
};

MENU file_menu[]=
{
   {"&New",                 NULL,           NULL, 0, NULL},
   {"&Open",                NULL,           NULL, 0, NULL},
   {"",                     NULL,           NULL, 0, NULL},
   {"&Quit",                quit_proc,      NULL, 0, NULL},
   {NULL,                   NULL,           NULL, 0, NULL}
};

MENU menu[]=
{
   {"@",                    NULL,           apple_menu,  0, NULL},
   {"&File",                NULL,           file_menu,   0, NULL},
   {"&Edit",                NULL,           NULL,        0, NULL},
   {NULL,                   NULL,           NULL,        0, NULL}
};

/* we need to load example.dat to access the big font */
DATAFILE *datafile;


/* for the d_edit_proc() object */
char the_string[32] = "Change Me!";


/* since we change the font, we need to store a copy of the original
one */
FONT *original_font;



/* A custom dialog procedure for the 'change font' button. This uses a
 * simple form of inheritance: it calls d_button_proc() to do most of
 * the work, so it behaves exactly like any other button, but when the
 * button is clicked and d_button_proc() returns D_CLOSE, it
intercepts
 * the message and changes the font instead.
 */
int change_font_proc(int msg, DIALOG *d, int c)
{
   int ret;

   /* call the parent object */
   ret = d_button_proc(msg, d, c);

   /* trap the close return value and change the font */
   if (ret == D_CLOSE) {
      if (font == original_font)
	 font = datafile[BIG_FONT].dat;
      else
	 font = original_font;

      return D_REDRAW; 
   }

   /* otherwise just return */
   return ret;
}

/* callback function to specify the contents of the listbox */
char *listbox_getter(int index, int *list_size)
{
   static char *strings[] =
   {
      "Zero",  "One",   "Two",   "Three", "Four",  "Five", 
      "Six",   "Seven", "Eight", "Nine",  "Ten"
   };

   if (index < 0) {
      *list_size = 11;
      return NULL;
   }
   else
      return strings[index]; 
}

#define BLUE 4
#define PINK 5
#define LT_BLUE 6
#define GREY 7
#define LT_GREY 8
#define BLACK 255
#define WHITE 0
#define FG LT_BLUE
#define BG BLUE

DIALOG the_dialog[] =
{
   /* (dialog proc)     (x)   (y)   (w)   (h)   (fg)  (bg)  (key)
(flags)  (d1)                    (d2)  (dp)              (dp2) (dp3)
*/
   { d_clear_proc,      0,    0,    0,    0,    FG,  BG,    0,    0,
0,                      0,    NULL,             NULL, NULL  },
   { d_menu_proc,       0,    0,    0,    0,    FG,  BG,    0,    0,
0,                      0,    menu,             NULL, NULL  },
   { d_edit_proc,       80,   32,   512,  48,   FG,  BG,    0,    0,
sizeof(the_string)-1,   0,    the_string,       NULL, NULL  },
   { d_button_proc,     80,   132,  160,  48,   FG,  BG,    't',  0,
0,                      0,    "&Toggle Me",     NULL, NULL  },
   { d_list_proc,       360,  100,  206,  206,  FG,  BG,    0,    0,
0,                      0,    listbox_getter,   NULL, NULL  },
   { change_font_proc,  80,   232,  160,  48,   FG,  BG,    'f',
D_EXIT,  0,                      0,    "Change &Font",   NULL, NULL
},
   { NULL,              0,    0,    0,    0,    FG,  BG,    0,    0,
0,                      0,    NULL,             NULL, NULL  }
};


/* index of the listbox object in the dialog array */
#define LISTBOX_OBJECT     3



int main(int argc, char *argv[])
{
   int ret;
   char buf1[256], buf2[80], buf3[80];

   /* initialise everything */
   allegro_init();
   install_keyboard(); 
   install_mouse();
   install_timer();

/* set the colors */	
   gui_fg_color=FG;
   gui_bg_color=BG;
   
   set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0);
   set_palette(desktop_pallete);

   /* load the datafile */
   replace_filename(buf1, argv[0], "example.dat", sizeof(buf1));
   datafile = load_datafile(buf1);
   if (!datafile) {
      allegro_exit();
      printf("Error loading %s!\n\n", buf1);
      return 1;
   }

   /* store a copy of the default font */
   original_font = font;

   ret=do_dialog(the_dialog, -1);
   /* and report the results */
   sprintf(buf1, "do_dialog() returned %d", ret);
   sprintf(buf2, "string is '%s'", the_string);
   sprintf(buf3, "listbox selection is %d",
the_dialog[LISTBOX_OBJECT].d1);
   alert(buf1, buf2, buf3, "OK", NULL, 0, 0);
   unload_datafile(datafile);
   return 0;
}

--Regards       David. E. Goble             
             goble [AT] kin.net.au          
          http://www.kin.net.au/goble 
 Po Box 648 Kingscote, Kangaroo Island, SA 5223

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019