○リスト



■シンプルなリストを作成するプログラム
以下のプログラムをコンパイルするとシンプルなリストが作成されます



#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/List.h>

#define ITEMCOUNT 10//アイテム数
#define LISTWIDTH 100//リストの横幅

char*ListItem[ITEMCOUNT]={"test1","test2","test3","test4","test5","test6","test7","test8","test9","test10"};

void ListCallback( Widget w, XtPointer cld, XtPointer cad ){
	//リストの選択された値を出力する
	int index = ((XawListReturnStruct*)cad)->list_index;
	printf("%s\n",ListItem[index]);
}

main( int argc, char **argv )
{
	XtAppContext app_context;
	Widget top;

	top = XtVaAppInitialize( &app_context, "test", NULL, 0, &argc, argv, NULL,NULL);

	Widget form = XtVaCreateManagedWidget("form",formWidgetClass,top,NULL);

	Widget list = XtVaCreateManagedWidget( "list", listWidgetClass, form,
							XtNdefaultColumns,1,//カラムを1にする
							NULL);
	
	//リストの横幅を指定
	XtVaSetValues(list, XtNwidth,LISTWIDTH, NULL );
	//リストにアイテムと横幅を設定
	XawListChange( list, ListItem,ITEMCOUNT,LISTWIDTH, True );

	XawListHighlight (list, 0);//0番目を選択する
	
	//リスト内でクリックされたイベント
	XtAddCallback( list, XtNcallback, ListCallback,NULL);

	XtRealizeWidget( top );

	XtAppMainLoop( app_context );
}





■リストにスクロールバーを付ける
viewportの中にリストを入れる。
ただし、viewportは高さが32765以上のものを入れることが出来ない
大体2000行ぐらいは通常どうり入るが、高さがあふれてしまうと、listが複数行になる






#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/List.h>
#include <X11/Xaw/Viewport.h>

#define ITEMCOUNT 10//アイテム数
#define LISTWIDTH 100//リストの横幅

char*ListItem[ITEMCOUNT]={"test1","test2","test3","test4","test5","test6","test7","test8","test9","test10"};

void ListCallback( Widget w, XtPointer cld, XtPointer cad ){
	//リストの選択された値を出力する
	int index = ((XawListReturnStruct*)cad)->list_index;
	printf("%s\n",ListItem[index]);
}

main( int argc, char **argv )
{
	XtAppContext app_context;
	Widget top;

	top = XtVaAppInitialize( &app_context, "test", NULL, 0, &argc, argv, NULL,NULL);

	Widget form = XtVaCreateManagedWidget("form",formWidgetClass,top,NULL);

	Arg ar[16];
	int arc=0;
	//XtSetArg(ar[arc], XtNallowHoriz,(XtArgVal)True); arc++;//横スクロールを表示(表示しなければ中身がリサイズされる)
	XtSetArg(ar[arc], XtNallowVert,(XtArgVal)True); arc++;//縦スクロールを表示(表示しなければ中身がリサイズされる)
	XtSetArg(ar[arc], XtNuseRight,(XtArgVal)True); arc++;//スクロールバーの配置位置(右か左か)
	//XtSetArg(ar[arc], XtNuseBottom,(XtArgVal)True); arc++;//スクロールバーの配置位置(上か下か)
	XtSetArg(ar[arc], XtNwidth,(XtArgVal)LISTWIDTH); arc++;//幅
	XtSetArg(ar[arc], XtNheight,(XtArgVal)100); arc++;//高さ

	Widget viewport = XtCreateManagedWidget ("viewport",viewportWidgetClass,form, ar,arc);

	Widget list = XtVaCreateManagedWidget( "list", listWidgetClass, viewport,
							XtNdefaultColumns,1,//カラムを1にする
							NULL);
	
	//リストの横幅を指定
	XtVaSetValues(list, XtNwidth,LISTWIDTH, NULL );
	//リストにアイテムと横幅を設定
	XawListChange( list, ListItem,ITEMCOUNT,LISTWIDTH, True );

	XawListHighlight (list, 0);//0番目を選択する
	
	//リスト内でクリックされたイベント
	XtAddCallback( list, XtNcallback, ListCallback,NULL);

	XtRealizeWidget( top );

	XtAppMainLoop( app_context );
}






■リストの指定行をハイライトにして、その行を先頭に表示する

▼listの一行あたりの高さを求めて、特定の行の座標を計算して、viewportの表示位置を変更します

	//リストの高さを取得する
	int listheight=0;
	XtVaGetValues(list, XtNheight,&listheight, NULL );

	//一行あたりの高さを計算
	int RowHeight = listheight/ITEMCOUNT;
	
	int select = 100;//選択するリストの行

	//viewportを目的の座標までジャンプ
	XawViewportSetCoordinates(viewport, 0,RowHeight*select);
	//リストを選択
	XawListHighlight (list, select);//listのX番目を選択する






ボタンを押すと100行目に移動し選択します








#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/List.h>
#include <X11/Xaw/Viewport.h>
#include <X11/Xaw/Command.h>

#define ITEMCOUNT 500//アイテム数
#define LISTWIDTH 100//リストの横幅

char*ListItem[ITEMCOUNT];

Widget viewport,list;

void ListCallback( Widget w, XtPointer cld, XtPointer cad ){
	//リストの選択された値を出力する
	int index = ((XawListReturnStruct*)cad)->list_index;
	printf("%s\n",ListItem[index]);
}

//ボタンが押された時の動作
void Button1Callback( Widget w, XtPointer client, XtPointer called )
{
	//リストの高さを取得する
	int listheight=0;
	XtVaGetValues(list, XtNheight,&listheight, NULL );
	//一行あたりの高さを計算
	int RowHeight = listheight/ITEMCOUNT;
	
	int select = (int)client;//選択するリストの行
	//viewportを目的の座標までジャンプ
	XawViewportSetCoordinates(viewport, 0,RowHeight*select);
	//リストを選択
	XawListHighlight (list, select);//listのX番目を選択する
}

main( int argc, char **argv )
{
	int i;
	for(i=0;i<ITEMCOUNT;i++){
		char*str=(char *)malloc(10 * sizeof(char));
		sprintf(str,"%d",i);
		ListItem[i]=str;
	}


	XtAppContext app_context;
	Widget top;

	top = XtVaAppInitialize( &app_context, "test", NULL, 0, &argc, argv, NULL,NULL);

	Widget form = XtVaCreateManagedWidget("form",formWidgetClass,top,NULL);

	Arg ar[16];
	int arc=0;
	//XtSetArg(ar[arc], XtNallowHoriz,(XtArgVal)True); arc++;//横スクロールを表示(表示しなければ中身がリサイズされる)
	XtSetArg(ar[arc], XtNallowVert,(XtArgVal)True); arc++;//縦スクロールを表示(表示しなければ中身がリサイズされる)
	XtSetArg(ar[arc], XtNuseRight,(XtArgVal)True); arc++;//スクロールバーの配置位置(右か左か)
	XtSetArg(ar[arc], XtNuseBottom,(XtArgVal)True); arc++;//スクロールバーの配置位置(上か下か)
	XtSetArg(ar[arc], XtNwidth,(XtArgVal)LISTWIDTH); arc++;//幅
	XtSetArg(ar[arc], XtNheight,(XtArgVal)100); arc++;//高さ

	viewport = XtCreateManagedWidget ("viewport",viewportWidgetClass,form, ar,arc);

	list = XtVaCreateManagedWidget( "list", listWidgetClass, viewport,
							XtNdefaultColumns,1,//カラムを1にする
							NULL);
	
	//リストの横幅を指定
	XtVaSetValues(list, XtNwidth,LISTWIDTH, NULL );
	//リストにアイテムと横幅を設定
	XawListChange( list, ListItem,ITEMCOUNT,LISTWIDTH, True );
	
	XawListHighlight (list, 0);//0番目を選択する
	
	//リスト内でクリックされたイベント
	XtAddCallback( list, XtNcallback, ListCallback,NULL);

	//ボタンの作成
	Widget button1 = XtVaCreateManagedWidget("button1",//ウィジット名
					commandWidgetClass,//ボタンクラスを指定
					form,
					//リソースの直接入力(どんどん追加できる)
					XtNlabel,"Select 100",//表示される文字
					XtNwidth,100,//幅と高さ
					XtNheight,20,
					XtNborderWidth,1,//境界線
					XtNfromVert,viewport,XtNvertDistance, 2,//viewportウィジットの2ピクセル下に配置
					//リソースここまで
					NULL);

	XtAddCallback(button1, XtNcallback,Button1Callback,(XtPointer) 100 );//ボタンのコールバック関数を登録(値を渡しながら)

	XtRealizeWidget( top );

	XtAppMainLoop( app_context );
}







▲トップページ > Linux と C