#include <stdlib.h>
#include <windom.h>
struct circle {
short color;
short interior;
short style;
};
static
void __CDECL evnt_destroy_circle( WINDOW *win, short buff[8], void *C) {
free( win->info);
free( C);
}
static
void __CDECL evnt_draw_circle( WINDOW *win, short buff[8], void *data) {
short x, y, w, h;
struct circle *circ = (struct circle *) data;
WindGet( win, WF_WORKXYWH, &x, &y, &w, &h);
vsf_color( win->graf->handle, circ->color);
vsf_interior( win->graf->handle, circ->interior);
vsf_style( win->graf->handle, circ->style);
v_circle( win->graf->handle, x+w/2-1, y+h/2-1, MIN( w, h)/3);
}
static void update_info( WINDOW *win, struct circle *circ) {
sprintf( win->info, "color:%d interior:%d style:%d", circ->color, circ->interior, circ->style);
WindSetStr( win, WF_INFO, win->info);
}
static
void __CDECL evnt_keybd_circle( WINDOW *win, short buff[8], void *data) {
int key = keybd2ascii( evnt.keybd, evnt.mkstate & (K_LSHIFT|K_RSHIFT));
struct circle *circ = (struct circle *) data;
switch( key) {
case 'q':
case 'Q':
if( FormAlert( 1, FA_QUESTION "[Really quit ?][Yes|No]") == 1)
ApplWrite( _AESapid, AP_TERM, 0, 0, 0, 0, 0);
break;
case 'u':
case 'U':
ApplWrite( _AESapid, WM_CLOSED, win->handle, 0, 0, 0, 0);
break;
case 'w':
case 'W':
WindSet( win, WF_BOTTOM, win->handle,0,0,0);
break;
case '-':
circ->color = (--circ->color+16)%16;
update_info(win,circ);
snd_rdw( win);
break;
case '+':
circ->color = ++circ->color%16;
update_info(win,circ);
snd_rdw( win);
break;
}
}
WINDOW *WindCircle( int attr, int color, int interior, int style) {
struct circle *C;
WINDOW *win;
char *info;
C = (struct circle *) malloc( sizeof( struct circle));
C->color = color;
C->interior = interior;
C->style = style;
win = WindCreate( WAT_ALL, app.x, app.y, app.w, app.h);
EvntDataAdd( win, WM_REDRAW, evnt_draw_circle, C, EV_BOT);
EvntDataAdd( win, WM_DESTROY, evnt_destroy_circle, C, EV_TOP);
EvntDataAttach( win, WM_XKEYBD, evnt_keybd_circle, C);
WindSetStr( win, WF_NAME, "WinDom tutorial 1-3 : drawing a circle" );
info = (char*)malloc( 128);
strcpy( info, "---");
WindSetStr( win, WF_INFO, info);
update_info(win,C);
return win;
}
static
void __CDECL evnt_apterm( ) {
while( wglb.first) {
ApplWrite( _AESapid, WM_DESTROY, wglb.first->handle, 0, 0, 0, 0);
EvntWindom( MU_MESAG);
}
}
int main( void) {
WINDOW *win;
ApplInit();
FormAlert( 1, FA_INFO "["
"q: quit, u: close window|"
"w: cycle window|"
"+/-: cycle circle color][OK]");
win = WindCircle( WAT_ALL, RED, FIS_SOLID, 0);
WindOpen( win, app.x, app.y, app.w/2, app.h/2);
win = WindCircle( WAT_ALL, YELLOW, FIS_PATTERN, 9);
WindOpen( win, app.x+10, app.y+10, app.w/2, app.h/2);
EvntAttach( NULL, AP_TERM, evnt_apterm);
while( wglb.first) EvntWindom( MU_MESAG|MU_KEYBD);
ApplExit();
return EXIT_SUCCESS;;
}