goo

COMBOBOXの作成

◆一覧リスト
HSP Ver2.61
ブログ関連
その他
★人気blogランキング

「COMBOBOXの作成」
HSP標準命令「combox」でも作成できますが、
スタイルは変更できません。
そこでAPIを使用して作成してみます。

◆作成方法
  1. llmod.asをインクルードする
    ※「dllproc」を使用する為

  2. 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を指定
prm.3の値を変更することで色々なスタイルが選べます。
以下サンプルです。
※見た目判りやすくするためにコンボボックス作成後、
「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 に変更
追加スタイル
CBS_AUTOHSCROLL(0x0040)
文字入力時に自動移動します
このスタイルが指定しない場合リストに表示される文字までしか入力できません。
WS_VSCROLL(0x00200000)
縦スクロールを表示する
WS_HSCROLL(0x00100000)
横スクロールを表示する
これでスクロールバーが表示されます
コンボボックススタイル
prm.3 = 0x50300042 に変更
追加スタイル
CBS_AUTOHSCROLL(0x0040) WS_VSCROLL(0x00200000)
WS_HSCROLL(0x00100000)
CBS_DROPDOWN(0x0002)
文字入力可能なドロップダウンリストを作成
ブラウザのアドレス入力の部分と似ています
コンボボックススタイル
prm.3 = 0x50300043 に変更
追加スタイル
CBS_AUTOHSCROLL(0x0040) WS_VSCROLL(0x00200000)
WS_HSCROLL(0x00100000)
CBS_DROPDOWNLIST(0x0003)
文字入力不可能なドロップダウンリストを作成
HSPのcomboxと似ています
その他のスタイル
CBS_DISABLENOSCROLL(0x0800)
スクロールバーを常に表示します
CBS_HASSTRINGS(0x0200)
CB_GETLBTEXTメッセージを使用可能にします(?)
CBS_LOWERCASE(0x4000)
全て小文字に変換します
CBS_NOINTEGRALHEIGHT(0x0400)
コンボボックスのサイズを自動調整しません。
上のサンプルではつけてませんが、
HSPの場合はこのスタイルをつけておいたほうがいいと思います。
CBS_OEMCONVERT(0x0080)
OEMに変換します
CBS_OWNERDRAWFIXED(0x0010)
同じ高さでオーナードローします
CBS_OWNERDRAWVARIABLE(0x0020)
高さ可変でオーナードローします
CBS_SIMPLE(0x0001)
入力可能で常時リストボックス表示のコンボボックス作成
CBS_SORT(0x0100)
リスト内をソートします
CBS_UPPERCASE(0x2000)
全て大文字に変換します


コメント ( 0 ) | Trackback ( 0 )

カレンダーを作成

◆一覧リスト
HSP Ver2.61
ブログ関連
その他
★人気blogランキング

「カレンダーの作成」


◆作成方法
  1. llmod.asをインクルードする
    ※「dllproc」を使用する為

  2. 「InitCommonControls」関数を使用する
    コモンコントロールダイナミックリンクライブラリ(DLL)が
    ロードされた状態にあることを保証します。
    ※SysMonthCal32を使用する為

  3. カレンダーを作成する
    「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
②強調表示の指定
  1. 現在のカレンダーの表示月数と日付情報を取得
    SendMessageA (MCM_GETMONTHRANGE 0x1007)を送信
    prm.0 カレンダーのハンドル
    prm.1 0x1007(MCM_GETMONTHRANGE)
    prm.2 1を指定。(0は前後月を含まない 1は含む情報を取得)
    prm.3 SYSTEMTIME構造体のポインタ
    「SYSTEMTIME」 構造体 16バイト
    名称
    オフセット
    説明
    wYear 0(2バイト)現在年
    wMonth2(2バイト)現在月
    wDayOfWeek4(2バイト)現在の曜日
    wDay6(2バイト)現在日
    wHour8(2バイト)現在時
    wMinute10(2バイト)現在分
    wSecond12(2バイト)現在秒
    wMilliseconds14(2バイト)現在のミリ秒
    構造体2個分用意します。
    一つ目に最初の日付、2つ目にに最後の日付が取得できます。

    戻り値に現在表示されている月の数が返ります。
    ①の図では1月分表示ですが一部前後月が表示されていますので
    戻り値は3になります(prm.2が1の時)。

  2. 1の情報を元に表示の変更をする
    SendMessageA (MCM_SETDAYSTATE 0x1008)を送信
    prm.0 カレンダーのハンドル
    prm.1 0x1008(MCM_SETDAYSTATE)
    prm.2 現在表示している月の数(1の返り値)
    prm.3 ビットフラグのポインタ
    例)①の場合
    prm.2は2006年1月、2月、3月と3か月分
    表示しているので3を代入します。(1の返り値)
    prm.3は例えば、dim cflag,3(1の返り値)とします。
    cflag.0に1月の情報、cflag.1似2月、cflag.2に3月の
    情報を代入します。ビット単位で0は普通1は強調表示。

    最初に「memset」命令で0で初期化してから必要分を1書込み
    する方法が簡単だと思います(もしくはその逆)。
    例)memset cflag,0,12
    ◆書式
    memset p1,p2,p3,p4
    p1 : 書き込み先の変数
    p2 : クリアする値(1byte)
    p3 : クリアするサイズ(1byte単位)
    p4 : 書き込み先の変数メモリオフセット(省略時=0)

    ◆ビットフラグ入力方法例(※日は0から始まります)
    cfalg.0 += 1<<28 //1月29日を強調表示
    cfalg.1 += 1<<2 //2月3日を強調表示
//追加コード

    //カレンダー情報取得
    //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日を強調表示
cflag.1 += 1<<2 //2月3日を強調表示
prm=hmc,0x1008,cmax getptr prm.3,cflag dllproc "SendMessageA",prm,4,D_USER
③現在の選択日の取得
ループ内などで、現在選択されている日付を取得してみます。
取得できれば、別のデータと関連させたりでき便利そうです。

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 変更する項目を指定
MCSC_BACKGROUND (0x0000)
月と月の間に表示する背景色
MCSC_MONTHBK (0x0004)
月に表示する背景色
MCSC_TEXT (0x0001)
月のテキストを表示する色
MCSC_TITLEBK (0x0002)
カレンダー タイトルの背景色
MCSC_TITLETEXT (0x0003)
カレンダー タイトルのテキストに使用する色
MCSC_TRAILINGTEXT (0x0005)
ヘッダーと補足日付のテキストに使用する色
ヘッダーと補足日付は、
当月のカレンダーに表示される前月と翌月の日付です
prm.3 カラーを指定
例)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)
//ウィンドウ作成 screen 0,dispx,dispy title "カレンダー" font "",12 wx=300:wy=300:width wx,wy //サイズ変更可能 mref bmscr,67 prm = bmscr.13 , -16 dllproc "GetWindowLongA", prm, 2, D_USER prm = bmscr.13 , -16 , dllret | 0x40000 | 0x10000 dllproc "SetWindowLongA", prm, 3, D_USER //コントロール使用の為 prm=0 : dllproc "InitCommonControls",prm,0,D_COMCTL //カレンダー作成 prm=0 sdim class,64 : class="SysMonthCal32" getptr prm.1,class prm.2=0,0x50080001,0,40,winx,winy-40,bmscr.13,0,bmscr.14,0 dllproc "CreateWindowExA",prm,12,D_USER hmc=dllret //色の変更 prm=hmc,0x100A,0,RGB(0,64,128) //背景 青 dllproc "SendMessageA",prm,4,D_USER prm=hmc,0x100A,1,RGB(255,255,255) //テキスト 白 dllproc "SendMessageA",prm,4,D_USER prm=hmc,0x100A,2,RGB(255,255,64) //タイトル背景 黄 dllproc "SendMessageA",prm,4,D_USER prm=hmc,0x100A,3,RGB(255,32,32) //タイトル文字 赤 dllproc "SendMessageA",prm,4,D_USER prm=hmc,0x100A,4,RGB(0,0,0) //月の背景 黒 dllproc "SendMessageA",prm,4,D_USER prm=hmc,0x100A,5,RGB(128,128,128) //前後月文字 灰 dllproc "SendMessageA",prm,4,D_USER dim time1,3 dim time2,16 sdim systemtime,32 sdim systemtime2,32 *main redraw 0 //ウィンドウサイズが変更された時 if (wx!=winx) | (wy!=winy){ prm=hmc,0,40,winx,winy-40 dllproc "MoveWindow",prm,6,D_USER wx=winx : wy=winy } prm=hmc,0x1001,0 getptr prm.3,systemtime dllproc "SendMessageA",prm,4,D_USER wpeek time1.0,systemtime,0 wpeek time1.1,systemtime,2 wpeek time1.2,systemtime,6 //年か月が変更された時 if (ny!=time1.0) | (nm!=time1.1){ //カレンダー情報取得 prm=hmc,0x1007,1 getptr prm.3,systemtime2 dllproc "SendMessageA",prm,4,D_USER cmax=dllret repeat 16 wpeek time2.cnt,systemtime2,cnt*2 loop //強調表示設定 dim cflag,3 memset cflag,0,12 cflag.1 += 1<<0 //最初の1日目だけ強調
prm=hmc,0x1008,cmax getptr prm.3,cflag dllproc "SendMessageA",prm,4,D_USER ny=time1.0 : nm=time1.1 } color 255,255,255:boxf 0,0,winx,40 color pos 5,5 :mes "◆"+time2.0+"/"+time2.1+"/"+time2.3+"~"+time2.8+"/"+time2.9+"/"+time2.11+"表示中" pos 5,25:mes "現在:"+time1.0+"/"+time1.1+"/"+time1.2 redraw 1 wait 10 goto *main

コメント ( 5 ) | Trackback ( 0 )

dllprocでツールチップ表示

◆一覧リスト
HSP Ver2.61
ブログ関連
その他
★人気blogランキング

「ツールチップの表示(dllproc使用)」
ボタンなどの上にマウスがある時(1秒後)に文字を表示します。
ボタンの説明文などを表示させることで簡易ヘルプのような
役割をもたせることができます。
ツールチップの表示はボタン以外にも可能だと思います。

※また、「dllproc」を使用せずに表示する方法もあります。
ツールチップ2 参照

◆表示方法
  1. llmod.asをインクルードする
    ※「dllproc」を使用する為

  2. 「InitCommonControls」関数を使用する
    コモンコントロールダイナミックリンクライブラリ(DLL)が
    ロードされた状態にあることを保証します。
    ※tooltips_class32を使用する為

  3. ツールチップオブジェクトを作成する
    「CreateWindowExA」関数で
    クラス名にtooltips_class32を指定します。

  4. TOOLINFO構造体を3で作成したツールチップに送信する
    例)dllproc "SendMessageA",prm,4,D_USER
    prm.0 ツールチップのハンドル
    prm.1 TTM_ADDTOOL (0x0404)を指定
    prm.2 省略
    prm.3 TOOLINFO構造体のポインタ
「TOOLINFO」構造体 44バイト
名称
オフセット
説明
cbSize0(4バイト)構造体のサイズ(44)を指定
uFlags4(4バイト)フラグを指定
例)TTF_SUBCLASS(0x0010) マウスのメッセージを処理
hwnd8(4バイト)ツールチップを表示させたいオブジェクトハンドル
uId12(4バイト)ウィンドウハンドル(uFlagsでTTF_IDISHWNDフラグを指定した時)
rect16(16バイト)ツールチップを表示させる範囲を指定します。
※左上(横、縦)と右下(横、縦)の4つ
hinst32(4バイト)表示させる文字のインスタンスハンドル
lpszText36(4バイト)表示させる文字のポインタ
lParam40(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 )

ツールチップで簡易説明

◆一覧リスト
HSP Ver2.61
ブログ関連
その他
★人気blogランキング

「ツールチップの表示」
ボタンなどの上にマウスがある時(1秒後)に文字を表示します。
ボタンの説明文などを表示させることで簡易ヘルプのような
役割をもたせることができます。
ツールチップの表示はボタン以外にも可能だと思います。

※また、「dllproc」を使用した表示方法もあります。
ツールチップ1 参照

◆表示方法
  1. 「llmod.as」をインクルードします
    ※「misc.as」とセットでインクルードする為。

  2. 「misc.as」をインクルードします
    「tooltip」命令を使用する為
    ※他に「btnimg」「strtoint」命令を使用できます。

  3. 「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 )