全然更新しないブログ
HSPメモ帳
ガンマ設定
モジュール mod_SetGamma - ディスプレイのガンマを設定
- ディスプレイのガンマ値を設定。画面が暗すぎて(明るすぎて)文字が見えない時等に利用可能。 命令:
- SetGamma gamma
- gamma: double値を指定。0.23から4.4位の値を指定。1.0がデフォルト。
mod_SetGamma.hsp
#ifndef MOD_SETGAMMA_HSP_ #define MOD_SETGAMMA_HSP_ #include "user32.as" #include "gdi32.as" #module mod_SetGamma #deffunc SetGamma double gamma sdim ramp, 2* 256 * 3 repeat 256 d = powf((1.0 + cnt) / 256.0, gamma) * 65535 + 0.5 if ( d < 0.0 ){ d = 0.0 } if ( d > 65535.0 ){ d = 65535.0 } i = int(d) & 0xffff tmp = cnt * 2 wpoke ramp, tmp, i wpoke ramp, tmp + 512, i wpoke ramp, tmp + 1024, i loop GetDC 0 : tmp = stat SetDeviceGammaRamp tmp, varptr(ramp) ReleaseDC 0, tmp return #global #endif // MOD_SETGAMMA_HSP_
サンプル
#include "mod_SetGamma.hsp" screen 0, 300, 200 title "mod_SetGamma 0.3 - 4.4" x = ginfo(12) : y = 20 pos 0, 0 winobj "EDIT", "1.0", 0, 0x50000000, 100, y, 0x8000, 0 hEdit = objinfo(stat, 2) winobj "msctls_updown32", "", 0, 0x5000_0024, 0, 0, 0x8001, 0 hUpDown = objinfo(stat, 2) sendmsg hUpDown, 0x0469, hEdit, 0 sendmsg hUpDown, 0x046f, 0, 41 sendmsg hUpDown, 0x0467, 0, 7 pos x - 200, 0 : objsize 200, y button gosub "変更", *SET_GAMMA font msgothic, 32 buf = "■□表示テスト□■" color 32, 32, 32 : boxf 0, y, x, y + 90 color 48, 48, 48: pos 10, y + 25 : mes buf y += 90 color 255, 255, 255 : boxf 0, y, x, y + 90 color 240, 240, 240: pos 10, y + 25 : mes buf oncmd gosub *WM_NOTIFY, 0x004e stop *SET_GAMMA GetWindowText hEdit, varptr(buf), 64 if ( stat == 0 ){ return } d = double(buf) if ( d < 0.2 || 4.4 < d ){ buf = "err" SetWindowText hEdit, varptr(buf) return } SetGamma d return *WM_NOTIFY if ( wparam == 0x8001 ){ dupptr nmUD, lparam, 24, 4 buf = strf("%.1f", 0.1 * nmUD(3) + 0.3) SetWindowText hEdit, varptr(buf) } return</pre>
コメント ( 0 ) | Trackback ( 0 )
メニュー作成
モジュール mod_MakeMenu - 複数行文字列からメニューを作成
mod_MakeMenu.hsp
#ifndef MOD_MAKEMENU_HSP_ #define global MOD_MAKEMENU_HSP_ #include "user32.as" #module mod_MakeMenu mhMenu, mFlag, mhWnd, mBeginID, mEndID, mLabel #enum MMI_TAB = 0 #enum MMI_POSMENU #enum MMI_POSSTR #enum MMI_PARENT #enum MMI_SUB #enum MMI_MAX #define MMF_MENU 0x0001 #define MMF_SETMENU 0x0002 #define MMF_POPMENU 0x0004 #defcfunc MakeMenuFromStr int hMenu, str strMenu, int beginID if ( hMenu == 0 || strMenu == "" ){ return 0 } buf = strMenu id = beginID split buf, "\n", spBuf len = length(spBuf) dim arItem, MMI_MAX, len repeat len cntTmp = cnt tmp = 0 if ( peek(spBuf(cnt), 0) != '\t' ){ if (peek(spBuf(cnt), 1) == '\t' ){ tmp = 2 arItem(MMI_TAB, cnt) = 1 arItem(MMI_POSSTR, cnt) = 2 } } if ( tmp == 0 ){ arItem(MMI_TAB, cnt) = 0 arItem(MMI_POSSTR, cnt) = 0 } repeat -1, tmp if ( peek(spBuf(cntTmp), cnt) == '\t' ){ arItem(MMI_TAB, cntTmp)++ arItem(MMI_POSSTR, cntTmp)++ } else { break } loop loop dim mi, 12 mi(0) = 48 repeat len cntTmp = cnt arItem(MMI_POSMENU, cnt) = 0 : arItem(MMI_PARENT, cnt) = hMenu if ( cnt ){ tmp = cnt repeat tmp-- if ( arItem(MMI_TAB, tmp) == arItem(MMI_TAB, cntTmp) ){ arItem(MMI_POSMENU, cntTmp)++ } else { if ( arItem(MMI_TAB, tmp) < arItem(MMI_TAB, cntTmp) ){ arItem(MMI_PARENT, cntTmp) = arItem(MMI_SUB, tmp) break } } if ( tmp == 0 ){ break } loop } tmp = 0 if ( cnt + 1 != len ){ if ( arItem(MMI_TAB, cnt) < arItem(MMI_TAB, cnt + 1) ){ tmp = 1 } } if ( tmp ){ mi(1) = 0x16 CreatePopupMenu mi(5) = stat arItem(MMI_SUB, cnt) = mi(5) } else { mi(1) = 0x12 tmp = strlen(spBuf(cnt)) - arItem(MMI_POSSTR, cnt) if ( tmp ){ mi(2) = 0 } else { mi(2) = 0x800 } } mi(4) = id id++ mi(9) = varptr(spBuf(cnt)) + arItem(MMI_POSSTR, cnt) InsertMenuItem arItem(MMI_PARENT, cnt), arItem(MMI_POSMENU, cnt), 1, varptr(mi) loop dim buf, 1 : dim spBuf, 1 : dim arItem, 1 return 1 #defcfunc MakeMenu str strMenu, int beginID CreateMenu menu = stat if ( MakeMenuFromStr(menu, strMenu, beginID) == 0 ){ DestroyMenu menu return 0 } return menu #defcfunc MakePopMenu str strMenu, int beginID CreatePopupMenu menu = stat if ( MakeMenuFromStr(menu, strMenu, beginID) == 0 ){ DestroyMenu menu return 0 } return menu #modcfunc MakeMenu_Make str strMenu, int beginID, int bPop if ( MakeMenu_Del(thismod) == 0 ){ return 0 } if ( bPop ){ mhMenu = MakePopMenu(strMenu, beginID) if ( mhMenu ){ mFlag = MMF_POPMENU } } else { mhMenu = MakeMenu(strMenu, beginID) if ( mhMenu ){ mFlag = MMF_MENU} } if ( mhMenu ){ mBeginID = beginID mEndID = id } return mhMenu #modcfunc MakeMenu_Del if ( mhMenu == 0 ){ return 1 } if ( mFlag & MMF_MENU ){ if ( mFlag & MMF_SETMENU ){ SetMenu mhWnd, 0 mhWnd = 0 } } if ( mhMenu ){ DestroyMenu mhMenu mhMenu = 0 } mFlag = 0 mhWnd = 0 mBeginID = 0 mEndID = 0 mLabel = 0 return stat #modcfunc MakeMenu_Show int bShow if ( (mFlag & MMF_MENU) == 0 ){ return 0 } if ( bShow ){ if ( mhMenu == 0 ){ return 0 } GetMenu hwnd : menu = stat if ( menu == 0 ){ menu = 1 } SetMenu hwnd, mhMenu if ( stat == 0 ){ return 0 } mhWnd = hwnd mFlag = MMF_MENU | MMF_SETMENU } else { if ( mhWnd == 0 ){ return 0 } else { GetMenu mhWnd : menu = stat if ( menu == 0 ){ return 1 } } SetMenu mhWnd, 0 if ( stat == 0 ){ return 0 } mhWnd = 0 mFlag = MMF_MENU } return menu #modcfunc MakeMenu_PopEx int x, int y, int flag if ( mFlag != MMF_POPMENU ){ return 0 } TrackPopupMenu mhMenu, flag, x, y, 0, hWnd, 0 return stat #modcfunc MakeMenu_Pop GetCursorPos varptr(pt) return MakeMenu_PopEx(thismod, pt(0), pt(1), 0) #modcfunc MakeMenu_SetLabel array menuLabel if ( mhMenu == 0 ){ return 0 } if ( vartype(menuLabel) != 1 ){ return 0 } len = mEndID - mBeginID tmp = length(menuLabel) if ( tmp < len ){ return 0 } dimtype mLabel, 1, tmp repeat tmp : mLabel(cnt) = menuLabel(cnt) : loop return 1 #modcfunc MakeMenu_CallLabel int wp if ( vartype(mLabel) != 1 ){ return 0 } tmp = wp >> 16 if ( tmp != 0 ){ return 0 } tmp = wp & 0xffff if ( (mBeginID
関数
関数名 | 説明 |
---|---|
hMenu = MakeMenu(strMenu, beginID) |
|
hMenu = MakePopMenu(strMenu, beginID) |
|
モジュール関数名 | 説明 |
---|---|
モジュール型変数の作成 newmod mod, mod_MakeMenu, strMenu, beginID, bPop |
|
ret = MakeMenu_Make(mod, strMenu, beginID, bPop) |
|
ret = MakeMenu_Del(mod) |
|
ret = MakeMenu_Show(mod, bShow) |
|
ret = MakeMenu_Pop(mod) |
|
ret = MakeMenu_PopEx(mod, x, y, flag) |
|
ret = MakeMenu_SetLabel(mod, menuLabel) |
|
ret = MakeMenu_CallLabel(mod, wp) |
|
hMenu = MakeMenu_GetMenu(mod) |
|
flag = MakeMenu_GetFlag(mod) |
|
id = MakeMenu_GetBeginID(mod) |
|
size = MakeMenu_IDSize(mod) |
|
name = MakeMenu_GetName(mod, nID) |
|
ret = MakeMenu_SetName(mod, nID, str name) |
|
ret = MakeMenu_Checked(mod, nID, int bCheck) |
|
ret = MakeMenu_Disabled(mod, nID, bDisabled) |
|
ret = MakeMenu_SetID(mod, nID, newID) |
|
メニュー作成用文字列
メニュー用文字列は、複数行で構成され、各行はタブ(0以上)と文字列で構成されます。タブはメニューの階層を意味します。 また、行頭に任意の半角文字列1文字とタブ(1以上)の場合、最初の1文字は無視されます。 文字列を省略した場合セパレータが追加されます。
メニュー作成用文字列の例 |
---|
#include "mod_MakeMenu.hsp" strMenu = "ファイル(&F)\n" strMenu += " 開く(&O)\n" strMenu += " \n" strMenu += " 終了(&X)\n" strMenu += "ヘルプ(&H)\n" strMenu += " バージョン情報(&A)" newmod modMenu, mod_MakeMenu, strMenu, 0x8000, 0 ret = MakeMenu_Show(modMenu, 1) stop |
#include "mod_MakeMenu.hsp" strMenu = {"ファイル(&F) | 開く(&O) | | 終了(&X) ヘルプ(&H) | バージョン情報(&A)"} newmod modMenu, mod_MakeMenu, strMenu, 0x8000, 0 ret = MakeMenu_Show(modMenu, 1) stop |
#include "mod_MakeMenu.hsp" strMenu = "ファイル(&F)\n\t開く(&O)\n\t\n\t終了(&X)\nヘルプ(&H)\n\tバージョン情報(&A)" newmod modMenu, mod_MakeMenu, strMenu, 0x8000, 0 ret = MakeMenu_Show(modMenu, 1) stop |
メニューIDについて
メニューIDは、指定したbeginIDから順番に付けられます。
上記の例でいえば、ファイル(0x8000),開く(0x8001), セパレータ(0x8002),終了(0x8003),ヘルプ(0x8004) バージョン情報(0x8005)となります。
上記の例でいえば、ファイル(0x8000),開く(0x8001), セパレータ(0x8002),終了(0x8003),ヘルプ(0x8004) バージョン情報(0x8005)となります。
メニューIDを指定する場合、0x8000から0xbfffを指定すること(0x0000から0x3ffffも可能)。
これはWM_COMMANDで以下の様に処理されている為か、ID & 0x4000のメニューアイテムが選択されるとエラー(#Error 3 in line 5 (???) -->パラメータの値が異常です)が出るので注意。ちなみに、CreateWindow等で作成されたコントロールに付けるIDについても同じです。
#define MESSAGE_HSPOBJ 0x4000 case WM_COMMAND: if ( wParam & MESSAGE_HSPOBJ ) { // HSP内部処理 } return 0;
WM_COMMAND 0x0111
メニューを押されたときの処理は、oncmdでWM_COMMANDを指定したそのジャンプ先で行うことができます。
wparamの上位ワード(wparam >> 16)が0の時がメニューのメッセージです。
wparamの下位ワード(wparam & 0xffff)がメニューIDです。
以下サンプル。
wparamの上位ワード(wparam >> 16)が0の時がメニューのメッセージです。
wparamの下位ワード(wparam & 0xffff)がメニューIDです。
以下サンプル。
#include "mod_MakeMenu.hsp" screen 0, 300, 300 strMenu = {"ファイル(&F) | 開く(&O) | | 終了(&X) ヘルプ(&H) | バージョン情報(&A)"} newmod modMenu, mod_MakeMenu, strMenu, 0x8000, 0 ret = MakeMenu_Show(modMenu, 1) mbBuf = "" mesbox mbBuf, ginfo(12), ginfo(13) oncmd gosub *WM_COMMAND, 0x0111 stop *WM_COMMAND hw = wparam >> 16 lw = wparam & 0xffff if( hw == 0 ){ if ( lw == 0x8001 ){ dialog "txt", 16 if ( stat == 0 ){ return } filename = refstr exist filename sdim mbBuf, strsize bload filename, mbBuf objprm 0, mbBuf return } if ( lw == 0x8003 ){ end } if ( lw == 0x8005 ){ dialog "mod_MakeMenu Ver 1.0" return } } // メニュー以外の処理 return
MakeMenu_SetLabelとMakeMenu_CallLabel
特に便利なことはありませんが、ラベル配列を使うことで記述を少し減らすことができます。以下サンプル。
- 1. 最初に、各メニューIDを実行するラベルと、それを格納するラベル配列を用意します。
- ラベル配列 = ファイル, 開く, セパレータ, 終了, ヘルプ, バージョン情報ファイル、セパレータ、ヘルプは押されてもラベル実行はされませんが、何か適当なラベルを割り当てておきます。ラベル配列のサイズ(length)は、最低でもメニューアイテムの総数以上でなければ、エラーとなります。
- 2. MakeMenu_SetLabelで、上記ラベル配列を指定して呼び出します。
- 3. WM_COMMANDで、MakeMenu_CallLabelを呼び出します。
- 第一引数に、wparamを指定します。メッセージが登録されたIDの場合、該当ラベルを呼び出します。その時の戻り値は1で、呼び出されなければ0です。
#include "mod_MakeMenu.hsp" strMenu = "ファイル(&F)\n\t開く(&O)\n\t\n\t終了(&X)\nヘルプ(&H)\n\tバージョン情報(&A)" newmod modMenu, mod_MakeMenu, strMenu, 0x8000, 0 menuLabel = *CMD_OPEN, *CMD_OPEN, *CMD_OPEN, *CMD_EXIT, *CMD_OPEN, *CMD_ABOUT ret = MakeMenu_SetLabel(modMenu, menuLabel) ret = MakeMenu_Show(modMenu, 1) mbBuf = "" mesbox mbBuf, ginfo(12), ginfo(13) oncmd gosub *WM_COMMAND, 0x0111 stop *CMD_OPEN dialog "txt", 16 if ( stat == 0 ){ return } filename = refstr exist filename sdim mbBuf, strsize bload filename, mbBuf objprm 0, mbBuf return *CMD_EXIT : end *CMD_ABOUT : dialog "mod_MakeMenu Ver 1.0" : return *WM_COMMAND if( MakeMenu_CallLabel(modMenu, wparam) ){ return } // メニュー以外の処理 return
コメント ( 0 ) | Trackback ( 0 )