『Cプログラミング診断室』目次次(第13章 計算は自分で 配列初期化)

第13章 計算は自分で

プログラムの紹介


■プログラムの紹介■

今回も、またまた同じソフトウェアからです。汲めども尽きぬ Dirty C の「泉」です。

プログラマも3人目の登場です。この人のプログラムは、前回までに紹介した2人よりも単純で 素直だと最初は思っていました。「上手ではないが、とんでもない書き方はしてないよ。連中の中 では一番まともなのでは。」とか最初は評価していました。しかし、開発が進むに連れて、先輩の 「模範プログラム」に影響されてか、はたまた指導によってかは知るよしもありませんが、しだい に変な書き方になってきたのです。本当に怖いですね。

Xウィンドウを使ったソフトウェアでは、会話的操作が多いため、ウィンドウ上にボタンなどを きれいに配置し、マウスだけで複雑な操作ができるようにします。今回のプログラムは、そういう 部分のウィンドの初期化です。(リスト13−1)

リスト13−1 オリジナルプログラム

     1	Frame           rgb_info_frame;
     2	Panel           rgb_info_panel1,
     3	                rgb_info_panel2;
     4	Panel_item      rgb_info_disp1,
     5	                rgb_info_disp2,
     6	                rgb_info_disp3,
     7	                rgb_info_disp4,
     8	                rgb_info_plane,
     9	                rgb_info_num,
    10	                image_set,
    11	                rgb_info_quit_button;
    12	
    13	Canvas          rgb_info_canvas;
    14	Xv_Window       rgb_info_xwin;
    15	Scrollbar       rgb_info_scroll;
    16	Font            rgb_info_font;
    17	GC              rgb_info_gc;
    18	Server_image    rgb_info_image;
    19	PULONG          rgb_info_color;
    20	UWORD           info_no;
    21	UWORD           info_uni_color;
    22	UWORD           info_color_num;
    23	UWORD           info_plane_flag[4];
    24	int             info_canvas_w;
    25	int             info_canvas_h;
    26	UWORD           info_plane;
    27	int             info_color_image;
    28	int             info_image;
    29	PLINE_DATA      info_pline;
    30	
    31	UBYTE           color_pattern[8*16];
    32	static  short info_pattern[] = {
    33	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    34	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    35	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    36	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    37	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    38	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    39	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    40	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    41	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    42	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    43	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    44	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    45	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    46	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    47	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    48	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    49	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    50	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    51	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    52	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    53	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    54	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    55	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    56	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    57	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    58	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    59	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    60	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    61	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    62	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    63	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    64	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    65	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    66	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    67	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    68	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    69	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    70	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    71	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    72	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    73	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    74	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    75	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    76	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    77	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    78	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    79	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    80	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    81	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    82	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    83	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    84	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    85	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    86	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    87	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    88	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    89	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    90	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    91	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    92	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    93	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    94	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    95	    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
    96	    0xFFFF,0xFFFF,0xFFFF,0xFFFF
    97	};
    98	
    99	/************************************************************************
   100	*               色情報表示の初期化                                      *
   101	************************************************************************/
   102	void    rgb_info_init( )
   103	{
   104	Display     *dpy;
   105	int         x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,y;
   106	int         len,choice;
   107	int         width,height;
   108	int         panel_l;
   109	
   110	x1  =   SYS_PANEL_POS_X;
   111	y   =   SYS_PANEL_POS_Y;
   112	x2  =   x1 + IMAGE_WIDTH + SYS_PANEL_GAP_X * 2;
   113	len = strlen( SYS_TEXT_RGB_INFO );
   114	if ( len < strlen ( SYS_TEXT_DISPPLANE ))
   115	     len = strlen ( SYS_TEXT_DISPPLANE );
   116	x3  =  x2 + sys_panel_messagebold_w( len ) + SYS_PANEL_GAP_X;
   117	len =  strlen( SYS_TEXT_PLANE0 );
   118	if ( len < strlen ( SYS_TEXT_BORDER ))
   119	     len = strlen ( SYS_TEXT_BORDER );
   120	if ( len < strlen ( SYS_TEXT_BLACK ))
   121	     len = strlen ( SYS_TEXT_BLACK );
   122	choice   =  sys_panel_choice_w(len) + SYS_PANEL_GAP_X;
   123	width  = x1 + x3 + choice * 4;
   124	height = y * 3 + SYS_PANEL_GAP_Y * 3;
   125	    len = strlen ( SYS_TEXT_SPECIAL );
   126	if ( len < strlen ( SYS_TEXT_IMAGE ))
   127	     len = strlen ( SYS_TEXT_IMAGE );
   128	if ( len < strlen ( SYS_TEXT_COLOR ))
   129	     len = strlen ( SYS_TEXT_COLOR );
   130	len = len + (strlen ( SYS_TEXT_COLOR_Y )) * 4
   131	    + (strlen ( SYS_TEXT_PERCENT )) * 4  + 16 + 4*4 ;
   132	info_canvas_w = sys_panel_list_w( len ) + 36 + SYS_PANEL_GAP_X * 3;
   133	info_canvas_h = SYS_PANEL_LIST_H3 * 4 + 3;
   134	panel_l  = ( width - info_canvas_w ) / 2;
   135	x4  =  panel_l + SYS_PANEL_POS_X;
   136	len =  strlen ( SYS_TEXT_PLANE0 );
   137	x5  =  sys_panel_message_w( len ) + SYS_PANEL_GAP_X;
   138	len =  strlen( SYS_TEXT_EXIT );
   139	x6  =  width - ( SYS_PANEL_POS_X + sys_panel_button_w(len));
   140	len =  strlen( SYS_TEXT_NEXT );
   141	x7  =  x6 - ( SYS_PANEL_GAP_X + sys_panel_button_w(len));
   142	len =  strlen( SYS_TEXT_BEFORE );
   143	x8  =  x7 - ( SYS_PANEL_GAP_X + sys_panel_button_w(len));
   144	len =  strlen( SYS_TEXT_NEXT_PLANE );
   145	x9  =  x8 - ( SYS_PANEL_GAP_X + sys_panel_button_w(len));
   146	len =  strlen( SYS_TEXT_BEFORE_PLANE );
   147	x10 =  x9 - ( SYS_PANEL_GAP_X + sys_panel_button_w(len));
   148	len =  strlen ( SYS_TEXT_PLANE0 );
   149	x11 =  panel_l + sys_panel_messagebold_w( len ) + SYS_PANEL_GAP_X;
   150	len =  strlen( SYS_TEXT_INFO_NUM );
   151	x12 =  x11+sys_panel_messagebold_w( len );
   152	
   153	rgb_info_frame = (Frame)xv_create(base_frame,FRAME,
   154	                                FRAME_LABEL,SYS_CAP_RGB_INFO,
   155	                                XV_X,100,
   156	                                XV_Y,100,
   157	                                FRAME_SHOW_RESIZE_CORNER,FALSE,
   158	                                XV_SHOW,FALSE,
   159	                                NULL);
   160	rgb_info_panel1 = (Panel)xv_create(rgb_info_frame,PANEL,
   161	                                XV_X,0,
   162	                                XV_Y,0,
   163	                                XV_WIDTH,width,
   164	                                XV_HEIGHT,height,
   165	                                WIN_CMS,sys_cms,
   166	                                NULL);
   167	
   168	rgb_info_image = (Server_image)xv_create(NULL,SERVER_IMAGE,
   169	                                XV_WIDTH,IMAGE_WIDTH,
   170	                                XV_HEIGHT,IMAGE_HEIGHT,
   171	                                SERVER_IMAGE_BITS,info_pattern,
   172	                                NULL);
   173	
   174	image_set = (Panel_item)xv_create(rgb_info_panel1,PANEL_CHOICE,
   175	                                XV_X,x1,
   176	                                XV_Y,y,
   177	                                PANEL_CHOICE_IMAGE,0,rgb_info_image,
   178	                                PANEL_ITEM_COLOR,info_color_image,
   179	                                NULL);
   180	(void)xv_create( rgb_info_panel1,PANEL_MESSAGE,
   181	                                XV_X,x2,
   182	                                XV_Y,y,
   183	                                PANEL_LABEL_STRING,SYS_TEXT_RGB_INFO,
   184	                                PANEL_LABEL_BOLD,TRUE,
   185	                                NULL);
   186	
   187	rgb_info_disp1 = (Panel_item)xv_create(rgb_info_panel1,PANEL_CHECK_BOX,
   188	                                PANEL_CHOOSE_ONE,FALSE,
   189	                                PANEL_CHOICE_STRINGS,
   190	                                    SYS_TEXT_INFO_BLACK,
   191	                                    NULL,
   192	                                PANEL_CHOICE_XS,
   193	                                    x3,NULL,
   194	                                PANEL_CHOICE_YS,
   195	                                    y - SYS_PANEL_CHOICE,NULL,
   196	                                NULL);
   197	
   198	rgb_info_disp2 = (Panel_item)xv_create(rgb_info_panel1,PANEL_CHECK_BOX,
   199	                                PANEL_CHOOSE_ONE,FALSE,
   200	                                PANEL_CHOICE_STRINGS,
   201	                                    SYS_TEXT_INFO_BORDER,
   202	                                    NULL,
   203	                                PANEL_CHOICE_XS,
   204	                                    x3+choice,NULL,
   205	                                PANEL_CHOICE_YS,
   206	                                    y - SYS_PANEL_CHOICE,NULL,
   207	                                NULL);
   208	
   209	y += SYS_PANEL_GAP_Y;
   210	
   211	rgb_info_disp3 = (Panel_item)xv_create(rgb_info_panel1,PANEL_CHECK_BOX,
   212	                                PANEL_CHOICE_STRINGS,
   213	                                    SYS_TEXT_PLANE0,
   214	                                    SYS_TEXT_PLANE1,
   215	                                    SYS_TEXT_PLANE2,
   216	                                    SYS_TEXT_PLANE3,
   217	                                    NULL,
   218	                                PANEL_CHOICE_XS,
   219	                                    x3,x3+choice,x3+choice*2,x3+choice*3,NULL,
   220	                                PANEL_CHOICE_YS,
   221	                                    y - SYS_PANEL_CHOICE,NULL,
   222	                                NULL);
   223	
   224	y += SYS_PANEL_GAP_Y;
   225	
   226	(void)xv_create( rgb_info_panel1,PANEL_MESSAGE,
   227	                                    XV_X,x2,
   228	                                    XV_Y,y,
   229	                                    PANEL_LABEL_STRING,SYS_TEXT_DISPPLANE,
   230	                                    PANEL_LABEL_BOLD,TRUE,
   231	                                    NULL);
   232	
   233	rgb_info_disp4 = (Panel_item)xv_create(rgb_info_panel1,PANEL_CHECK_BOX,
   234	                                PANEL_CHOICE_STRINGS,
   235	                                    SYS_TEXT_PLANE0,
   236	                                    SYS_TEXT_PLANE1,
   237	                                    SYS_TEXT_PLANE2,
   238	                                    SYS_TEXT_PLANE3,
   239	                                    NULL,
   240	                                PANEL_CHOICE_XS,
   241	                                    x3,x3+choice,x3+choice*2,x3+choice*3,NULL,
   242	                                PANEL_CHOICE_YS,
   243	                                    y - SYS_PANEL_CHOICE,NULL,
   244	                                NULL);
   245	
   246	y += SYS_PANEL_GAP_Y;
   247	
   248	
   249	rgb_info_plane = (Panel_item)xv_create( rgb_info_panel1,PANEL_MESSAGE,
   250	                                    XV_X,panel_l,
   251	                                    XV_Y,y,
   252	                                    PANEL_LABEL_BOLD,TRUE,
   253	                                    NULL);
   254	
   255	(void)xv_create( rgb_info_panel1,PANEL_MESSAGE,
   256	                                XV_X,x11,
   257	                                XV_Y,y,
   258	                                PANEL_LABEL_STRING,SYS_TEXT_INFO_NUM,
   259	                                PANEL_LABEL_BOLD,TRUE,
   260	                                NULL);
   261	
   262	rgb_info_num = (Panel_item)xv_create( rgb_info_panel1,PANEL_MESSAGE,
   263	                                    XV_X,x12,
   264	                                    XV_Y,y,
   265	                                    PANEL_LABEL_BOLD,TRUE,
   266	                                    NULL);
   267	
   268	(void)xv_create(rgb_info_frame,PANEL,
   269	                                XV_X,0,
   270	                                XV_Y,height,
   271	                                XV_WIDTH,panel_l,
   272	                                XV_HEIGHT,info_canvas_h,
   273	                                NULL);
   274	
   275	
   276	rgb_info_canvas = (Canvas)xv_create( rgb_info_frame,CANVAS,
   277	                                XV_X,panel_l,
   278	                                XV_Y,height,
   279	                                XV_WIDTH,info_canvas_w,
   280	                                XV_HEIGHT,info_canvas_h,
   281	                                CANVAS_WIDTH,info_canvas_w,
   282	                                CANVAS_HEIGHT,info_canvas_h,
   283	                                CANVAS_X_PAINT_WINDOW,TRUE, 
   284	                                CANVAS_AUTO_SHRINK,FALSE,
   285	                                CANVAS_AUTO_EXPAND,FALSE,
   286	                                NULL);
   287	
   288	rgb_info_xwin = (Xv_Window)canvas_paint_window(rgb_info_canvas);
   289	
   290	rgb_info_scroll = (Scrollbar)xv_create(rgb_info_canvas,SCROLLBAR,
   291	                                WIN_DYNAMIC_VISUAL,FALSE,
   292	                                SCROLLBAR_DIRECTION,SCROLLBAR_VERTICAL,
   293	                                SCROLLBAR_PIXELS_PER_UNIT,SYS_PANEL_LIST_H3,
   294	                                NULL);
   295	                                
   296	xv_set(rgb_info_canvas,WIN_CMS,sys_cms,NULL);
   297	
   298	rgb_info_color = (PULONG)xv_get(rgb_info_canvas,WIN_X_COLOR_INDICES);
   299	
   300	
   301	rgb_info_gc = XCreateGC((Display *)xv_get(base_frame,XV_DISPLAY),
   302	                         (Window)xv_get(canvas_paint_window(rgb_info_canvas),
   303	                                        XV_XID));
   304	dpy = (Display *)xv_get(rgb_info_frame,XV_DISPLAY);
   305	
   306	XSetForeground( dpy,rgb_info_gc,0xffffffff);
   307	
   308	XSetBackground( dpy,rgb_info_gc,0);
   309	
   310	#ifdef  OW_I18N
   311	rgb_info_font = (Font)xv_get((Xv_Font)xv_get(rgb_info_canvas,XV_FONT),
   312	                        FONT_SET_ID);
   313	#endif
   314	
   315	(void)xv_create(rgb_info_frame,PANEL,
   316	                                XV_X,panel_l + info_canvas_w,
   317	                                XV_Y,height,
   318	                                XV_WIDTH,panel_l,
   319	                                XV_HEIGHT,info_canvas_h,
   320	                                NULL);
   321	
   322	y = SYS_PANEL_GAP_YB;
   323	
   324	rgb_info_panel2 = (Panel)xv_create(rgb_info_frame,PANEL,
   325	                                XV_X,0,
   326	                                XV_Y,height + info_canvas_h,
   327	                                XV_WIDTH,width,
   328	                                XV_HEIGHT,y + SYS_PANEL_GAP_YBB,
   329	                                NULL);
   330	
   331	(void)xv_create(rgb_info_panel2,PANEL_BUTTON,
   332	                XV_X,x10,
   333	                XV_Y,y,
   334	                PANEL_LABEL_STRING,SYS_TEXT_BEFORE_PLANE,
   335	                PANEL_NOTIFY_PROC,rgb_info_before_plane,
   336	                NULL);
   337	
   338	(void)xv_create(rgb_info_panel2,PANEL_BUTTON,
   339	                XV_X,x9,
   340	                XV_Y,y,
   341	                PANEL_LABEL_STRING,SYS_TEXT_NEXT_PLANE,
   342	                PANEL_NOTIFY_PROC,rgb_info_next_plane,
   343	                NULL);
   344	
   345	(void)xv_create(rgb_info_panel2,PANEL_BUTTON,
   346	                XV_X,x8,
   347	                XV_Y,y,
   348	                PANEL_LABEL_STRING,SYS_TEXT_BEFORE,
   349	                PANEL_NOTIFY_PROC,rgb_info_before_page,
   350	                NULL);
   351	
   352	(void)xv_create(rgb_info_panel2,PANEL_BUTTON,
   353	                XV_X,x7,
   354	                XV_Y,y,
   355	                PANEL_LABEL_STRING,SYS_TEXT_NEXT,
   356	                PANEL_NOTIFY_PROC,rgb_info_next_page,
   357	                NULL);
   358	
   359	rgb_info_quit_button = (Panel_item)xv_create(rgb_info_panel2,PANEL_BUTTON,
   360	                XV_X,x6,
   361	                XV_Y,y,
   362	                PANEL_LABEL_STRING,SYS_TEXT_EXIT,
   363	                PANEL_NOTIFY_PROC,rgb_info_quit,
   364	                NULL);
   365	
   366	window_fit(rgb_info_frame);
   367	}


Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング診断室』目次次(第13章 計算は自分で 配列初期化)