○コンボボックスみたいなのを作ってみる 1
フォームのボタンを押すとコンボボックスのような動きをします(様な・・・・)



#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;
Widget button1;

//ボタンやラベルの文字を変更する
void setCaption(Widget w,char*str){
	Arg args[1];
	XtSetArg(args[0],XtNlabel,(XtArgVal)str);
	XtSetValues(w,args,1);
	XClearArea(XtDisplay(w), XtWindow(w), 0, 0, 0, 0, True);//再描画
}

//ボタンやラベルの文字を取得する
void getCaption(Widget w,char*str){
	char*st;
	Arg args[1];
	XtSetArg(args[0],XtNlabel,(XtArgVal)&st);
	XtGetValues(w,args,1);
	strcpy(str,st);
}

void ListCallback( Widget w, XtPointer cld, XtPointer cad ){
	//リストの選択された値をbutton1に出力する
	int index = ((XawListReturnStruct*)cad)->list_index;
	setCaption(button1,ListItem[index]);
	//viewportを非表示にする
	XtVaSetValues(viewport, XtNmappedWhenManaged,False, NULL );
}

//ボタンが押された時の動作
void Button1Callback( Widget w, XtPointer client, XtPointer called )
{
	//ボタンの文字がリストの何行目か調べる
	char s[128];
	getCaption(button1,s);
	//printf("%s\n",s);
	int select = 0;//選択するリストの行
	int i;
	for(i=0;i<ITEMCOUNT;i++){
		if(!strcmp(s,ListItem[i])){
			select = i;
			break;
		}
	}

	//viewportを表示する
	XtVaSetValues(viewport, XtNmappedWhenManaged,True, NULL );
	//ウィンドウを最前面に移動
	XRaiseWindow(XtDisplay(viewport),XtWindow(viewport));

	//リストの高さを取得する
	int listheight=0;
	XtVaGetValues(list, XtNheight,&listheight, NULL );
	//一行あたりの高さを計算
	int RowHeight = listheight/ITEMCOUNT;
	
	
	//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);

	//ボタンの作成
	button1 = XtVaCreateManagedWidget("button1",//ウィジット名
					commandWidgetClass,//ボタンクラスを指定
					form,
					//リソースの直接入力(どんどん追加できる)
					XtNlabel,"",//表示される文字
					XtNwidth,100,//幅と高さ
					XtNheight,20,
					XtNborderWidth,1,//境界線
					XtNjustify,XtJustifyLeft,
					//リソースここまで
					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++;//高さ
	XtSetArg(ar[arc], XtNfromVert,(XtArgVal)button1); arc++;//buttonウィジットの下の
	XtSetArg(ar[arc], XtNvertDistance,(XtArgVal)2); arc++;//2ピクセル下に配置


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

	//viewportを非表示にしておく
	XtVaSetValues(viewport, XtNmappedWhenManaged,False, NULL );



	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);


	XtAddCallback(button1, XtNcallback,Button1Callback,(XtPointer)NULL);//ボタンのコールバック関数を登録

	XtRealizeWidget( top );

	XtAppMainLoop( app_context );
}








▲トップページ > Linux と C