○コンボボックスみたいなのを作ってみる 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