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

📄 canvas_demo.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef sccsstatic	char sccsid[] = "@(#)canvas_demo.c 1.1 92/07/30";#endif#endif/* * Canvas_demo -- demonstrate the Canvas Subwindow Package. * Copyright (c) 1986 by Sun Microsystems, Inc. */#include <sys/types.h>#include <sunwindow/attr.h>#include <sunwindow/defaults.h>#include <suntool/alert.h>#include <suntool/frame.h>#include <suntool/sunview.h>#include <suntool/panel.h>#include <suntool/canvas.h>#include <suntool/walkmenu.h>#include <suntool/scrollbar.h>#ifdef STANDALONE#define EXIT(n)		exit(n)#else#define EXIT(n)		return(n)#endifstatic Frame		base_frame;static Frame 		props /* = 0 */;static Canvas		canvas;static Scrollbar	vertical_sb, horizontal_sb;static Menu		menu;static int		object_width, object_height;static Panel_item	canvas_width, canvas_height, canvas_margin;static Panel_item	canvas_vertical_sb, canvas_horizontal_sb;static Panel_item	canvas_retained, canvas_auto_clear;static Panel_item	canvas_auto_expand, canvas_auto_shrink;static Panel_item	object_width_item, object_height_item;static short icon_data[] = {#include <images/canvas_demo.icon>};static mpr_static(canvas_demo_pr, 64, 64, 1, icon_data);/* panel notify procs */static void	modify_canvas();static void	clear_canvas();static void	draw_canvas();static void	show_props();static void	quit();/* canvs procs */static void	resize_canvas();static void	repaint_canvas();static void	handle_event();/* utilities */static void	init_panel();static void	draw_something();static void	draw_line();char		*sprintf();/* property sheet procs */static void	create_props();static void	fixed_image();static void	modify_object();static void	hide_props();#ifdef STANDALONEmain(argc, argv)#elseint canvas_demo_main(argc, argv)#endifint argc;char **argv;{    static  Notify_value my_destroy_func();    base_frame =	window_create((Window)0, FRAME,	    FRAME_LABEL,    	"CANVAS DEMO",	    FRAME_ICON,	    	icon_create(ICON_IMAGE, &canvas_demo_pr, 0),	    FRAME_NO_CONFIRM,	TRUE,	    FRAME_ARGS,     	argc, argv,	    0);    (void) notify_interpose_destroy_func(base_frame, my_destroy_func);        init_panel(base_frame);        vertical_sb = scrollbar_create(SCROLL_LINE_HEIGHT, 5, (char *)0);    horizontal_sb = scrollbar_create(SCROLL_LINE_HEIGHT, 5, (char *)0);    menu =        menu_create(            MENU_ACTION_ITEM, "Clear", clear_canvas,            MENU_ACTION_ITEM, "Draw",  draw_canvas,            MENU_ACTION_ITEM, "Props", show_props,            MENU_ACTION_ITEM, "Quit",  quit,            0);                 canvas =         window_create(base_frame, CANVAS, 	    WIN_VERTICAL_SCROLLBAR,	vertical_sb,	    WIN_HORIZONTAL_SCROLLBAR,	horizontal_sb,	    WIN_CONSUME_PICK_EVENT,	LOC_DRAG,	    WIN_EVENT_PROC, 		handle_event,	    CANVAS_WIDTH,		750,	    CANVAS_HEIGHT,		750,	    CANVAS_AUTO_SHRINK,		FALSE,	    CANVAS_FIXED_IMAGE,		FALSE,	    CANVAS_RESIZE_PROC,		resize_canvas,	    0),    object_width	= (int) window_get(canvas, CANVAS_WIDTH) - 20;    object_height	= (int) window_get(canvas, CANVAS_HEIGHT) - 20;    draw_something(canvas);    window_main_loop(base_frame);    EXIT(0);}static voidinit_panel(base_frame_local)Frame	base_frame_local;{    Panel	panel;    panel = window_create(base_frame_local, PANEL, PANEL_LABEL_BOLD, TRUE, 0);    canvas_width =         panel_create_item(panel, PANEL_SLIDER,            PANEL_LABEL_STRING, "Width ",            PANEL_SLIDER_WIDTH, 200,	    PANEL_MIN_VALUE, 0,	    PANEL_MAX_VALUE, 800,	    PANEL_NOTIFY_PROC, modify_canvas,	    0);    canvas_height =         panel_create_item(panel, PANEL_SLIDER,	    PANEL_LABEL_STRING, "Height",	    PANEL_SLIDER_WIDTH, 200,	    PANEL_MIN_VALUE, 0,	    PANEL_MAX_VALUE, 800,	    PANEL_NOTIFY_PROC, modify_canvas,	    0);    canvas_margin =         panel_create_item(panel, PANEL_SLIDER,	    PANEL_LABEL_STRING, "Margin",	    PANEL_SLIDER_WIDTH, 200,	    PANEL_MIN_VALUE, 0,	    PANEL_MAX_VALUE, 100,	    PANEL_NOTIFY_PROC, modify_canvas,	    0);    canvas_vertical_sb = 	panel_create_item(panel, PANEL_CYCLE,	    PANEL_ITEM_X, ATTR_COL(0),	    PANEL_ITEM_Y, ATTR_ROW(4),	    PANEL_LABEL_STRING, "Vertical Scrollbar:   ",	    PANEL_CHOICE_STRINGS, "NO", "YES", 0,	    PANEL_VALUE, 1,	    PANEL_NOTIFY_PROC, modify_canvas,	    0);    canvas_horizontal_sb = 	panel_create_item(panel, PANEL_CYCLE,	    PANEL_ITEM_X, ATTR_COL(0),	    PANEL_ITEM_Y, ATTR_ROW(5),	    PANEL_LABEL_STRING, "Horizontal Scrollbar: ",	    PANEL_CHOICE_STRINGS, "NO", "YES", 0,	    PANEL_VALUE, 1,	    PANEL_NOTIFY_PROC, modify_canvas,	    0);    canvas_retained = 	panel_create_item(panel, PANEL_CYCLE,	    PANEL_ITEM_X, ATTR_COL(33),	    PANEL_ITEM_Y, ATTR_ROW(4),	    PANEL_LABEL_STRING, "Retained:   ",	    PANEL_CHOICE_STRINGS, "NO", "YES", 0,	    PANEL_VALUE, 1,	    PANEL_NOTIFY_PROC, modify_canvas,	    0);    canvas_auto_clear = 	panel_create_item(panel, PANEL_CYCLE,	    PANEL_ITEM_X, ATTR_COL(33),	    PANEL_ITEM_Y, ATTR_ROW(5),	    PANEL_LABEL_STRING, "Auto Clear: ",	    PANEL_CHOICE_STRINGS, "NO", "YES", 0,	    PANEL_VALUE, 1,	    PANEL_NOTIFY_PROC, modify_canvas,	    0);    canvas_auto_expand = 	panel_create_item(panel, PANEL_CYCLE,		PANEL_ITEM_X, ATTR_COL(57),		PANEL_ITEM_Y, ATTR_ROW(4),		PANEL_LABEL_STRING, "Auto Expand: ",		PANEL_CHOICE_STRINGS, "NO", "YES", 0,		PANEL_VALUE, 1,		PANEL_NOTIFY_PROC, modify_canvas,		0);    canvas_auto_shrink = 	panel_create_item(panel, PANEL_CYCLE,	    PANEL_ITEM_X, ATTR_COL(57),	    PANEL_ITEM_Y, ATTR_ROW(5),	    PANEL_LABEL_STRING, "Auto Shrink: ",	    PANEL_CHOICE_STRINGS, "NO", "YES", 0,	    PANEL_VALUE, 0,	    PANEL_NOTIFY_PROC, modify_canvas,	    0);    (void)panel_create_item(panel, PANEL_BUTTON, 	    PANEL_ITEM_X, ATTR_COL(58),	    PANEL_ITEM_Y, ATTR_ROW(0) + 5,	    PANEL_LABEL_IMAGE, panel_button_image(panel, "CLEAR", 5, (Pixfont *)0),	    PANEL_NOTIFY_PROC, clear_canvas,	    0);    (void)panel_create_item(panel, PANEL_BUTTON, 	    PANEL_ITEM_X, ATTR_COL(68),	    PANEL_ITEM_Y, ATTR_ROW(0) + 5,	    PANEL_LABEL_IMAGE, panel_button_image(panel, "DRAW", 5, (Pixfont *)0),	    PANEL_NOTIFY_PROC, draw_canvas,	    0);    (void)panel_create_item(panel, PANEL_BUTTON, 	PANEL_ITEM_X, ATTR_COL(58),	PANEL_ITEM_Y, ATTR_ROW(1) + 10,	PANEL_LABEL_IMAGE, panel_button_image(panel, "PROPS", 5, (Pixfont *)0),	PANEL_NOTIFY_PROC, show_props,	0);    (void)panel_create_item(panel, PANEL_BUTTON, 	PANEL_ITEM_X, ATTR_COL(68),	PANEL_ITEM_Y, ATTR_ROW(1) + 10,	PANEL_LABEL_IMAGE, panel_button_image(panel, "QUIT", 5, (Pixfont *)0),	PANEL_NOTIFY_PROC, quit,	0);    (void)window_fit_height(panel);}/* panel notify procs */static voidmodify_canvas(item, event)Panel_item	item;Event		*event;{    (void)window_set(canvas, 	CANVAS_WIDTH,		panel_get_value(canvas_width),	CANVAS_HEIGHT,		panel_get_value(canvas_height),	CANVAS_MARGIN,		panel_get_value(canvas_margin),	CANVAS_AUTO_CLEAR,	panel_get_value(canvas_auto_clear),	CANVAS_AUTO_EXPAND,	panel_get_value(canvas_auto_expand),	CANVAS_AUTO_SHRINK,	panel_get_value(canvas_auto_shrink),	0);    if (panel_get_value(canvas_retained) != 	window_get(canvas, CANVAS_RETAINED)) {	    (void)window_set(canvas, 		CANVAS_RETAINED, panel_get_value(canvas_retained),		0);	if (window_get(canvas, CANVAS_RETAINED))	    (void)window_set(canvas, CANVAS_REPAINT_PROC, 0, 0);	else	    (void)window_set(canvas, CANVAS_REPAINT_PROC, repaint_canvas, 0);	clear_canvas(item, event);	draw_something(canvas);    }    if ((int) panel_get_value(canvas_vertical_sb)) {	if (!window_get(canvas, WIN_VERTICAL_SCROLLBAR))	    (void)window_set(canvas, WIN_VERTICAL_SCROLLBAR, vertical_sb, 0);    } else	(void)window_set(canvas, WIN_VERTICAL_SCROLLBAR, 0, 0);    if ((int) panel_get_value(canvas_horizontal_sb)) {	if (!window_get(canvas, WIN_HORIZONTAL_SCROLLBAR))	    (void)window_set(canvas, WIN_HORIZONTAL_SCROLLBAR, horizontal_sb, 0);    } else	(void)window_set(canvas, WIN_HORIZONTAL_SCROLLBAR, 0, 0);    /* make sure we have the latest width and height */    if (window_get(canvas, CANVAS_WIDTH) != panel_get_value(canvas_width))	(void)panel_set_value(canvas_width, window_get(canvas, CANVAS_WIDTH));    if (window_get(canvas, CANVAS_HEIGHT) != panel_get_value(canvas_height))	(void)panel_set_value(canvas_height, window_get(canvas, CANVAS_HEIGHT));}/* ARGSUSED */static voidclear_canvas(item, event)Panel_item	item;Event		*event;{    Pixwin	*pw	= canvas_pixwin(canvas);    (void)pw_writebackground(pw,0,0,(int)(LINT_CAST(window_get(canvas, CANVAS_WIDTH))),	(int)(LINT_CAST(window_get(canvas, CANVAS_HEIGHT))), PIX_CLR);}/* ARGSUSED */static voiddraw_canvas(item, event)Panel_item	item;Event		*event;{    draw_something(canvas);}/* ARGSUSED */static voidshow_props(item, event)Panel_item	item;Event		*event;{    if (!props)	create_props();    (void)panel_set_value(object_width_item, object_width);    (void)panel_set_value(object_height_item, object_height);    (void)window_set(props, WIN_SHOW, TRUE, 0);}/* ARGSUSED */static voidquit(item, event)Panel_item	item;Event		*event;{    /* quit without user confirmation */    (void)window_set(base_frame, FRAME_NO_CONFIRM, TRUE, 0);    (void)window_destroy(base_frame);}/* canvas procs */static voidresize_canvas(canvas_local, width, height)Canvas	canvas_local;int	width, height;{    (void)panel_set_value(canvas_width, width);    (void)panel_set_value(canvas_height, height);    if (!window_get(canvas_local, CANVAS_FIXED_IMAGE)) {	object_width = width - 20;	object_height = height - 20;    }}/* ARGSUSED */static voidrepaint_canvas(canvas_local, pw, rect_list)Canvas		canvas_local;Pixwin		*pw;Rectlist	*rect_list;{    draw_something(canvas_local);}/* ARGSUSED */static voidhandle_event(canvas_local, event, arg)Canvas	canvas_local;Event	*event;caddr_t	arg;{    Pixwin	*pw	= canvas_pixwin(canvas_local);    short	draw	= FALSE;    short	erase	= FALSE;        if (event_is_up(event))        return;    switch (event_action(event)) {        case MS_LEFT:            draw = TRUE;            break;                    case MS_MIDDLE:	    erase = TRUE;	    break;	            case LOC_DRAG:            if (window_get(canvas_local, WIN_EVENT_STATE, MS_LEFT))                draw = TRUE;            else if (window_get(canvas_local, WIN_EVENT_STATE, MS_MIDDLE))                erase = TRUE;	    break;	case MS_RIGHT:	    /* translate the event to window space,	     * then show the menu.	     */	    (void) menu_show(menu, canvas_local, 	               canvas_window_event(canvas_local, event), 0);		    break;		default:	    break;    }        if (draw)        (void)pw_put(pw, event_x(event), event_y(event), 1);    if (erase)        (void)pw_put(pw, event_x(event), event_y(event), 0);}	        /* utilities */static voiddraw_something(canvas_local)Canvas	canvas_local;{    Pixwin	*pw	= canvas_pixwin(canvas_local);    draw_line(pw, 10, 10, object_width, 10);    draw_line(pw, object_width, 10, object_width, object_height);    draw_line(pw, object_width, object_height, 10, object_height);    draw_line(pw, 10, object_height, 10, 10);    draw_line(pw, 10, 10, object_width, object_height);    draw_line(pw, 10, object_height, object_width, 10);}static voiddraw_line(pw, x1, y1, x2, y2)Pixwin	*pw;int	x1, y1, x2, y2;{    char	buffer[32];    (void)sprintf(buffer, "(%d, %d)", x1, y1);    (void)pw_text(pw, x1, y1, PIX_SRC, (struct pixfont *)0, buffer);    (void)pw_vector(pw, x1, y1, x2, y2, PIX_SRC, 1);}/* property sheet procs */static voidcreate_props(){    Panel	panel;    props = window_create(base_frame, FRAME, 0);    panel = window_create(props, PANEL, 0);    (void)panel_create_item(panel, PANEL_CYCLE,	PANEL_ITEM_X, ATTR_COL(1),	PANEL_ITEM_Y, ATTR_ROW(0),	PANEL_LABEL_STRING, "Fixed Image: ",	PANEL_CHOICE_STRINGS, "NO", "YES", 0,	PANEL_VALUE, 0,	PANEL_NOTIFY_PROC, fixed_image,	0);    (void)panel_create_item(panel, PANEL_BUTTON, 	PANEL_ITEM_X, ATTR_COL(30),	PANEL_ITEM_Y, ATTR_ROW(0),	PANEL_LABEL_IMAGE, panel_button_image(panel, "DONE", 0, (Pixfont *)0),	PANEL_NOTIFY_PROC, hide_props,	0);    object_width_item = 	panel_create_item(panel, PANEL_SLIDER,	    PANEL_LABEL_STRING, "Width ",	    PANEL_SLIDER_WIDTH, 200,	    PANEL_MIN_VALUE, 0,	    PANEL_MAX_VALUE, 800,	    PANEL_CLIENT_DATA, 0,	    PANEL_SHOW_ITEM, FALSE,	    PANEL_NOTIFY_PROC, modify_object,	    0);    object_height_item = 	panel_create_item(panel, PANEL_SLIDER,	    PANEL_LABEL_STRING, "Height",	    PANEL_SLIDER_WIDTH, 200,	    PANEL_MIN_VALUE, 0,	    PANEL_MAX_VALUE, 800,	    PANEL_CLIENT_DATA, 1,	    PANEL_SHOW_ITEM, FALSE,	    PANEL_NOTIFY_PROC, modify_object,	    0);        (void)window_fit(panel);    (void)window_fit(props);}/* ARGSUSED */static voidfixed_image(item, is_fixed, event)Panel_item	item;int		is_fixed;Event		*event;{    (void)window_set(canvas, CANVAS_FIXED_IMAGE, is_fixed, 0);    (void)panel_set(object_width_item, PANEL_SHOW_ITEM, is_fixed, 0);    (void)panel_set(object_height_item, PANEL_SHOW_ITEM, is_fixed, 0);}static voidmodify_object(item, value, event)Panel_item	item;int		value;Event		*event;{    if (panel_get(item, PANEL_CLIENT_DATA))	object_height = value;    else	object_width = value;    clear_canvas(item, event);    draw_something(canvas);}/* ARGSUSED */static voidhide_props(item, event)Panel_item	item;Event		*event;{    (void)window_set(props, WIN_SHOW, FALSE, 0);}static Notify_valuemy_destroy_func(client, status)    Notify_client	client;    Destroy_status	status;{    int		windowfd = (int)window_get(    		    (Window)(LINT_CAST(client)), WIN_FD);    if (status == DESTROY_CHECKING) {	int	result;	Event	event;	result = alert_prompt(		(Frame)client,		&event,		ALERT_MESSAGE_STRINGS,		    "Are you sure you want to Quit?",	            0,		ALERT_BUTTON_YES,	"Confirm",		ALERT_BUTTON_NO,	"Cancel",		ALERT_OPTIONAL,		1,		ALERT_NO_BEEPING,	1,		0);	if (result == ALERT_YES) {	    return(notify_next_destroy_func(client, status));	} else {	    (void) notify_veto_destroy(	    	(Notify_client)(LINT_CAST(client)));	    return(NOTIFY_DONE);	}    }    return(notify_next_destroy_func(client, status));}

⌨️ 快捷键说明

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