全然更新しないブログ
HSPメモ帳
COMBOBOXの作成
「COMBOBOXの作成」
HSP標準命令「combox」でも作成できますが、
スタイルは変更できません。
そこでAPIを使用して作成してみます。
◆作成方法
- llmod.asをインクルードする
※「dllproc」を使用する為
- COMBOBOXの作成
「CreateWindowExA」関数で
クラス名に「COMBOBOX」を指定します。
prm.0 ウィンドウスタイル
prm.1 クラス名「COMBOBOX」指定
prm.2 ウィンドウ名 0を指定
prm.3 ウィンドウスタイル
prm.4~7 オブジェクトの位置とサイズ
prm.8 親ウィンドウ mref bmscr,67:bmscr.13を指定
prm.9 ウィンドウID
※HSPオブジェクトIDとバッティングしないように
256(0x0100)以上を指定します。
prm.10 インスタンスハンドル bmscr.14を指定
prm.11 0を指定
以下サンプルです。
※見た目判りやすくするためにコンボボックス作成後、
「CB_ADDSTRING 0x0143」メッセージで文字を追加しています。
スタイル:WS_CHILD(0x40000000)と WS_VISIBLE(0x10000000)のみ | |
#include "llmod.as" screen 0,150,100 :color 192,192,192 : boxf mref bmscr,67 : title "COMBOBOX" //コンボボックスの作成 prm=0 : class="COMBOBOX" : getptr prm.1,class prm.2=0 prm.3=0x50000000 //ウィンドウスタイル prm.4=10,10,winx-20,winy-20,bmscr.13,0x0100,bmscr.14,0 dllproc "CreateWindowExA",prm,12,D_USER : hcb=dllret //文字の追加 sdim cbdata,1024 prm=hcb,0x0143,0 : getptr prm.3,cbdata cbdata="文字の追加" : dllproc "SendMessageA",prm,4,D_USER cbdata="CB_ADDSTRING" : dllproc "SendMessageA",prm,4,D_USER cbdata="cb_addstring" : dllproc "SendMessageA",prm,4,D_USER cbdata="コンボボックス" : dllproc "SendMessageA",prm,4,D_USER stop | |
コンボボックススタイル prm.3 = 0x50300040 に変更
| |
コンボボックススタイル prm.3 = 0x50300042 に変更
CBS_AUTOHSCROLL(0x0040) WS_VSCROLL(0x00200000) WS_HSCROLL(0x00100000) | |
コンボボックススタイル prm.3 = 0x50300043 に変更
CBS_AUTOHSCROLL(0x0040) WS_VSCROLL(0x00200000) WS_HSCROLL(0x00100000) | |
|
コメント ( 0 ) | Trackback ( 0 )
カレンダーを作成
「カレンダーの作成」
◆作成方法
- llmod.asをインクルードする
※「dllproc」を使用する為
- 「InitCommonControls」関数を使用する
コモンコントロールダイナミックリンクライブラリ(DLL)が
ロードされた状態にあることを保証します。
※SysMonthCal32を使用する為
- カレンダーを作成する
「CreateWindowExA」関数で
クラス名にSysMonthCal32を指定します。
- MCS_DAYSTATE 0x0001
- 強調表示が可能
- MCS_MULTISELECT 0x0002
- 複数選択可能
- MCS_NOTODAY 0x0010
- 今日の日付を表示しない
- MCS_NOTODAYCIRCLE 0x0008
- 現在の選択日を丸で囲わない
- MCS_WEEKNUMBERS 0x0004
- 左側に週数を表示
以上の方法で簡単にカレンダーを作成できます。
下の図は、①のコードを実行した画面です。 特別な事はしていませんが各ボタンはしっかり機能しています。 1か月分しか表示されていませんが、カレンダーの大きさを変更することで 最高12か月分を表示できます。 ※変更したサイズにより自動的に再配置、表示されます。 グレー色は先月と来月、黒色は今月の日を表しています。 特定の日付を強調表示も可能ですが、作成したばかりでは 勝手にばらばらに強調されています。 これを自分の好きな日付を強調する方法を試してみます。 | |||||||||||||||||||||||||||||||
#include "llmod.as" //ウィンドウ作成 screen 0,134,143 title "カレンダー" mref bmscr,67 //コントロール使用の為 prm=0 : dllproc "InitCommonControls",prm,0,D_COMCTL //カレンダー作成 prm=0 sdim class,64 : class="SysMonthCal32" getptr prm.1,class prm.2=0,0x50080001,0,0,winx,winy,bmscr.13,0,bmscr.14,0 dllproc "CreateWindowExA",prm,12,D_USER hmc=dllret stop | |||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||
//追加コード //カレンダー情報取得 //2個分×16バイト sdim systemtime,32 prm=hmc,0x1007,1 getptr prm.3,systemtime dllproc "SendMessageA",prm,4,D_USER cmax=dllret //強調表示設定 dim cflag,3 //0に初期化 memset cflag,0,12 cflag.0 += 1<<28 //1月29日を強調表示 | |||||||||||||||||||||||||||||||
ループ内などで、現在選択されている日付を取得してみます。 取得できれば、別のデータと関連させたりでき便利そうです。 SendMessageA (MCM_GETCURSEL 0x1001)を送信 prm.0 カレンダーのハンドル prm.1 0x1001(MCM_GETCURSEL) prm.2 0を指定(使用しません) prm.3 SYSTEMTIME構造体のポインタ 上でも出たSYSTEMTIME構造体を使います。 各情報を取得する例としてwpeek等があります。 SYSTEMTIME構造体は全て2バイトで構成されているので そのほうが便利かもしれません。 | |||||||||||||||||||||||||||||||
SendMessageA (MCM_SETCOLOR 0x100A)を送信 prm.0 カレンダーのハンドル prm.1 0x100A(MCM_SETCOLOR) prm.2 変更する項目を指定
例)red=50、green=100、blue=200の時 prm.3 = red | (green<<8) | (blue<<16) | |||||||||||||||||||||||||||||||
#include "llmod.as" #define ctype RGB(%1,%2,%3) (%1)|(%2<<8)|(%3<<16) |
コメント ( 5 ) | Trackback ( 0 )
dllprocでツールチップ表示
「ツールチップの表示(dllproc使用)」
ボタンなどの上にマウスがある時(1秒後)に文字を表示します。
ボタンの説明文などを表示させることで簡易ヘルプのような
役割をもたせることができます。
ツールチップの表示はボタン以外にも可能だと思います。
※また、「dllproc」を使用せずに表示する方法もあります。
ツールチップ2 参照
◆表示方法
- llmod.asをインクルードする
※「dllproc」を使用する為
- 「InitCommonControls」関数を使用する
コモンコントロールダイナミックリンクライブラリ(DLL)が
ロードされた状態にあることを保証します。
※tooltips_class32を使用する為
- ツールチップオブジェクトを作成する
「CreateWindowExA」関数で
クラス名にtooltips_class32を指定します。
- TOOLINFO構造体を3で作成したツールチップに送信する
例)dllproc "SendMessageA",prm,4,D_USER
prm.0 ツールチップのハンドル
prm.1 TTM_ADDTOOL (0x0404)を指定
prm.2 省略
prm.3 TOOLINFO構造体のポインタ
cbSize | 0(4バイト) | 構造体のサイズ(44)を指定 |
uFlags | 4(4バイト) | フラグを指定 例)TTF_SUBCLASS(0x0010) マウスのメッセージを処理 |
hwnd | 8(4バイト) | ツールチップを表示させたいオブジェクトハンドル |
uId | 12(4バイト) | ウィンドウハンドル(uFlagsでTTF_IDISHWNDフラグを指定した時) |
rect | 16(16バイト) | ツールチップを表示させる範囲を指定します。 ※左上(横、縦)と右下(横、縦)の4つ |
hinst | 32(4バイト) | 表示させる文字のインスタンスハンドル |
lpszText | 36(4バイト) | 表示させる文字のポインタ |
lParam | 40(4バイト) | Ver4.7(32ビット)での定義されている値 |
#include "llmod.as" screen 0,200,100 title "ツールチップサンプル" objmode 2,1:font "",12 objsize 160,20 pos 20,10 : button "マウスを乗せると?",*bt _hspobjhandle stat : hbt=stat //コントロール使用の為の前準備 prm=0 : dllproc "InitCommonControls",prm,0,D_COMCTL //ツールチップオブジェクトの作成 mref bmscr,67 sdim class,17 class="tooltips_class32" prm=0 getptr prm.1,class prm.2=0,1,0,0,0,0,bmscr.13,0 _get_instance prm.10 prm.11=0 dllproc "CreateWindowExA",prm,12,D_USER htool=dllret //ツールチップ情報 sdim data,1024 data="ツールチップサンプルです" dim toolinfo,11 toolinfo.0=44,0x0010,hbt toolinfo.4=0,0,160,20 getptr toolinfo.9,data //ボタン上にツールチップを表示できるようにする prm=htool,0x0404,0 ;,toolinfo getptr prm.3,toolinfo dllproc "SendMessageA",prm,4,D_USER stop *bt dialog "ツールチップサンプル" stop |
コメント ( 0 ) | Trackback ( 0 )
ツールチップで簡易説明
「ツールチップの表示」
ボタンなどの上にマウスがある時(1秒後)に文字を表示します。
ボタンの説明文などを表示させることで簡易ヘルプのような
役割をもたせることができます。
ツールチップの表示はボタン以外にも可能だと思います。
※また、「dllproc」を使用した表示方法もあります。
ツールチップ1 参照
◆表示方法
- 「llmod.as」をインクルードします
※「misc.as」とセットでインクルードする為。
- 「misc.as」をインクルードします
「tooltip」命令を使用する為
※他に「btnimg」「strtoint」命令を使用できます。
- 「tooltip」命令を使用
◆書式
tooltip n1,n2,n3
n1 : button,input,treeboxなどのID
n2 : ツールチップ上に表示する文字列
n3 : ツールチップの背景色 (IE3.0以上)
#include "llmod.as" #include "misc.as" screen 0,200,100 title "ツールチップサンプル" objmode 2,1:font "",12 objsize 160,20 pos 20,10 : button "マウスを乗せると?",*bt //命令文一つでツールチップの表示が可能です tooltip 0,"ツールチップサンプルです" stop *bt dialog "ツールチップサンプル" stop |
コメント ( 0 ) | Trackback ( 0 )