[ Next Article |
Previous Article |
Book Contents |
Library Home |
Legal |
Search ]
GL3.2 for AIX: Graphics Library (GL) Technical Reference
popup.c Example C Language Program
/*
popup.c:
Demonstrates "how to write your own popup menu" routine
s.
Use LEFTMOUSE instead of RIGHTMOUSE to pop up the me
nus.
*/
#include <gl/gl.h>
#include <gl/device.h>
#define LINE 1
#define POINTS 2
#define CIRCLE 3
#define RECT 4
#define RECTF 5
#define QUIT 6
typedef struct {
short type;
char *text;
} popupentry;
popupentry mainmenu[] = {
{LINE, "Line"},
{POINTS, "100 points"},
{CIRCLE, "Filled circle"},
{RECT, "Outlined rectangle"},
{RECTF, "Filled rectangle"},
{QUIT, "Quit"},
{0, 0}
};
/* mark end of menu */
main()
{
long win;
short val, command;
prefposition(0,XMAXSCREEN,0,YMAXSCREEN);
win = winopen("popup");
ortho2(-1.0, 1.0, -1.0, 1.0);
overlay(2);
gconfig();
drawmode(OVERDRAW);
mapcolor(0, 0, 0, 0); /* background only */
mapcolor(1, 120, 120, 120); /* popup background */
mapcolor(2, 255, 255, 255); /* popup text only */
drawmode(NORMALDRAW);
qdevice(RIGHTMOUSE);
qdevice(LEFTMOUSE);
tie(LEFTMOUSE, MOUSEX, MOUSEY);
color(0);
clear();
while (TRUE) {
switch(qread(&val)) {
case REDRAW:
reshapeviewport();
drawstuff(command);
break;
case LEFTMOUSE:
drawstuff(command = popup(mainmenu));
default:
break;
}
}
}
drawstuff(command)
short command;
{
register i, j;
color(0);
clear();
color(GREEN);
switch(command) {
case LINE:
move2(-1.0, -1.0);
draw2(1.0, 1.0);
break;
case POINTS:
for (i = 0; i < 10; i++)
for (j = 0; j < 10; j++)
pnt2(i/20.0, j/20.0);
break;
case CIRCLE:
circf(0.0, 0.0, 0.5);
break;
case RECT:
rect(-0.5, -0.5, 0.5, 0.5);
break;
case RECTF:
rectf(-0.5, -0.5, 0.5, 0.5);
break;
case QUIT:
greset();
gexit();
exit(0);
default:
break;
}
}
popup(names)
popupentry names[];
{
register short i, menucount;
short menutop, menubottom, menuleft, menuright;
short lasthighlight = -1, highlight;
short dummy, x, y;
menucount = 0;
qread(&x);
qread(&y);
pushmatrix();
drawmode(OVERDRAW);
ortho2(-0.5, 1279.5, -0.5, 1023.5);
while (names[menucount].type)
menucount++;
menutop = y + menucount*8;
menubottom = y - menucount*8;
if (menutop > YMAXSCREEN) {
menutop = YMAXSCREEN;
menubottom = menutop - menucount*16;
}
if (menubottom < 0) {
menubottom = 0;
menutop = menubottom + menucount*16;
}
menuleft = x - 100;
menuright = x + 100;
if (menuleft < 0) {
menuleft = 0;
menuright = menuleft + 200;
}
if (menuright > XMAXSCREEN) {
menuright = XMAXSCREEN;
menuleft = menuright - 200;
}
color(0);
clear();
color(1); /* menu background */
rectfi(menuleft, menubottom, menuright, menutop);
color(2); /* menu text */
move2i(menuleft, menubottom);
draw2i(menuleft, menutop);
draw2i(menuright, menutop);
draw2i(menuright, menubottom);
for (i = 0; i < menucount; i++) {
move2i(menuleft, menutop - (i+1)*16);
draw2i(menuright, menutop - (i+1)*16);
cmov2i(menuleft + 10, menutop - 14 - i*16);
charstr(names[i].text);
}
while (!qtest()) {
x = getvaluator(MOUSEX);
y = getvaluator(MOUSEY);
if (menuleft < x && x < menuright &&
menubottom < y && y < menutop)
{
highlight = (menutop - y)/16;
if (lasthighlight != -1 && lasthighlight != highlight) {
color(1);
rectfi(menuleft+1,
menutop - lasthighlight*16 - 15,
menuright-1, menutop - lasthighlight*16 - 1);
color(2);
cmov2i(menuleft + 10,
menutop - 14 - lasthighlight*16);
charstr(names[lasthighlight].text);
}
if (lasthighlight != highlight) {
color(2);
rectfi(menuleft+1, menutop - highlight*16 - 15,
menuright-1, menutop - highlight*16 - 1);
color(1);
cmov2i(menuleft + 10,
menutop - 14 - highlight*16);
charstr(names[highlight].text);
}
lasthighlight = highlight;
}
else /* the cursor is outside the menu */
{
if (lasthighlight != -1)
{
color(1);
rectfi(menuleft+1,
menutop - lasthighlight*16 - 15,
menuright-1, menutop - lasthighlight*16 - 1);
color(2);
cmov2i(menuleft + 10,
menutop - 14 - lasthighlight*16);
charstr(names[lasthighlight].text);
lasthighlight = -1;
}
}
}
qread(&dummy);
qread(&x);
qread(&y);
color(0);
rectfi(menuleft, menubottom, menuright, menutop);
if (menuleft<x && x<menuright && menubottom<y && y<menutop)
x = (menutop - y)/16;
else
x = 0;
drawmode(NORMALDRAW);
popmatrix();
return names[x].type;
}
Related Information
[ Next Article |
Previous Article |
Book Contents |
Library Home |
Legal |
Search ]