« Thオッズコア・オッドイーブン | トップページ | PHP EXE化ソフト »

2019年3月 7日 (木)

TH-wbRadStudio

 

 

 

 

TH-wbRadStudio

 


 

Windows 10 32bit
[ WinBinder ]
[ Microsoft Visual Studio 2015 ]
[ MinGW ]

 

 

TH-wbRadStudio
[ ティーエイチ・ダブリュビーラッドスタジオ ]

 

THLIB を使ってC言語で簡単にWindows用GUIアプリケーションを作ることが
できるソフトです。

 

THLIBとは、私、平田寿浩が作ったC言語用ライブラリで
配列や文字列を簡単に扱うことができます。
TH-wbRadStudioは、このライブラリと、このライブラリで扱えるようにした
WinBinderで作成されていますので特別なDLLなしで起動できます。

 

ウィンドウ、ボタン、エディットボックスなど、部品の作成・配置には
プログラムを用いることなくグラフィカルに作成することができます。
インターフェースにおける入出力は専用の関数を使いますが
使い方は簡単です。
これは統合環境になっていて、ビジュアルの作成だけでなく
プログラムの作成、さらにコンパイル・ビルドしてEXEファイルを
作成します。

 

MinGWを使ってコンパイルします、別途インストールしてください。 ( thcps.ini )にMinGWのインストール先を設定してください。

 

例:C:\MinGW

 

あらかじめ設定してある以外でライブラリ名など必要なものがある場合
別途追加してください、( thcps.ini )を見ればわかりますが
ライブラリの場合先頭の( lib )と拡張子( .a )を除いた形で書きます。
必要であればインクルードパスとライブラリパスも追加できます。

 

THLIBを使ったアプリケーションの場合300KB程度のEXE単体で動作します。

 

thcps.ini

 

MinGWのインストール先を書いてください
;MinGW path
mingw_path=C:\MinGW


 

 

;==_inc_p start
; インクードパスがあれば追加してください
;==_inc_p end

 

;==_lib_p start
; ライブラリパスがあれば追加してください
;==_lib_p end


 

 

;==def start
WIN32
NDEBUG
_WINDOWS
;==def end

 

ライブラリ名は先頭に ";" を書くことで除外できます
;==lib start
hcwb
thlib
aclui
advapi32
apcups


 

THLIBを使った簡単なループ処理の例

 

hcval *arr, v;
int i, ik;
char *sk;

 

//配列を作成する
arr = hc_make_array("sss", "サンマ", "カレイ", "ヒラメ");

 

//-- TYPE 1 start --
for (i = 0; i < hc_count(arr); i++) {
    hc_get(arr, i, NULL, &v);
    //データをダンプ
    hc_vdump(&v);
//-- TYPE 1 end --
}

 

//-- TYPE 2 start --
i = 0;
TH_FOREACH(arr, i, ik, sk, v) {
    //データをダンプ
    hc_vdump(&v);
}
//-- TYPE 2 end --

 

//hcval変数を解放
hc_vfree(1, arr);

 

▼ THLIB に関する詳細は
こちら

 



 

実際にこのライブラリで( TH-wbRadStudio )と( TH-LocalServer )は作られています。
その他のライブラリに PHP と Python をコントロールできるものも作ってあります
これは、PHP や Python の関数やクラスをC言語から直接呼び出して使えるだけでなく、
スクリプトで書いたオリジナルの関数をC言語内に読み込んでC言語と同じように使えるものです
ちゃんとC言語で扱える形で、必要な引数を与えて戻り値を受けとることができます。
THLIBはスクリプト感覚で使うことができると思うので初心者にどんどん教えていくつもりです。


 

 

フォーム作成

 

 

 

 

 

作成済みアイテムID・アイテム新規追加 [ コンボボックス ]

 

DEL [ ボタン ]
選択したIDのアイテムを削除します。

 

UP [ ボタン ]
IDのアップカウント( 例:1001 => 2001 )
サブウンドウを作成するときIDの衝突を防ぐためにレベルを上げます。

 

アイテムタイプ選択 [ コンボボックス ]

 

配置座標
フォームウィンドウ上の任意な場所でマウスの左ボタンをダブルクリックするとアイテムの作成・移動ができます。
また、マウスの右ボタンを押しながら移動するとアイテムの移動過程を見ながら移動できます。
マウスのボタンを押しながらフォーム画面上を移動させると配置座標のエディットボックス( X , Y )にリアルタイムで入力されます。
アイテムを大まかに移動させた後、スピナーを使って1ピクセル単位で微調整できます。

 

サイズ ( 幅 ) アイテムの大きさ
スピナーとスライダーを使って設定します。
スライダーでの調整はマウスのホイールボタンでも有効です。

 

キャプション
ボタンの見出しやエディットボックスの中の文字列などアイテムに文字列をセットします。
リストボックス、コンボボックス、ゲージなど無効なものもあります。

 

リストビューでは項目を設定できます。
名前 = 100
住所 = 140

項目は改行して追加して、数字はピクセル単位で入力します。
上記例では、リストビューが240ピクセルの幅だとして、その中で占める割合を表しています。

 



 

Window
ウィンドウの(※)タイトルやサイズを設定します。
サイズはフォームウィンドウの端をマウスで掴んで調節します。
または、スピナーで調節します。

 

Menu [ チェックボックス ]
メニューが付きます。( メインウインドウのみ )

 



 

ファイル管理

 

 

 

ファイルリスト
ダブルクリックで開き編集します。
また、ファイルはユーザーが指定したエディタで開くことができます。

 

保存 [ ボタン ]
ウィンドウフォームのデータ及び Python script をバイトコードで保存します。
基本的な保存モードで上書きでもこれを使います。

 

追加保存 [ ボタン ] 同アプリ内で複数のウインドウを作成する場合
新しいウィンドウデータを違うIDグループに更新し、Python script をバイトコードで保存します。

 

 

タイマー機能付 [ チェックボックス ]
プロジェクトを保存する時にチェックを付けて保存するとタイマー機能が使えるようになります。
ボタンなどからの入力がなくても1秒間隔で処理が行えるようになるので時計を表示させたり、
タイマー処理をするようなプログラムを作ることができます。
タイマー用IDは出力された( hcwb_w1_list.txt )で確認できます。
hcwb_w1 の数字 1 はウィンドウの番号を表しています。


 

Console [ チェックボックス ]
C言語モードのみ、アプリと一緒にコンソールが立ち上がりデータをダンプしてチェックしたりすることができます。
テスト用でのみつかいます。コンパイルするときもチェックをつけていなければいけません。

 

ファイル追加
ユーザーの自作関数やクラスを別ファイルで管理したい時などに使います。
Pythonの場合UTF-8形式で書いてください

 

エディタ指定
使い慣れたエディタが使えます。

 



 

コンパイル・ビルド ( EXE作成 )

 

 

 

 

出力ファイル名

ビルド [ ボタン ]
コンパイル・ビルドしてEXEファイルが作成されます。

 

Icon Set [ ボタン ]
アイコンを選択してEXEファイルに貼り付けます。

 



 

 

利用可能なアイテム

 

 

以下が現時点で扱うことができるアイテムです。
WinBinderのすべての機能に対応することは可能ですが、現時点では対応未定です。

 









 

プッシュボタン

普通のボタンです。


 

(mode) -
(value) -
戻り値 -


 

 

ラジオボタン(G)
ラジオボタンは複数の選択肢で構成された中から1つのみ選択できるボタンです。
ラジオボタン(G)はデフォルトでチェック済みの状態で、複数の選択グループの頭です。
複数の選択グループを作る場合にはラジオボタン(G)をそれぞれのグループの先頭に1つ入れておく必要があります。


 

(mode) get, set, eneble
(value) int ( 0 or 1 )
get 戻り値 ( チェックあり = 1 ) ( チェックなし = 0 )


 

 

チェックボックス
ラジオボタンは1グループのなかで1つのみ選択可能なのに対して、
チェックボックスは複数で構成される1グループの中からいくつでも選択可能なボタンです。


 

(mode) get, set, eneble
(value) int ( 0 or 1 )
get 戻り値 ( チェックあり = 1 ) ( チェックなし = 0 )


 

 

エディットボックス
1行型のエディットボックスです。改行は無効です。


 

(mode) get, set, eneble, focus
(value) int, string
get 戻り値 ( string )


 

 

エディットボックス(R)
1行型のエディットボックスですが、リードオンリーでキーボードからの入力はできません。
プログラムからの表示用などに使います。改行は無効です。


 

(mode) get, set, eneble, focus
(value) int, string
get 戻り値 ( string )


 

 

エディットボックス(M)
改行可能なマルチラインのエディットボックスです。


 

(mode) get, set, eneble, focus
(value) int, string
get 戻り値 ( string )


 

 

エディットボックス(M/R)
改行可能なマルチラインのエディットボックスですが、リードオンリーでキーボードからの入力はできません。
プログラムからの表示用などに使います。


 

(mode) get, set, eneble, focus
(value) int, string
get 戻り値 ( string )


 

 

コンボボックス
データ数に関係なく通常時1行スペースで表示されていますが、
クリックすると全データがスライド表示され選択できるようになります。


 

(mode) get, set, set_select, eneble
(value) list ( 配列 )
get 戻り値 ( int ) 配列の key
( セレクトされてない場合 -1 を返します )


 

 

リストボックス
リストボックスは、コンボボックスとは違い縦幅を任意に設定できる選択用ボックスです。
しかし、縦幅は1ピクセル単位では伸ばせず、約20ピクセル単位づつで伸ばせます。

 



 

(mode) get, set, set_select, eneble
(value) list ( 配列 )
get 戻り値 ( int ) 配列の key
( セレクトされてない場合 -1 を返します )


 

 

ラベル
テキストを表示できます。エディットボックスとは違い枠線もないので、
直接ウィンドウ画面に書き込んでいるように見えます。

 



 

(mode) get, set
(value) int, string


 

 

 

フレーム
枠線で囲み見出しを付けられる装飾的なものです。

 



 

(mode) get, set
(value) int, string


 

 

ゲージ
処理の進行状況をゲージで表示します。

 



 

(mode) get, set
(value) int


 

 

リストビュー
リストボックスに似ていますが、リストボックスは一度に一つのデータしか選択できないのに対してリストビューは一度に複数のデータを選択できます。
リストデータにはそれぞれチェックボックスが付いているので、リストのフォーカスまたはダブルクリックによる選択とチェックボックスによる選択の両方の配列の key を得ることができます。


 

(mode) get, set, eneble
(value) list ( 配列 )
get 戻り値 ( array )


 

 

エディットボックス(P)
1行型のエディットボックスですが、( * )文字でマスクされるのでパスワード入力などで使えます。


 

(mode) get, set, eneble, focus
(value) int, string
get 戻り値 ( string )


 

 

リッチエディットボックス
( RTF ) により文字に装飾を加えることができるエディットボックスです。


 

(mode) get, set, eneble, focus
(value) int, string
get 戻り値 ( string )

 

 

 

HTMLコントロール
今バージョンでは対応していません。

 

 

イメージ
画像を表示できます。形式は、ビットマップとアイコンです。

 

●パスについて
通常のファイルパス「絶対パス・相対パス」に加え、
コンパイル・ビルドするときに画像ファイルのパスを以下のように書き換えることで
EXE内にリソースとして挿入して外部ファイル無しでEXE内から直接読み込んで画像を表示できるようにすることができます。

 

◆ビットマップ( BMP )専用で圧縮なし
resbmp:///ファイルの絶対パス

 



 

(mode) image
(value) string
戻り値なし

 

 

メニュー
▼例

 

hcval *data = hc_make_array("svnv", "ファイル(&F)",
       hc_make_array("lssss", 1001, "セット(&D) Ctrl+D", "", "", "Ctrl+D"),
       NULL,
       hc_make_array("ls", IDCLOSE, "終了"));

hcwb_ez_control("set", "menu", data)

 



None は、仕切り線が引かれます。
キーボードアクセラレータも設定できます。
サンプルを参考にしてください。

 

(mode) set
(value) array

 


▼入出力に使う命令はこれだけなので簡単です。
hcwb_ez_control( (mode)(char *)"get ...", (id)int 1001~, (value)(hcval *) );
hcval についてはまた詳しく書きます



 

 

プログラミングについて

 

 

 

 

 

▼サンプルプログラム ( 2つのサンプルのソースコードを見ると理解し易いと思います )

 

Zip ( 204KB )  TH-wbRadstudio3_Sample.zip

 




 

 



 

■アイテムにデータをセットする [ (mode) set ]

 

▼例:1
hcwb_ez_control('set', 1001, hc_conv(&tp, "s", "テスト"));
上記例:1では、ID:1001がエディットボックスだった場合 ( テスト )という文字がエディットボックス内に表示されます。

 

▼例:2
hcval *value = hc_make_array("sss", "りんご", "みかん", "いちご");
hcwb_ez_control("set", 1002, value);

上記例:2では、ID:1002がリストボックスだった場合 [りんご, みかん, いちご ]がリストボックス内にリスト化され表示されます。

 

このように、それぞれのIDが何のコントロールアイテムかプログラマ自身がわかっていればよく、
それに合わせた型( int, string, list )のデータを渡せばいいのです。
そうすればアイテムのタイプは自動で判別され処理されます。



 

■アイテムからデータをゲットする [ (mode) get ]

 

▼例:3
hcval *value = hcwb_ez_control("get", 1001, NULL);
上記例:3では、ID:1001がエディットボックスだった場合、エディットボックス内に入力されているデータが変数 value に格納されます。

▼例:4
//データをセット
hcvak *data = hc_make_array("sss", "りんご", "みかん", "いちご");
hcwb_ez_control("set", 1002, data);

//選択されている配列の key を取得
hcval value, *geykey = hcwb_ez_control("get", 1002, NULL);
hc_get(data, LVAL_P(geykey), NULL, &value);

上記例:4では、ID:1002がリストボックスだった場合、リストボックスでセレクトされているデータの配列の key を取得できます。

▼例:5
//データをセット
hcval *data = hc_make_array(NULL);
hc_array_push(data, "vvv", hc_make_array("sss", "山田", "東京", "123"),
        hc_make_array("sss", "佐藤", "京都", "456"),
        hc_make_array("sss", "田中", "大阪", "789"));
hcwb_ez_control("set", 1003, $data);

//選択されている配列のすべての key を取得
hcval *array = hcwb_ez_control("get", 1003, NULL);

 

上記例:5では、ID:1003がリストビューだった場合、
リストビューでチェックされているデータとセレクトされているデータの配列キーをそれぞれ取得できます。

 

■ウィンドウを閉じる [ (mode) close ]
hcwb_ez_control("close", win, NULL);
win はアイテムのIDではなくウィンドウのハンドル


■アイテムを有効・無効にする [ (mode) enable ]
ボタンなら押せなくしたり、エディットボックスなら入力できなくしたりできます。
(value) 0 = 無効にする , 1 = 有効にする
hcwb_ez_control("eneble", 1001, hc_conv(&tp, "l", 0));
上記例では、ID:1001がプッシュボタンだった場合、クリックして押すことができなくなります。


■アイテムをフォーカスする [ (mode) focus ]
hcwb_ez_control("focus", 1003, NULL);
上記例では、ID:1003がエディットボックスだった場合、エディットボックス内のテキストがフォーカスされます。


■ウィンドウにタイトルをセットする [ (mode) set_title ]
hcwb_ez_control("set_title", win, ' hc_conv(&tp, "s", "タイトル"));
win はアイテムのIDではなくウィンドウのハンドル


■メインウィンドウを閉じる(終了) [ (mode) end ]

 

hcwb_ez_control("end", 0, NULL);


 

■処理中にウェイトをかける [ (mode) wait ]
hcwb_ez_control("wait", 0, hc_conv(&tp, "l", 1000));
PHPの sleep() 関数とは違う働きをします。(value) 1000 は1秒を表します。


 

■外部プログラムの実行 [ (mode) exec ]
wb.ez_control('exec', Path, [コマンド]);
外部EXEの起動や関連付けされたプログラムの起動。
例えば、http://のアドレスならブラウザ、ファイルのパスならエディタで起動されます。

 

▼例
hcval *arr = hc_make_array("ss", "sample.exe", "-a 100 -b 200");
hcval *arr = hc_make_array("s", "http://localhost/index.html");
hcwb_ez_control("exec", 0, arr);

 

PHPの( exec )との違いは、プロセスのループを止めないので外部プログラムからの結果は受け取れませんが、実行直後から他の処理を受付可能です。


 

■スタイルを設定する [ (mode) style ]
hcwb_ez_control("style", 1001, hc_conv(&tp, "l", WBC_CHECKBOXES | WBC_LINES));
現在、リストビューのみに対応しています。
WBC_CHECKBOXES = リストビューにチェックボックスが付きます。
WBC_LINES = リストビューにラインが付きます。

 

 





 

ゲージ処理 例:1 下記例では、ID:1006がゲージだった場合。

 

hcval *array = hc_make_array("sssss", "A", "B", "C", "D", "E");
int i;

hcwb_ez_control("get", 1006, hc_conv(&tp, "l", hc_count(array)));
for (i = 0; i < hc_count(array); i++) {
       hcwb_ez_control("set", 1006, hc_conv(&tp, "l", i + 1));
      
( 何らかの処理 )
}
hcwb::control('set', 1006, 0);

 

 





 

 

プログラムの雛形

 

プロジェクトを保存すると下記のようなコードがウィンドウごとに作られます。
1つのアプリケーションの中で、メイン1個、サブ8個以内でウィンドウを作成できます。
ウィンドウを追加する場合、( 追加保存[ボタン] )で同じプロジェクトフォルダ内に出力してください。
その際、すでにあるウィンドウのアイテムのIDと重複しないようにIDが自動で調整されます。
ウィンドウ番号は、( hcwb_w1 )がメインで、( hcwb_w2 ~ hcwb_w9 )がサブとなります。

クラス内の ini() 関数は初期設定に使い、process() 関数では処理を書きます。
win はウィンドウのハンドルが、id にはアイテムのIDが入ります。
詳しくはサンプルプログラムをご覧ください。

サブウィンドウのタイプは、モーダルダイアログです。
サブウィンドウを開くには下記のように書きます。
hcwb_w2.hcwb_w2().window(win);
hcwb_w2 の数字 2 はウィンドウの番号を表しています。
win はウィンドウのハンドルです。

void hcwb_p1_init(win):
    pass

void hcwb_p1_process(win, id, ctr, lp1, lp2) {
    switch (id) {
      case IDCLOSE:
        hcwb_ez_control("close", win, NULL);
         break;

       default:
          /* 例えばIDが1005のリストビューをダブルクリックで選択された場合、
          下記のようなコードで配列キーを取得することができます */

          if ((lp1 & == WBC_DBLCLICK) && id == 1005) {
              key = hcwb_ez_control("get", 1005, NULL);
         }
      }

}

 

開発中は、print を使ってエラーや取得データの確認などをコンソール画面で確認しながら作業できますが、ビルド( EXE化 )したGUIソフトでは、print などを使った出力は使えませんのでご注意ください。

 

 

その他、プログラムでのみ扱えるアイテム 【win はウィンドウのハンドルです】

 

■メッセージボックス [ (mode) message ]
hcwb_ez_control("message", win, hc_conv(&tp, "s", "実行しました"));

 

■メッセージボックス [ (mode) message_yn ]
戻り値があり ( はい = 1 ) ( いいえ = 0 ) で判断できます。
hcwb_ez_control("message_yn", win, hc_conv(&tp, "s", "実行しますか?"));

 

■ゲットディレクトリパス [ (mode) get_path ]
hcval *path = hcwb_ez_control("get_path", win, NULL);

 

■ゲットファイルパス [ (mode) get_file ]

 

▼全ファイル形式対象
hcval *file = hcwb_ez_control("get_file", win, NULL)

 

▼特定のファイル形式のみを指定する場合
hcval *file, *type = hc_make_array(NULL);
hc_aray_push(type, "vv", hc_make_array("ss", "テキスト", "*.txt"),
           hc_make_array("ss", "HTML", "*.html"));
file = hcwb_ez_control("get_file", win, type);

 

 

 

 

« Thオッズコア・オッドイーブン | トップページ | PHP EXE化ソフト »

プログラム」カテゴリの記事

C言語」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: TH-wbRadStudio:

« Thオッズコア・オッドイーブン | トップページ | PHP EXE化ソフト »