サブメニュの基本的な作り方

以下の手順でサブメニュの制御を行います。基本的な制御の仕方です。
CALL_CSSTOCK(3);
サブメニュを3行分、横幅は24列、用意して、今マウスの押された場所に表示する準備をしなさい。(アンダーラインの部分は省略)
注 NE=3; CSI=INTE(MCX/TEXT_WDIST); CSJ=INTE(MCY/TEXT_HDIST); GOSUB_CSSTOCK; も使えます
GOSUB_CLEAR_IPS;
ボタンをすべてクリアしなさい(無くても良い。実はCSSTOCKでクリアしている)
SUBM_TARGET_SET( 0 ) ;
一番上の行(ゼロ行目)にオブジェクト選択ボタン列を作成しなさい
()の中は行番号
SET_IPS_DOUBLE(1,”距離”,&d_mode,0,1,&d_val,NULL,0,9000,10,0,c_IS_LENGTH,0,NF-1)
1行目に距離入力のボタン一式を作りなさい
GOSUB_DRAW_IPS;
作成したボタンを表示しなさい
pp_1:
繰り返し用のラベル
CALL_YUBI(“指定距離移動”);
“指定距離移動”というメッセージを表示して、指カーソルでマウスの入力待ちをしなさい。
注 CU=7;PATX=5;PATY=2;PATC=6;PATN=0;RB=0;GOSUB_GC_IN;でもOK
if( GOSUB_CHECK_IPS == TRUE ){
いま押された場所(MCX,MCY)のボタンのチェックをして処理をしなさい。
サブメニュ上でマウスクリックがあった場合、戻り値は真。
goto pp_1;
ラベルpp_1の位置にジャンプしなさい。
}
GOSUB_CSBACK;
サブメニュを消去しなさい。



サブメニュをボタンで制御

数値入力やモード設定用に、様々なボタンコントロールを用意してあります。
SET_IPS関数を使って、サブメニュに貼り付けて使います。
SET_IPS(引数
long 行番号
long 開始列番号
long 終了列番号
long 入力タイプ
long ボタンのタイプ
long 表示形態(凸凹平なし)
char* 表示文字列など
double 入力タイプなど
double 設定値など
double 最小値など
double 最大値など
long* 倍精度整数の入力変数など
long* 倍精度整数の参照変数
double* 倍精度実数の入力変数など
double* 倍精度実数の参照変数
char* 文字列の入力変数
long ボタンの番号

                  (deko 1=凸:2=凹:0=平坦:99=表示せず)

加算ボタン

一行め(上から2番めの行)の6列から6列(1列分)に小さな加算ボタンを、数値の範囲0〜9、ボタンを押すと1づつ変化して、範囲を超えたら元にもd屡ように設定するには、次のような指定になります。
SET_IPS( 1,6,6,c_IPS_ADD,1,NULL,1,0,0,9,&type_code,NULL,NULL,NULL,NULL,501);
ボタンを押して範囲を超えた時に最大値(最小値)にとどめる(ローテートさせない)ようにするには
SET_IPS( 1,6,6,c_IPS_ADD,1,NULL,0,0,0,9,&type_code,NULL,NULL,NULL,NULL,521);
最後の512は任意に設定できるボタン番号で、GOSUB_CHECK_IPS;を実行後にIPSME変数に代入される値です。
また通常のサブメニュでは、「型番号」などのキャプションの上を押したときに増減させる仕方をよく使います。この場合は、
SET_IPS( 1,6,11,c_IPS_ADD,1,”型番号”,0,0,0,9,&type_code,NULL,NULL,NULL,NULL,521);
このように、文字列を設定する事で、加算ボタンマークではなく、文字を表示します。
「距離」などの実数を変化させたい場合は、実数引数の場所に実数変数のアドレスを書き込みます。
SET_IPS( 1,6,11,c_IPS_ADD,1,”距離”,0,0,0,9,NULL,NULL,&distance,NULL,NULL,521);

符号反転ボタン

符号反転ボタンは加算値やローテート指定のない加算ボタンと同じ引数になります。
一行め(上から2番めの行)の6列から6列(1列分)に小さな符号反転ボタンを、つくるには、次のような指定になります。
SET_IPS( 1,6,6,c_IPS_SIGN,1,NULL,0,0,0,0,NULL,NULL,&distance,NULL,NULL,502);

空き番号ボタン

レイヤやグループ番号の指定に使います。どちらのタイプかを指定します。
一行め(上から2番めの行)の6列から6列(1列分)に小さなレイヤ空き番号ボタンを、つくるには、次のような指定になります。
SET_IPS( 1,6,6,c_IPS_NEW,1,NULL,c_IS_LAYER,0,0,0,&layer_code,NULL,NULL,NULL,NULL,503);
グループ番号なら
SET_IPS( 1,6,6,c_IPS_NEW,1,NULL,c_IS_GROUP,0,0,0,&layer_code,NULL,NULL,NULL,NULL,503);

イコールボタン

ボタンを押したときに、対になる値と同じにするボタンです。参照する変数をいっしょに指定します。
一行め(上から2番めの行)の6列から6列(1列分)に小さなイコールボタンを、つくるには、次のような指定になります。
SET_IPS( 1,6,6,c_IPS_EQU,1,NULL,0,0,0,0,&x_count,&y_count,NULL,NULL,NULL,504);
ボタンを押すとx_countにy_countの値が入ります。
実数なら
SET_IPS( 1,6,6,c_IPS_EQU,1,NULL,0,0,0,0,NULL,NULL,&x_dist,&y_dist,NULL,504);

ゼロボタン

ボタンを押したときに、ある変数にゼロを代入するボタンです。代入値は指定可能ですから、ゼロ以外の初期化にも使えます。
一行め(上から2番めの行)の6列から6列(1列分)に小さなゼロボタンを、つくるには、次のような指定になります。
SET_IPS( 1,6,6,c_IPS_ZERO,1,NULL,0,0,0,0,&x_count,NULL,NULL,NULL,NULL,505);
ボタンを押すとx_countにy_countの値が入ります。
実数に100をいれるなら
SET_IPS( 1,6,6,c_IPS_ ZERO,1,NULL,0,0,100,0,NULL,NULL,&x_dist,NULL,NULL,505);


チェックボックスボタン

ボタンを押したときに、ある変数を0〜1または2か3の間でローテーションさせて、その値に対応するビットマップ(Chkbox4.bmp)をボタンに表示するボタン。
一行め(上から2番めの行)の0列から1列(1列分)にボタンを、つくるには、次のような指定になります。
SET_IPS( 1,6,6,c_IPS_CHECK,1,NULL,0,0,0,1,&mode,NULL,NULL,NULL,NULL,506);
ボタンを押すたびにmodeが変わります。

文字を指定すると指定桁の最初の2桁にボタンを表示し、残りの桁に文字を表示します。
SET_IPS( 1,0,6,c_IPS_CHECK,1,”ドラッグ”,0,0,0,1,&mode,NULL,NULL,NULL,NULL,506);
また、「確認」のように、ボタンの上に文字をだして、押されている、いないの識別をしたい場合は、タイプの指定を1にします。
SET_IPS( 1,0,6,c_IPS_CHECK,1,”確認”,1,0,0,1,&mode,NULL,NULL,NULL,NULL,506);



ラジオボタン

N者択一を行うボタンです。数個の同じ変数に割付されたラジオボタンはどれかひとつが押されると、その変数にそのボタンの設定値を代入し、そのボタンだけ選択状態にし、他を非選択にします。ビットマップ(Rbutton.bmp)をボタンに表示します。
一行め(上から2番めの行)の0列から1列(2列分)と2列から3列にボタンを、つくるには、次のような指定になります。
SET_IPS( 1,0,1,c_IPS_RADIO,1,NULL,0,0,0,1,&mode,NULL,NULL,NULL,NULL,507);
SET_IPS( 1,2,3,c_IPS_RADIO,1,NULL,1,0,0,1,&mode,NULL,NULL,NULL,NULL,507);
ボタンを押すたびにmodeが変わります。

文字を指定すると指定桁の最初の2桁にボタンを表示し、残りの桁に文字を表示します。
一行め(上から2番めの行)と2行目の0列から12列にボタンを、つくるには、次のような指定になります。
SET_IPS( 1,0,12,c_IPS_RADIO,1,”ラバーバンド”,0,0,0,1,&mode,NULL,NULL,NULL,NULL,507);
SET_IPS( 2,0,12,c_IPS_RADIO,1,”移動”,1,0,0,1,&mode,NULL,NULL,NULL,NULL,507);


文字ラジオボタン

N者択一を行うボタンです。数個の同じ変数に割付されたラジオボタンはどれかひとつが押されると、その変数にそのボタンの設定値を代入し、そのボタンだけ選択状態にし、他を非選択にします。
ラジオボタンと違う点は、文字を表示したボタンである点です。
一行め(上から2番めの行)の0列から3列(4列分)と4列から7列にボタンを、つくるには、次のような指定になります。
SET_IPS( 1,0,3,c_IPS_SELECT,1,NULL,0,0,0,1,&mode,NULL,NULL,NULL,NULL,508);
SET_IPS( 1,4,7,c_IPS_SELECT,1,NULL,1,0,0,1,&mode,NULL,NULL,NULL,NULL,508);
ボタンを押すたびにmodeが変わります。


エディットボックスボタン

文字や数値の入力に使うボタンです。
一行めの10列から19列(20列分)にボタンをつくるには、次のような指定になります。
SET_IPS( 1,10,19,c_IPS_EDIT,-1,NULL,c_IS_VALUE,0,-DBL_MAX,DBL_MAX,NULL,NULL,&distance,NULL,NULL,511);
入力形式は
c_IS_STRING 文字列の入力
c_IS_VALUE 値の入力
c_IS_LENGTH 長さの入力
c_IS_ANGLE 角度の入力
c_IS_LAYER レイヤ番号の入力
c_IS_GROUP グループの入力
これらを設定することで、/スラッシュ入力で「図面から入力」に自動的に切り替わります。
文字列の入力には文字列のポインタのポインタを引き渡します。
char *string = NULL ;
SET_IPS( 1,10,19,c_IPS_EDIT,-1,NULL,c_IS_STRING,0,0,0,NULL,NULL,NULL,NULL,&string,511);
終了前にかならず文字列を開放します。
DELETE_STRING(string);
表示だけで編集させたくない場合は,編集禁止フラグを立てます。
SET_IPS( 1,10,19,c_IPS_EDIT,-1,NULL,c_IS_VALUE,1,-DBL_MAX,DBL_MAX,NULL,NULL,&distance,NULL,NULL,511);




フォントの選択に使うボタンです。押されると、リストボックスを出して選択できます。
一行めの10列から19列(20列分)にボタンをつくるには、次のような指定になります。
char *font_name = NULL ;
SET_IPS( 1,10,19,c_IPS_FONT,-1,NULL,32,10,0,0,&font_num,NULL,NULL,NULL,&font_name,513);
終了前にかならず文字列を開放します。
DELETE_STRING(font_name);
この例では選択リストボックスが幅32桁、縦10行分で現れます。


リストボックスボタン

自前のリストの選択に使うボタンです。押されると、リストボックスを出して選択できます。
一行めの10列から19列(20列分)にボタンをつくるには、次のような指定になります。
char *list[3] ;
list[0]=new_string(NULL,”おはよう”);
list[1]=new_string(NULL,”こんにちは”);
list[2]=new_string(NULL,”こんばんわ”);
long sel_num=0;
SET_IPS( 1,10,19,c_IPS_LIST,-1,NULL,32,3,0,2,&sel_num,NULL,NULL,NULL,&list,514);
終了前にかならず文字列を開放します。
DELETE_STRING(list[0]);
DELETE_STRING(list[1]);
DELETE_STRING(list[2]);
この例では選択リストボックスが幅32桁、縦10行分で現れます。

スタティックボタン

文字や数値の表示に使います。
一行めの10列から19列(20列分)にボタンをつくるには、次のような指定になります。
SET_IPS( 1,10,19,c_IPS_STATIC,0,”表示文字”,-1,0,0,0,NULL,NULL,NULL,NULL,NULL,515);
このボタンは単に表示するだけではなく、設定値を指定する事で代入機能も使えます。
SET_IPS( 1,10,19,c_IPS_STATIC,0,”表示文字”,-1,100,0,0,NULL,NULL,&dist,NULL,NULL,515);
また非表示にして他のボタンと重ねて生成することで、デフォルトに一括変更するなどの用途に使用します。
SET_IPS( 1,10,19,c_IPS_STATIC,99,NULL,-1,100,0,0,NULL,NULL,&dist_1,NULL,NULL,515);
SET_IPS( 1,10,19,c_IPS_STATIC,99,NULL,-1,150,0,0,NULL,NULL,&dist_2,NULL,NULL,515);


色表示ボタン

色番号の色をボックス内に表示します。
一行めの10列から19列(20列分)にボタンをつくるには、次のような指定になります。
SET_IPS( 1,10,19,c_IPS_COLOR,-1,NULL,0,0,1,15,&col_num,NULL,NULL,NULL,NULL,516);


線種表示ボタン

番号の線種をボックス内に表示します。
一行めの10列から19列(20列分)にボタンをつくるには、次のような指定になります。
SET_IPS( 1,10,19,c_IPS_STYLE,-1,NULL,0,0,1,8,&style_num,NULL,NULL,NULL,NULL,517);


フルカラー選択表示ボタン

指定されたフルカラーをボックス内に表示し、押されることで入力できます。
一行めの10列から19列(20列分)にボタンをつくるには、次のような指定になります。
SET_IPS( 1,10,19,c_IPS_SELCOL,-1,NULL,0,0,0,0,,&rgb_color,NULL,NULL,NULL,NULL,518);




実際に距離を入力するボタンを作って見ましょう。
double distance = 0 ;
CALL_CSSTOCK(1);
SET_IPS(0,5,10,c_IPS_EDIT,-1,NULL,c_IS_LENGTH,0,0,DBL_MAX,NULL,NULL,&distance,NULL,NULL,777);
GOSUB_DRAW_IPS;
これで画面にエディットコントロールのついたサブメニュが出ます。
SET_IPS(以降の意味は
0,5,10 ゼロ行目の5桁目から10桁目にボタンをはりなさい。
,c_IPS_EDIT,-1 ボタンのタイプはエディットコントロールで凹状態で表示しなさい。
,NULL 表示様式は任せます。
,c_IS_LENGTH 入力形式は長さです
,0
,0,DBL_MAX 入力値の最小はゼロ、最大はダブル変数の最大値としなさい。
,NULL,NULL
,&distance,NULL 入力変数はダブル変数でdistance、参照変数は有りません。
,NULL
,777 ボタンの番号は777番です。
となります。
次に、入力処理がなされたときに(GOSUB_CHECK_IPS実行時)、このボタンがどういう動きをするかというと、
このボタンは常に変数distanceの値を表示しています。
マウスでクリックされると、表示されていた数値が青バックの選択状態になり、そのまま入力可能になります。
ここでは、入力タイプにc_IS_LENGTH(=2)を指定していますから、スラッシュ[/]リターンで、サブメニュが一旦消えて、図面から距離を拾う事ができます。入力後リターンかマウス左で確定します。[ESC]が押されると元の値に戻します。
変数distanceを指定している他のボタンがあれば自動的に更新します。
という処理が行われてGOSUB_CHECK_IPSから戻ってきます。


簡単ボタン一式作成

距離入力などでは一般に増減ボタンやゼロボタンなどの制御ボタンが必要となります。これを一つ一つ定義するのは面倒なので、標準のパターンを用意しました。


SET_IPS_DOUBLE(の引数の意味は
long 表示行
char* 表示する文字列
double 表示した文字列を押されたときの増減値
long* 頭によくある○×を決める変数。NULLにするとなくなる。
long モードの最小値
long モードの最大値
double* 入力したい変数
double* イコールボタンで参照したい変数
double 入力変数の制限値 最小値
double 入力変数の制限値 最大値
double 加算ボタンの増減値。ゼロにするとボタンは出ない。
double ゼロボタンのゼロ値。制限値範囲外にするとボタンは出ない。
long 入力のタイプ(0:文字列1:値2:長さ3:角度4:レイヤ5:グループ)
long 表示開始列番号
long 表示終了列番号
です