goo

ImageCapture

SetLayeredWindowAttributes
SetLayeredWindowAttributes関数の第2引数に指定するカラーキーが、
青と赤の値が同じ場合と違う場合で挙動が変わる。DWM上での仕様?
青と赤が同じ値
SetLayeredWindowAttributes hWnd, 0x110011, 0, LWA_COLORKEY
色が0x110011の場合、透明化。クリック時、後ろのウィンドウに通知。
色が0x110011以外の場合、不透明化。クリック時、hWndに通知。
青と赤が違う値
SetLayeredWindowAttributes hWnd, 0x110022, 0, LWA_COLORKEY
色が0x110022の場合、透明化。クリック時、hWndに通知。
色が0x220011の場合、不透明化。クリック時、後ろのウィンドウに通知。
色が0x110022、0x220011以外の場合、不透明化。クリック時、hWndに通知。
bgscr + WS_THICKFRAME
bgscrをサイズ変更可能にした時、クライアントエリア上部に空白が表示される。 DWM上での仕様?
改善例は、ImageCapture.hsp内のmod_Bgscr2参照。
#include "user32.as"

	bgscr 0, 300, 200
	SetWindowLong hwnd, -16, 0x90040000
	color : boxf : color 255, 255, 255
	mes "左クリック:移動 右クリック:終了"
	oncmd gosub *WM_LBUTTONDONW, 0x0201
	oncmd *WM_RBUTTONUP, 0x205
	stop

*WM_LBUTTONDONW
	sendmsg hwnd, 0xa1, 2, 0
	return

*WM_RBUTTONUP
	end
ImageCapture.hsp
概要
画面上の任意のサイズイメージをコピー、保存(JPG固定)。
操作
左クリック 左クリックドラッグでウィンドウ移動。
右クリック ポップアップメニュー表示
左ダブルクリック イメージのコピーと表示の切り替え。
ホイール イメージを拡大・縮小。
ホイールクリック 前面表示切り替え。
ポップアップメニュー
コピー ウィンドウ内に表示されているイメージをコピー。
表示 コピーを破棄して、ウィンドウ内を透過。
新規 新しいウィンドウを作成。
保存 イメージの保存。
通常サイズ 拡大率を100%に戻す。
前面表示 常に前面に表示する。
閉じる ウィンドウを閉じる。最後のウィンドウの場合、終了。
終了 アプリケーションの終了。
その他
WIC、Direct2Dを使用。
screen, bgscr命令直後のシステム変数hwndが、別のウィンドウハンドルに変わっている事がある。 とりあえず、gselで対応。
/* ---------------------------------------------------------
	#include
   --------------------------------------------------------- */
#include "user32.as"
#include "kernel32.as"
#include "gdi32.as"

/* ---------------------------------------------------------
	#uselib
   --------------------------------------------------------- */
#uselib "dwmapi.dll"
#func global DwmExtendFrameIntoClientArea "DwmExtendFrameIntoClientArea" int,var

#uselib "d2d1.dll"
#func global D2D1CreateFactory "D2D1CreateFactory" int,var,int,var

/* ---------------------------------------------------------
	#usecom
   --------------------------------------------------------- */
#define global IID_IWICImagingFactory  "{ec5ec8a9-c395-4314-9c77-54d7a935ff70}"
#define global CLSID_WICImagingFactory "{cacaf262-9370-4615-a13b-9f5539da4c0a}"
#usecom global IWICImagingFactory IID_IWICImagingFactory CLSID_WICImagingFactory
#comfunc global IWICImagingFactory_CreateEncoder            8 var,int,var
#comfunc global IWICImagingFactory_CreateFormatConverter   10 var
#comfunc global IWICImagingFactory_CreateStream            14 var
#comfunc global IWICImagingFactory_CreateBitmapFromHBITMAP 21 int,int,int,var

#define global IID_IWICBitmap "{00000121-a8f2-4877-ba0a-fd2b6645fb94}"
#usecom global IWICBitmap IID_IWICBitmap "{}"

#define global IID_IWICFormatConverter "{00000301-a8f2-4877-ba0a-fd2b6645fb94}"
#usecom global IWICFormatConverter IID_IWICFormatConverter "{}"
#comfunc global IWICFormatConverter_GetSize    3 var,var
#comfunc global IWICFormatConverter_Initialize 8 int,var,int,int,double,int

#define global IID_IWICStream "{135FF860-22B7-4ddf-B0F6-218F4F299A43}"
#usecom global IWICStream IID_IWICStream "{}"
#comfunc global IWICStream_InitializeFromFilename  15 wstr,int

#define global IID_IWICBitmapEncoder "{00000103-a8f2-4877-ba0a-fd2b6645fb94}"
#usecom global IWICBitmapEncoder IID_IWICBitmapEncoder "{}"
#comfunc global IWICBitmapEncoder_Initialize              3 int,int
#comfunc global IWICBitmapEncoder_CreateNewFrame         10 var,var
#comfunc global IWICBitmapEncoder_Commit                 11
#comfunc global IWICBitmapEncoder_GetMetadataQueryWriter 12 var

#define global IID_IWICBitmapFrameEncode "{00000105-a8f2-4877-ba0a-fd2b6645fb94}"
#usecom global IWICBitmapFrameEncode IID_IWICBitmapFrameEncode "{}"
#comfunc global IWICBitmapFrameEncode_Initialize              3 int
#comfunc global IWICBitmapFrameEncode_WriteSource            11 int,var
#comfunc global IWICBitmapFrameEncode_Commit                 12
#comfunc global IWICBitmapFrameEncode_GetMetadataQueryWriter 13 var

#define global IID_IWICMetadataQueryWriter "{A721791A-0DEF-4d06-BD91-2118BF1DB10B}"
#usecom global IWICMetadataQueryWriter IID_IWICMetadataQueryWriter "{}"
#comfunc global IWICMetadataQueryWriter_SetMetadataByName    7 wstr,var

#define global IID_IPropertyBag2 "{22F55882-280B-11d0-A8A9-00A0C90C2004}"
#usecom global IPropertyBag2 IID_IPropertyBag2 "{}"
#comfunc global IPropertyBag2_Read  3 int,var,int,var,var
#comfunc global IPropertyBag2_Write 4 int,var,var

#ifndef IID_ID2D1Factory
#define global IID_ID2D1Factory "{06152247-6F50-465A-9245-118BFD3B6007}"
#usecom global ID2D1Factory IID_ID2D1Factory "{}"
#comfunc global ID2D1Factory_CreateDCRenderTarget 16 var,var

#ifndef IID_ID2D1DCRenderTarget
#define global IID_ID2D1DCRenderTarget "{1c51bc64-de61-46fd-9899-63a5d8f03950}"
#usecom global ID2D1DCRenderTarget IID_ID2D1DCRenderTarget "{}"
#comfunc global ID2D1DCRenderTarget_CreateBitmapFromWicBitmap 5 int,int,var
#comfunc global ID2D1DCRenderTarget_DrawBitmap 26 int,int,int,int,int
#comfunc global ID2D1DCRenderTarget_Clear      47 var
#comfunc global ID2D1DCRenderTarget_BeginDraw  48
#comfunc global ID2D1DCRenderTarget_EndDraw    49 int,int
#comfunc global ID2D1DCRenderTarget_BindDC     57 int,var

#ifndef ID2D1Bitmap
#define global IID_ID2D1Bitmap "{a2296057-ea42-4099-983b-539fb6505426}"
#usecom global ID2D1Bitmap IID_ID2D1Bitmap "{}"

/* ---------------------------------------------------------
	mod_Bgscr2
   --------------------------------------------------------- */
#module mod_Bgscr2

#deffunc Bgscr2Ex int id, int w2, int h2, int mode, int x, int y, int w, int h
	if ( nHit == 0 ){
		dim pt, 2 : dim rc, 4 : dim nHit, 3, 3
		nHit(0, 0) = 13, 12, 14
		nHit(0, 1) = 10, 1, 11
		nHit(0, 2) = 16, 15, 17
		dim rcFrm, 4
		AdjustWindowRectEx varptr(rcFrm), 0x94040000, 0, 0
		rcFrm(0) *= -1 : rcFrm(1) *= -1
	}
	bgscr id, w2, h2, mode, x, y, w, h
	gsel id, 0 : hWndTmp = hwnd
	SetWindowLong hWndTmp, -16, 0x94040000
	oncmd gosub *OnNCCalcSize, 0x0083
	oncmd gosub *OnNCHitTest, 0x0084
	oncmd gosub *OnNCActivate, 0x0086
	SetWindowPos hWndTmp, 0, 0, 0, 0, 0, 0x23
	return hWndTmp

#deffunc Bgscr2 int id, int w, int h, int mode
	Bgscr2Ex id, ginfo_dispx, ginfo_dispy, mode, -1, -1, w, h
	return stat

*OnNCCalcSize
	return 0

*OnNCHitTest
	gsel ginfo(24), 0
	pt = lparam & 0xffff, lparam >> 16
	ScreenToClient hwnd, varptr(pt)
	GetClientRect hwnd, varptr(rc)
	x = 1 : y = 1
	if ( pt(0) < rcFrm(0) ){ x = 0 }
	if ( pt(0) > (rc(2) - rcFrm(2)) ){ x = 2 }
	if ( pt(1) < rcFrm(1) ){ y = 0 }
	if ( pt(1) > (rc(3) - rcFrm(3)) ){ y = 2 }
	return nHit(x, y)

*OnNCActivate
	return 1

#global

/* ---------------------------------------------------------
	mod_d2f
   --------------------------------------------------------- */
#module mod_d2f
#defcfunc d2f double d
	if( dtof == 0 ){
		d_ = 0.0 : f_ = 0
		dim prm, 2 : dim dtof,4
		dtof(0) = 0x0424448b, 0x4c8b00dd, 0x19d90824, 0x000000c3
		VirtualProtect varptr(dtof), 16, 0x40, varptr(r)
		prm = varptr(d_), varptr(f_)
	}
	d_ = d
	r = callfunc(prm, varptr(dtof), 2)
	return f_
#global

/* ---------------------------------------------------------
	mod_ImgCap
   --------------------------------------------------------- */
#module mod_ImgCap mhWnd, mbTop, mWicFC, mImgX, mImgY

#define IMGCAP_BORDERX     2
#define IMGCAP_BORDERY     2
#define IMGCAP_TITLE      10
#define IMGCAP_BORDRCOLOR 16, 32, 64
#define IMGCAP_CRKEY      2, 1, 1
#define IMGCAP_CRKEY2     0x010102

#deffunc ImgCapInit
	if ( vartype(arImgCap) != 5 ){
		dimtype arImgCap, 5, 1
		bBgsrc0 = 0
		wndNum = 0
		dim prm, 16
	}
	if ( vartype(cWicFactory) != 6 ){
		newcom cWicFactory, IWICImagingFactory
	}
	if ( d2dFactory == 0 ){
		prm(1) = 0x6152247, 0x465a6f50, 0x8b114592, 0x7603bfd
		dstFmt24bgr = 0x6fddc324, 0x4bfe4e03, 0x773d85b1, 0xec98d76
		D2D1CreateFactory 0, prm(1), 0, prm
		if ( stat == 0 ){
			newcom cD2dFactory, ID2D1Factory, -1, prm
			prm(1) = 0, 87, 3, 0, 0, 2, 0
			ID2D1Factory_CreateDCRenderTarget cD2dFactory, prm(1), prm
			if ( stat == 0 ){
				newcom cDCRender, ID2D1DCRenderTarget, -1, prm
			}
		}
	}
	if ( hMenuPop == 0 ){
		CreatePopupMenu : hMenuPop = stat
		prm = 48, 0x42
		strMenu = "コピー(&C)", "新規(&N)", "保存(&S)", "通常サイズ(&D)", "前面表示(&T)", "閉じる(&Q)", "終了(&X)"
		repeat length(strMenu)
			prm(4) = 0x8000 + cnt : prm(9) = varptr(strMenu(cnt))
			InsertMenuItem hMenuPop, cnt, 1, varptr(prm)
		loop
	}
	if ( hToolTip == 0 ){
		CreateWindowEx 8, "tooltips_class32", "", 0x90000000, 0, 0, 0, 0, 0, 0, hinstance, 0
		hToolTip = stat
	}
	return

#deffunc ImgCapTerm int p
	prm = 0
	foreach arImgCap
		if ( varptr(arImgCap(cnt)) == p ){
			delmod arImgCap(cnt) : prm = 1
		}
	loop
	return prm

#deffunc ImgCapExit onexit
	if ( vartype(arImgCap) == 5 ){
		foreach arImgCap
			delcom arImgCap(cnt)
		loop
	}
	if ( vartype(cWicFactory) == 6 ){ delcom cWicFactory }
	if ( vartype(cD2dFactory) == 6 ){ delcom cD2dFactory }
	if ( vartype(cDCRender) == 6 ){ delcom cDCRender }
	if ( hMenuPop ){ DestroyMenu hMenuPop }
	if ( hToolTip ){ DestroyWindow hToolTip }
	return

#defcfunc ImgCapCreate int x, int y, int w, int h
	ImgCapInit
	newmod arImgCap, mod_ImgCap
	dupptr dp, stat, 16, 5
	return ImgCap_Create(dp, x, y, w, h)

#defcfunc ImgCapExitFlag int flag
	if ( flag == 0 ){ exitFlag = 0 }
	else {
		if ( flag > 0 ){ exitFlag = 1 }
	}
	return exitFlag

#defcfunc ImgCapGetDp int id, var dpImgCap
	gsel id, 0
	GetProp hwnd, "ImgCapMod"
	if ( stat == 0 ){ return 0 }
	dupptr dpImgCap, stat, 16, 5
	return 1

#modinit
	mhWnd = 0 : mbTop = 0 : mWicFC = 0 : mImgX = 0 : mImgY = 0
	return varptr(thismod)

#modterm
	if ( mWicFC ){ prm = ImgCap_ImgDel(thismod, mWicFC) }
	if ( hToolTip ){
		prm = 48, 0x11, mhWnd, mhWnd
		sendmsg hToolTip, 0x405, 0, varptr(prm)
	}
	RemoveProp mhWnd, "ImgCapMod"
	return

#modcfunc ImgCap_SetLayered int flag
	GetWindowRect mhWnd, varptr(prm)
	prm(2) -= prm(0) : prm(3) -= prm(1)
	GetWindowLong mhWnd, -20
	if ( flag == 0 ){
		SetWindowLong mhWnd, -20, stat ^ 0x80000
		RedrawWindow mhWnd, 0, 0, 0x485
		prm(0) += IMGCAP_BORDERX
		prm(1) += IMGCAP_BORDERY + IMGCAP_TITLE
		prm(2) -= (IMGCAP_BORDERX * 2)
		prm(3) -= (IMGCAP_BORDERY * 2 + IMGCAP_TITLE)
	}
	else {
		SetWindowLong mhWnd, -20, stat | 0x80000
		SetLayeredWindowAttributes mhWnd, IMGCAP_CRKEY2, 0, 1
		prm(0) -= IMGCAP_BORDERX
		prm(1) -= (IMGCAP_BORDERY + IMGCAP_TITLE)
		prm(2) += (IMGCAP_BORDERX * 2)
		prm(3) += (IMGCAP_BORDERY * 2 + IMGCAP_TITLE)
	}
	SetWindowPos mhWnd, 0, prm(0), prm(1), prm(2), prm(3), 0x20
	return stat

#modcfunc ImgCap_Create int x, int y, int w, int h
	idTmp = ginfo(25)
	gsel 0, 0
	if ( exitFlag == 0 && bBgsrc0 == 0 ){
		GetProp hwnd, "ImgCapMod"
		if ( stat == 0 ){ idTmp = 0 : bBgsrc0 = 1 }
	}
	Bgscr2Ex idTmp, ginfo_dispx, ginfo_dispy, 0, x, y, w, h
	mhWnd = stat
	prm = 1, 1, 1, 1
	DwmExtendFrameIntoClientArea mhWnd, prm
	GetClassLong mhWnd, -26
	SetClassLong mhWnd, -26, stat | 8
	SetProp mhWnd, "ImgCapMod", varptr(thismod)
	if ( stat == 0 ){
		gsel idTmp, -1 : return 0
	}
	buf = "test"
	prm = 48, 0x11, mhWnd, mhWnd
	prm(8) = hinstance, 0
	sendmsg hToolTip, 0x404, 0, varptr(prm)
	wndNum++
	oncmd gosub *WM_SIZE, 0x0005
	oncmd gosub *WM_CLOSE, 0x0010
	oncmd gosub *WM_COMMAND, 0x0111
	oncmd gosub *WM_LBUTTONDOWN, 0x0201
	oncmd gosub *WM_LBUTTONDBLCLK, 0x0203
	oncmd gosub *WM_RBUTTONDOWN, 0x0204
	oncmd gosub *WM_MBUTTONDOWN, 0x0207
	oncmd gosub *WM_MOUSEWHEEL, 0x020A
	if ( ImgCap_SetLayered(thismod, 1) == 0 ){ return 0 }
	return 1

#modcfunc ImgCap_Close
	ImgCapTerm varptr(thismod)
	if ( wndNum ){ wndNum-- }
	if ( wndNum == 0 ){
		if ( exitFlag == 0 ){ return 1 }
	}
	return 0

#modcfunc ImgCap_ImgCreate
	prm(10) = 0
	GetClientRect mhWnd, varptr(prm)
	ClientToScreen mhWnd, varptr(prm)
	prm(4) = IMGCAP_BORDERX * 2
	prm(5) = IMGCAP_BORDERY + IMGCAP_TITLE
	prm(6) = prm(5) + IMGCAP_BORDERY
	if ( prm(2) <= prm(4) || prm(3) <= prm(6) ){ return 0 }
	prm(0) = prm(0) + IMGCAP_BORDERX
	prm(1) = prm(1) + prm(5)
	prm(2) = prm(2) - prm(4)
	prm(3) = prm(3) - prm(6)
	GetDesktopWindow : prm(4) = stat
	GetDC prm(4) : prm(5) = stat
	CreateCompatibleDC prm(5) : prm(6) = stat
	CreateCompatibleBitmap prm(5), prm(2), prm(3) : prm(7) = stat
	SelectObject prm(6), prm(7) : prm(8) = stat
	BitBlt prm(6), 0, 0, prm(2), prm(3), prm(5), prm(0), prm(1), 0xcc0020
	ReleaseDC prm(4), prm(5)
	SelectObject prm(6), prm(8)
	DeleteDC prm(6)
	IWICImagingFactory_CreateBitmapFromHBITMAP cWicFactory, prm(7), 0, 2, prm(9)
	if ( stat == 0 ){
		newcom comTmp, IWICBitmap, -1, prm(9)
		IWICImagingFactory_CreateFormatConverter cWicFactory, prm(10)
		if ( stat == 0 ){
			newcom comTmp2, IWICFormatConverter, -2, prm(10)
			IWICFormatConverter_Initialize comTmp2, prm(9), dstFmt24bgr, 1, 0, 0.0, 0
			if ( stat ){ prm = ImgCap_ImgDel(thismod, prm(10)) }
			delcom comTmp2
		}
		delcom comTmp
	}
	DeleteObject prm(7)
	return prm(10)

#modcfunc ImgCap_ImgDel int img
	if ( img == 0 ){ return 0 }
	newcom comTmp, IWICFormatConverter, -1, img
	delcom comTmp
	return 1

#modcfunc ImgCap_ImgGetSize int img, var x, var y
	newcom comTmp, IWICFormatConverter, -2, img
	IWICFormatConverter_GetSize comTmp, x, y
	prm = stat
	delcom comTmp
	if ( prm ){ return 0 }
	return 1

#modcfunc ImgCap_CopyView
	if ( mWicFC ){
		if ( ImgCap_ImgDel(thismod, mWicFC) == 0 ){ return 0 }
		mWicFC = 0
		if ( ImgCap_SetLayered(thismod, 1) == 0 ){ return 0 }
	}
	else {
		prm(11) = ImgCap_ImgCreate(thismod)
		if ( prm == 0 ){ return 0 }
		if ( ImgCap_ImgGetSize(thismod, prm(11), prm(12), prm(13)) == 0 ){
			prm = ImgCap_ImgDel(thismod, prm(11))
			return 0
		}
		mWicFC = prm(11) : mImgX = prm(12) : mImgY = prm(13)
		if ( ImgCap_SetLayered(thismod, 0) == 0 ){ return 0 }
	}
	return 1

#modcfunc ImgCap_Size
	redraw 0
	GetClientRect mhWnd, varptr(prm)
	GetWindowLong mhWnd, -21
	gsel stat, 0
	if ( mWicFC ){
		ID2D1DCRenderTarget_BindDC cDCRender, hdc, prm
		ID2D1DCRenderTarget_BeginDraw cDCRender
		prm(4) = 0, 0, 0, 0x3f800000
		ID2D1DCRenderTarget_Clear cDCRender, prm(4)
		if ( (prm(2) * prm(3) * mImgX * mImgY) != 0 ){
			ID2D1DCRenderTarget_CreateBitmapFromWicBitmap cDCRender, mWicFC, 0, prm(4)
			if ( stat == 0 ){
				newcom comTmp, ID2D1Bitmap, -2, prm(4)
				d1 = 1.0 * prm(2) / mImgX
				d2 = 1.0 * prm(3) / mImgY
				if ( d1 > d2 ){
					prm(1) = 0
					prm(5) = int(1.0 * prm(3) * mImgX / mImgY)
					prm(0) = (prm(2) - prm(5)) / 2
					prm(2) = prm(0) + prm(5)
				}
				else {
					prm(0) = 0
					prm(5) = int(1.0 * prm(2) * mImgY / mImgX)
					prm(1) = (prm(3) - prm(5)) / 2
					prm(3) = prm(1) + prm(5)
				}
				prm(5) = d2f(prm(0)), d2f(prm(1)), d2f(prm(2)), d2f(prm(3))
				ID2D1DCRenderTarget_DrawBitmap cDCRender, prm(4), varptr(prm(5)), 0x3f800000, 1, 0
				delcom comTmp
			}
		}
		ID2D1DCRenderTarget_EndDraw cDCRender, 0, 0
		prm(2) -= prm(0) : prm(3) -= prm(1)
		d1 = 1.0 * prm(2) / mImgX * 100
		buf = strf("%3d%% %5d x %5d (%5d x %5d)", int(d1), prm(2), prm(3), mImgX, mImgY)
	}
	else {
		color IMGCAP_BORDRCOLOR : boxf
		color IMGCAP_CRKEY
		prm(0) = IMGCAP_BORDERX
		prm(1) = IMGCAP_BORDERY + IMGCAP_TITLE
		prm(4) = prm(2) - (IMGCAP_BORDERX * 2)
		prm(5) = prm(3) - prm(1) - IMGCAP_BORDERY
		prm(2) = prm(0) + prm(4) - 1
		prm(3) = prm(1) + prm(5) - 1
		boxf prm(0), prm(1), prm(2), prm(3)
		buf = strf("%5d x %5d", prm(4), prm(5))
	}
	redraw 1
	prm = 48, 0x11, mhWnd, mhWnd
	prm(8) = hinstance, varptr(buf)
	sendmsg hToolTip, 0x40c, 0, varptr(prm)
	return 1

#modcfunc ImgCap_SetDefSize
	if ( mWicFC == 0 ){ return 0 }
	SetWindowPos mhWnd, 0, 0, 0, mImgX, mImgY, 0x2
	return 1

#modcfunc ImgCap_TopWnd
	mbTop ^= 1
	if ( mbTop ){ prm = -1 }
	else { prm = -2 }
	SetWindowPos mhWnd, prm, 0, 0, 0, 0, 0x23
	return stat

#modcfunc ImgCap_MouseWheel int w, int l
	GetClientRect mhWnd, varptr(prm)
	ClientToScreen mhWnd, varptr(prm)
	prm(4) = w >> 16
	if ( mWicFC == 0 ){
		prm(5) = int(0.1 * prm(2)), int(0.1 * prm(3))
		if ( prm(4) < 0 ){ prm(2) -= prm(5) : prm(3) -= prm(6) }
		else { prm(2) += prm(5) : prm(3) += prm(6) }
	}
	else {
		d1 = 1.0 * prm(2) / mImgX + 0.09
		d2 = 1.0 * prm(3) / mImgY + 0.09
		if ( d1 > d2 ){ prm(5) = int(d2 * 10) }
		else { prm(5) = int(d1 * 10) }
		if ( prm(4) < 0 ){ prm(5)-- }
		else { prm(5)++ }
		if ( prm(5) <= 0 ){ prm(5) = 1 }
		if ( prm(5) > 300 ){ prm(5) = 300 }
		d1 = 10.0 * prm(5) / 100.0
		prm(2) = int(d1 * mImgX)
		prm(3) = int(d1 * mImgY)
	}
	prm(0) += prm(2) / 2 : prm(1) += prm(3) / 2
	SetCursorPos prm(0), prm(1)
	SetWindowPos mhWnd, 0, 0, 0, prm(2), prm(3), 0x2
	return 1

#modcfunc ImgCap_Save
	wicTmp = mWicFC
	if ( wicTmp == 0 ){ wicTmp = ImgCap_ImgCreate(thismod) }
	if ( wicTmp == 0 ){ return 0 }
	dialog "jpg", 17
	if ( stat == 0 ){ return 0 }
	fileName = refstr
	prm(5) = 0
	prm(12) = 0x19e4a5aa, 0x4fc55662, 0x5817c0a0, 0x57108e02
	IWICImagingFactory_CreateEncoder cWicFactory, prm(12), 0, prm(0)
	if ( stat == 0 ){
		IWICImagingFactory_CreateStream cWicFactory, prm(1)
		if ( stat == 0 ){
			newcom comTmp, IWICBitmapEncoder, -1, prm(0)
			newcom comTmp2, IWICStream, -1, prm(1)
			IWICStream_InitializeFromFilename comTmp2, fileName, 0x40000000
			if ( stat == 0 ){
				IWICBitmapEncoder_Initialize comTmp, prm(1), 2
				if ( stat == 0 ){
					IWICBitmapEncoder_CreateNewFrame comTmp, prm(2), prm(3)
					if ( stat == 0 ){
						newcom comTmp3, IWICBitmapFrameEncode, -1, prm(2)
						newcom comTmp4, IPropertyBag2, -1, prm(3)
						IWICBitmapFrameEncode_Initialize comTmp3, prm(3)
						if ( stat == 0 ){
							newcom comTmp5, IWICFormatConverter, -2, wicTmp
							IWICFormatConverter_GetSize comTmp5, prm(2), prm(3)
							if ( stat == 0 ){
								prm = 0, 0
								IWICBitmapFrameEncode_WriteSource comTmp3, wicTmp, prm
								if ( stat == 0 ){
									IWICBitmapFrameEncode_Commit comTmp3
									if ( stat == 0 ){
										IWICBitmapEncoder_Commit comTmp
										if ( stat == 0 ){ prm(5) = 1 }
									}
								}
							}
							delcom comTmp5
						}
						delcom comTmp3 : delcom comTmp4
					}
				}
			}
			delcom comTmp : delcom comTmp2
		}
	}
	if ( wicTmp != mWicFC ){ prm = ImgCap_ImgDel(thismod, wicTmp) }
	return prm(5)

#modcfunc ImgCap_SetPopMenuItem
	if ( hMenuPop == 0 ){ return 0 }
	prm = 48
	prm(1) = 0x40 : prm(9) = varptr(strMenu(0))
	if ( mWicFC ){ strMenu(0) = "表示(&V)" }
	else { strMenu(0) = "コピー(&C)" }
	SetMenuItemInfo hMenuPop, 0, 1, varptr(prm)
	prm(1) = 1 : prm(3) = 0
	if ( mWicFC ){
		GetClientRect mhWnd, varptr(prm(12))
		if ( prm(14) == mImgX && prm(15) == mImgY ){ prm(3) = 8 }
	}
	SetMenuItemInfo hMenuPop, 3, 1, varptr(prm)
	if ( mbTop ){ prm(3) = 8 } else { prm(3) = 0 }
	SetMenuItemInfo hMenuPop, 4, 1, varptr(prm)
	return 1

*WM_SIZE
	if ( ImgCapGetDp(ginfo(24), dp ) == 0 ){ return }
	prm = ImgCap_Size(dp)
	return

*WM_CLOSE
	idTmp = ginfo(24)
	gsel idTmp, -1
	if ( ImgCapGetDp(idTmp, dp ) == 0 ){ return }
	if ( ImgCap_Close(dp) ){ return }
	return 0

*WM_COMMAND
	idTmp = ginfo(24)
	gsel idTmp, 0
	lw = wparam & 0xffff
	if ( lw == 0x8001 ){
		GetWindowRect hwnd, varptr(prm)
		prm(2) -= prm(0) : prm(3) -= prm(1)
		prm(0) += 20 : prm(1) += 20
		prm = ImgCapCreate(prm(0), prm(1), prm(2), prm(3))
		return
	}
	if ( lw == 0x8005 ){ sendmsg hwnd, 0x10, 0, 0 : return }
	if ( lw == 0x8006 ){ end : end }
	if ( ImgCapGetDp(idTmp, dp ) == 0 ){ return }
	if ( lw == 0x8000 ){ prm = ImgCap_CopyView(dp) : return }
	if ( lw == 0x8002 ){ prm = ImgCap_Save(dp) : return }
	if ( lw == 0x8003 ){ prm = ImgCap_SetDefSize(dp) : return }
	if ( lw == 0x8004 ){ prm = ImgCap_TopWnd(dp) : return }
	return

*WM_LBUTTONDOWN
	gsel ginfo(24), 0
	sendmsg hwnd, 0xa1, 2, 0
	return

*WM_LBUTTONDBLCLK
	if ( ImgCapGetDp(ginfo(24), dp ) == 0 ){ return }
	prm = ImgCap_CopyView(dp)
	return

*WM_RBUTTONDOWN
	if ( ImgCapGetDp(ginfo(24), dp ) == 0 ){ return }
	prm = ImgCap_SetPopMenuItem(dp)
	GetCursorPos varptr(prm)
	TrackPopupMenu hMenuPop, 0, prm(0), prm(1), 0, hwnd, 0
	return

*WM_MBUTTONDOWN
	if ( ImgCapGetDp(ginfo(24), dp ) == 0 ){ return }
	prm = ImgCap_TopWnd(dp)
	return

*WM_MOUSEWHEEL
	if ( ImgCapGetDp(ginfo(24), dp ) == 0 ){ return }
	prm = ImgCap_MouseWheel(dp, wparam, lparam)
	return

#global

/* ---------------------------------------------------------
	Main
   --------------------------------------------------------- */
	if ( ImgCapCreate(100, 100, 300, 200) == 0 ){
		dialog "err" : end
	}
	stop
コメント ( 0 ) | Trackback ( 0 )

DirectWrite 2

サンプル
#include "mod_DWMes.hsp"
	font "メイリオ", 40
	mes "0123456789 mes"
	DWMesFont "メイリオ", 40
	DWMes "0123456789 DWMes"
	stop
#include "mod_DWMes.hsp"
	DWMesClear 200, 200, 200
	DWMesFont msgothic, 32
	DWMesColor 0, 0, 0
	repeat 6
		tmp = cnt * 20
		DWMesOpacity tmp
		DWMes strf("DWMesOpacity %d", tmp)
	loop
	stop
#include "mod_DWMes.hsp"
	screen 0, 300, 300
	onexit *ONEXIT_
	txtNum = 50
	sdim txt, txtNum, 64
	dim txtColor, txtNum
	dim txtPos, txtNum, 4
	w = ginfo_winx : h = ginfo_winy
	repeat txtNum
		txt(cnt) = strf("%c%c%c", rnd(26)+65, rnd(26)+65,rnd(26)+65)
		txtColor(cnt) = rnd(255) | rnd(255) << 8 | rnd(255) << 16
		txtPos(cnt, 0) = rnd(w)
		txtPos(cnt, 1) = rnd(h)
		txtPos(cnt, 2) = rnd(500)
		txtPos(cnt, 3) = rnd(2)
	loop

	DWMes2Make dw, hdc, msmincho, 32, 800, 0, 0, 0
	repeat
		DWMes2Begin dw, 0, 0, w, h
		DWMes2Clear dw, 30, 30, 30
		repeat txtNum
			d = 1.0 * txtPos(cnt, 2) / 100.0
			DWMesScale d, d, w / 2, h / 2
			DWMes2Color dw, txtColor(cnt) & 0xff, (txtColor(cnt) >> 8) & 0xff, (txtColor(cnt) >> 16) & 0xff
			DWMes2 dw, txt(cnt), txtPos(cnt, 0), txtPos(cnt, 1), w, h
			if ( txtPos(cnt, 3) ){
				txtPos(cnt, 2) += 3 : if ( txtPos(cnt, 2) > 500 ){ txtPos(cnt, 3) = 0 }
			}
			else {
				txtPos(cnt, 2) -= 5 : if ( txtPos(cnt, 2) < 0 ){ txtPos(cnt, 3) = 1 }
			}
		loop
		DWMes2End
		redraw 1
		await 20
	loop
	stop

*ONEXIT_
	DWMes2Free dw
	end
#include "mod_DWMes.hsp"
	s = {"Hello World !!
		DirectWrite
		mod_DWMes.hsp"}

	screen 0, 300, 300
	DWMesFont "メイリオ", 30, 800
	DWMesColor 255, 255, 255
	repeat
		redraw 0
		color : boxf
		pos 50, 50
		DWMesSkew cnt, cnt, 150, 150
		DWMes s
		redraw 1
		await 20
	loop
	stop
#include "mod_DWMes.hsp"
	s  = "2.プログラミングガイド¥n¥n2.1.スクリプトの形式¥n"
	s += " HSPはプログラム(命令と実行の順序を記したもの)によって動作します。"
	s += "そのもとになるのがスクリプト(ソースファイル)です。"
	s += "これはテキストファイルの形式で、拡張子は .hsp または、.as になります。"
	s += "(拡張子 .hsp は、HSP3.0から追加されたものです。)"
	s += "スクリプトはHSPに付属しているHSPスクリプトエディタ(HSED3.EXE)や、"
	s += "テキストエディタなどのアプリケーションで作成することができます。"

	screen 0, 300, 300
	DWMesFont "メイリオ", 14
	DWMesVertical
	DWMes s
	stop
#include "mod_DWMes.hsp"
	screen 0, 200, 100
	DWMesFont msgothic, 32
	DWMesSetTrimming 1, 1
	x = 0
	repeat
		redraw 0
		color 255, 255, 255 : boxf
		pos x, 30
		DWMes "あいうえお"
		redraw 1
		await 20
		x++
		if ( x > ginfo_winx ){ x = -200 }
	loop
	stop
簡易説明
DWMesは、現在選択されているウィンドウのカレントポジションのX、Yに文字を描画します。 DWMesFontでフォントの変更、DWMesColorで文字色の変更、DWMesOpacityで文字の透明度の設定、DWMesWordWrappingで自動改行の設定、 DWMesTabStopでタブストップの設定。

DWMes2は、任意のデバイスコンテキスト(hdc)の任意の範囲内に文字を描画します。 DWMes2から始まる命令を使用します。
状況にもよりますが、DWMesより高速です。
    使用例
  1. DWMes2Makeで描画用変数を初期化する
  2. DWMes2Beginで描画開始
  3. DWMes2で文字表示
  4. DWMes2Endで描画終了
  5. DWMes2Freeで描画用変数を解放する
mesの表示時間を1とした時、DWMesは40、DWMes2は2。
DWMesが遅いのは、ID2D1DCRenderTarget::BeginDrawとID2D1DCRenderTarget::EndDrawを毎回呼び出ししている事が原因です。

DWMesは、mes同様、カレントポジションのY座標(ginfo_cy)を移動します。 しかし、Transform関連の命令後は正確に反映されないことがあります。
コメント ( 0 ) | Trackback ( 0 )

DirectWrite

モジュール mod_DWMes - DirectWriteによる文字表示
mod_DWMes.hsp
#ifndef MOD_DWMES_HSP_
#define MOD_DWMES_HSP_

#include "user32.as"
#include "gdi32.as"
#include "kernel32.as"

#uselib "d2d1.dll"
#func global D2D1CreateFactory      "D2D1CreateFactory"      int,var,int,var
#func global D2D1InvertMatrix       "D2D1InvertMatrix"       var
#func global D2D1IsMatrixInvertible "D2D1IsMatrixInvertible" var
#func global D2D1MakeRotateMatrix   "D2D1MakeRotateMatrix"   int,int,int,var
#func global D2D1MakeSkewMatrix     "D2D1MakeSkewMatrix"     int,int,int,int,var

#uselib "dwrite.dll"
#func global DWriteCreateFactory "DWriteCreateFactory" int,var,var

#ifndef IID_ID2D1Factory
#define global IID_ID2D1Factory "{06152247-6F50-465A-9245-118BFD3B6007}"
#usecom global ID2D1Factory IID_ID2D1Factory "{}"
#comfunc global ID2D1Factory_ReloadSystemMetrics             3
#comfunc global ID2D1Factory_GetDesktopDpi                   4 var,var
#comfunc global ID2D1Factory_CreateRectangleGeometry         5 var,var
#comfunc global ID2D1Factory_CreateRoundedRectangleGeometry  6 var,var
#comfunc global ID2D1Factory_CreateEllipseGeometry           7 var,var
#comfunc global ID2D1Factory_CreateGeometryGroup             8 int,var,int,var
#comfunc global ID2D1Factory_CreateTransformedGeometry       9 int,var,var
#comfunc global ID2D1Factory_CreatePathGeometry             10 var
#comfunc global ID2D1Factory_CreateStrokeStyle              11 var,var,int,var
#comfunc global ID2D1Factory_CreateDrawingStateBlock        12 int,int,var
#comfunc global ID2D1Factory_CreateWicBitmapRenderTarget    13 int,var,var
#comfunc global ID2D1Factory_CreateHwndRenderTarget         14 var,var,var
#comfunc global ID2D1Factory_CreateDxgiSurfaceRenderTarget  15 int,var,var
#comfunc global ID2D1Factory_CreateDCRenderTarget           16 var,var
#endif // IID_ID2D1Factory

#ifndef IID_ID2D1DCRenderTarget
#define global IID_ID2D1DCRenderTarget "{1c51bc64-de61-46fd-9899-63a5d8f03950}"
#usecom global ID2D1DCRenderTarget IID_ID2D1DCRenderTarget "{}"
#comfunc global ID2D1DCRenderTarget_GetFactory                    3 var
#comfunc global ID2D1DCRenderTarget_CreateBitmap                  4 int,int,int,int,int,var
#comfunc global ID2D1DCRenderTarget_CreateBitmapFromWicBitmap     5 int,int,var
#comfunc global ID2D1DCRenderTarget_CreateSharedBitmap            6 var,var,int,var
#comfunc global ID2D1DCRenderTarget_CreateBitmapBrush             7 int,int,int,var
#comfunc global ID2D1DCRenderTarget_CreateSolidColorBrush         8 var,int,var
#comfunc global ID2D1DCRenderTarget_CreateGradientStopCollection  9 var,int,int,int,var
#comfunc global ID2D1DCRenderTarget_CreateLinearGradientBrush    10 int,int,int,var
#comfunc global ID2D1DCRenderTarget_CreateRadialGradientBrush    11 int,int,int,var
#comfunc global ID2D1DCRenderTarget_CreateCompatibleRenderTarget 12 int,int,int,int,int,int,var
#comfunc global ID2D1DCRenderTarget_CreateLayer                  13 int,int,var
#comfunc global ID2D1DCRenderTarget_CreateMesh                   14 var
#comfunc global ID2D1DCRenderTarget_DrawLine                     15 int,int,int,int,int,int,int
#comfunc global ID2D1DCRenderTarget_DrawRectangle                16 var,int,int,int
#comfunc global ID2D1DCRenderTarget_FillRectangle                17 var,var
#comfunc global ID2D1DCRenderTarget_DrawRoundedRectangle         18 var,int,int,int
#comfunc global ID2D1DCRenderTarget_FillRoundedRectangle         19 int,int
#comfunc global ID2D1DCRenderTarget_DrawEllipse                  20 int,int,int,int,int,int,int
#comfunc global ID2D1DCRenderTarget_FillEllipse                  21 var,int
#comfunc global ID2D1DCRenderTarget_DrawGeometry                 22 int,int,int,int
#comfunc global ID2D1DCRenderTarget_FillGeometry                 23 int,int,int
#comfunc global ID2D1DCRenderTarget_FillMesh                     24 int,int
#comfunc global ID2D1DCRenderTarget_FillOpacityMask              25 int,int,int,int,int
#comfunc global ID2D1DCRenderTarget_DrawBitmap                   26 int,int,int,int,int
#comfunc global ID2D1DCRenderTarget_DrawText                     27 wstr,int,int,var,int,int,int
#comfunc global ID2D1DCRenderTarget_DrawTextLayout               28 int,int,int,int,int
#comfunc global ID2D1DCRenderTarget_DrawGlyphRun                 29 int,int,int,int,int
#comfunc global ID2D1DCRenderTarget_SetTransform                 30 var
#comfunc global ID2D1DCRenderTarget_GetTransform                 31 var
#comfunc global ID2D1DCRenderTarget_SetAntialiasMode             32 int
#comfunc global ID2D1DCRenderTarget_GetAntialiasMode             33
#comfunc global ID2D1DCRenderTarget_SetTextAntialiasMode         34 int
#comfunc global ID2D1DCRenderTarget_GetTextAntialiasMode         35
#comfunc global ID2D1DCRenderTarget_SetTextRenderingParams       36 int
#comfunc global ID2D1DCRenderTarget_GetTextRenderingParams       37 var
#comfunc global ID2D1DCRenderTarget_SetTags                      38 int,int,int,int
#comfunc global ID2D1DCRenderTarget_GetTags                      39 int,int
#comfunc global ID2D1DCRenderTarget_PushLayer                    40 var,int
#comfunc global ID2D1DCRenderTarget_PopLayer                     41
#comfunc global ID2D1DCRenderTarget_Flush                        42 int,int
#comfunc global ID2D1DCRenderTarget_SaveDrawingState             43 int
#comfunc global ID2D1DCRenderTarget_RestoreDrawingState          44 int
#comfunc global ID2D1DCRenderTarget_PushAxisAlignedClip          45 var,int
#comfunc global ID2D1DCRenderTarget_PopAxisAlignedClip           46
#comfunc global ID2D1DCRenderTarget_Clear                        47 var
#comfunc global ID2D1DCRenderTarget_BeginDraw                    48
#comfunc global ID2D1DCRenderTarget_EndDraw                      49 int,int
#comfunc global ID2D1DCRenderTarget_GetPixelFormat               50
#comfunc global ID2D1DCRenderTarget_SetDpi                       51 int,int
#comfunc global ID2D1DCRenderTarget_GetDpi                       52 var,var
#comfunc global ID2D1DCRenderTarget_GetSize                      53 var
#comfunc global ID2D1DCRenderTarget_GetPixelSize                 54 var
#comfunc global ID2D1DCRenderTarget_GetMaximumBitmapSize         55
#comfunc global ID2D1DCRenderTarget_IsSupported                  56 var
#comfunc global ID2D1DCRenderTarget_BindDC                       57 int,var
#endif // IID_ID2D1DCRenderTarget

#ifndef IID_ID2D1SolidColorBrush
#define global IID_ID2D1SolidColorBrush "{2CD906A9-12E2-11DC-9FED-001143A055F9}"
#usecom global ID2D1SolidColorBrush IID_ID2D1SolidColorBrush "{}"
#comfunc global ID2D1SolidColorBrush_GetFactory    3 var
#comfunc global ID2D1SolidColorBrush_SetOpacity    4 int
#comfunc global ID2D1SolidColorBrush_SetTransform  5 var
#comfunc global ID2D1SolidColorBrush_GetOpacity    6
#comfunc global ID2D1SolidColorBrush_GetTransform  7 var
#comfunc global ID2D1SolidColorBrush_SetColor      8 var
#comfunc global ID2D1SolidColorBrush_GetColor      9 var
#endif // IID_ID2D1SolidColorBrush

#ifndef IID_IDWriteFactory
#define global IID_IDWriteFactory "{B859EE5A-D838-4B5B-A2E8-1ADC7D93DB48}"
#usecom global IDWriteFactory IID_IDWriteFactory "{}"
#comfunc global IDWriteFactory_GetSystemFontCollection         3 var,int
#comfunc global IDWriteFactory_CreateCustomFontCollection      4 int,var,int,var
#comfunc global IDWriteFactory_RegisterFontCollectionLoader    5 int
#comfunc global IDWriteFactory_UnregisterFontCollectionLoader  6 int
#comfunc global IDWriteFactory_CreateFontFileReference         7 wstr,int,var
#comfunc global IDWriteFactory_CreateCustomFontFileReference   8 int,int,int,var
#comfunc global IDWriteFactory_CreateFontFace                  9 int,int,int,int,int,var
#comfunc global IDWriteFactory_CreateRenderingParams          10 var
#comfunc global IDWriteFactory_CreateMonitorRenderingParams   11 int,var
#comfunc global IDWriteFactory_CreateCustomRenderingParams    12 int,int,int,int,int,var
#comfunc global IDWriteFactory_RegisterFontFileLoader         13 int
#comfunc global IDWriteFactory_UnregisterFontFileLoader       14 int
#comfunc global IDWriteFactory_CreateTextFormat               15 wstr,int,int,int,int,int,wstr,var
#comfunc global IDWriteFactory_CreateTypography               16 var
#comfunc global IDWriteFactory_GetGdiInterop                  17 var
#comfunc global IDWriteFactory_CreateTextLayout               18 wstr,int,int,int,int,var
#comfunc global IDWriteFactory_CreateGdiCompatibleTextLayout  19 wstr,int,int,int,int,int,int,int,var
#comfunc global IDWriteFactory_CreateEllipsisTrimmingSign     20 int,var
#comfunc global IDWriteFactory_CreateTextAnalyzer             21 var
#comfunc global IDWriteFactory_CreateNumberSubstitution       22 int,wstr,int,var
#comfunc global IDWriteFactory_CreateGlyphRunAnalysis         23 int,int,int,int,int,int,int,var
#endif // IID_IDWriteFactory

#ifndef IID_IDWriteTextFormat
#define global IID_IDWriteTextFormat "{9c906818-31d7-4fd3-a151-7c5e225db55a}"
#usecom global IDWriteTextFormat IID_IDWriteTextFormat "{}"
#comfunc global IDWriteTextFormat_SetTextAlignment         3 int
#comfunc global IDWriteTextFormat_SetParagraphAlignment    4 int
#comfunc global IDWriteTextFormat_SetWordWrapping          5 int
#comfunc global IDWriteTextFormat_SetReadingDirection      6 int
#comfunc global IDWriteTextFormat_SetFlowDirection         7 int
#comfunc global IDWriteTextFormat_SetIncrementalTabStop    8 int
#comfunc global IDWriteTextFormat_SetTrimming              9 var,int
#comfunc global IDWriteTextFormat_SetLineSpacing          10 int,int,int
#comfunc global IDWriteTextFormat_GetTextAlignment        11
#comfunc global IDWriteTextFormat_GetParagraphAlignment   12
#comfunc global IDWriteTextFormat_GetWordWrapping         13
#comfunc global IDWriteTextFormat_GetReadingDirection     14
#comfunc global IDWriteTextFormat_GetFlowDirection        15
#comfunc global IDWriteTextFormat_GetIncrementalTabStop   16
#comfunc global IDWriteTextFormat_GetTrimming             17 var,var
#comfunc global IDWriteTextFormat_GetLineSpacing          18 var,var,var
#comfunc global IDWriteTextFormat_GetFontCollection       19 var
#comfunc global IDWriteTextFormat_GetFontFamilyNameLength 20
#comfunc global IDWriteTextFormat_GetFontFamilyName       21 var,int
#comfunc global IDWriteTextFormat_GetFontWeight           22
#comfunc global IDWriteTextFormat_GetFontStyle            23
#comfunc global IDWriteTextFormat_GetFontStretch          24
#comfunc global IDWriteTextFormat_GetFontSize             25
#comfunc global IDWriteTextFormat_GetLocaleNameLength     26
#comfunc global IDWriteTextFormat_GetLocaleName           27 var,int
#endif // IID_IDWriteTextFormat

#ifndef IID_IDWriteTextLayout // inherits from IDWriteTextFormat
#define global IID_IDWriteTextLayout "{53737037-6d14-410b-9bfe-0b182bb70961}"
#usecom global IDWriteTextLayout IID_IDWriteTextLayout "{}"
#comfunc global IDWriteTextLayout_SetMaxWidth             28 int
#comfunc global IDWriteTextLayout_SetMaxHeight            29 int
#comfunc global IDWriteTextLayout_SetFontCollection       30 int,int,int
#comfunc global IDWriteTextLayout_SetFontFamilyName       31 wstr,int,int
#comfunc global IDWriteTextLayout_SetFontWeight           32 int,int,int
#comfunc global IDWriteTextLayout_SetFontStyle            33 int,int,int
#comfunc global IDWriteTextLayout_SetFontStretch          34 int,int,int
#comfunc global IDWriteTextLayout_SetFontSize             35 int,int,int
#comfunc global IDWriteTextLayout_SetUnderline            36 int,int,int
#comfunc global IDWriteTextLayout_SetStrikethrough        37 int,int,int
#comfunc global IDWriteTextLayout_SetDrawingEffect        38 int,int,int
#comfunc global IDWriteTextLayout_SetInlineObject         39 int,int,int
#comfunc global IDWriteTextLayout_SetTypography           40 int,int,int
#comfunc global IDWriteTextLayout_SetLocaleName           41 wstr,int,int
#comfunc global IDWriteTextLayout_GetMaxWidth             42
#comfunc global IDWriteTextLayout_GetMaxHeight            43
#comfunc global IDWriteTextLayout_GetFontCollection       44 int,var,int
#comfunc global IDWriteTextLayout_GetFontFamilyNameLength 45 int,var,int
#comfunc global IDWriteTextLayout_GetFontFamilyName       46 int,var,int,int
#comfunc global IDWriteTextLayout_GetFontWeight           47 int,var,int
#comfunc global IDWriteTextLayout_GetFontStyle            48 int,var,int
#comfunc global IDWriteTextLayout_GetFontStretch          49 int,var,int
#comfunc global IDWriteTextLayout_GetFontSize             50 int,var,int
#comfunc global IDWriteTextLayout_GetUnderline            51 int,var,int
#comfunc global IDWriteTextLayout_GetStrikethrough        52 int,var,int
#comfunc global IDWriteTextLayout_GetDrawingEffect        53 int,var,int
#comfunc global IDWriteTextLayout_GetInlineObject         54 int,var,int
#comfunc global IDWriteTextLayout_GetTypography           55 int,var,int
#comfunc global IDWriteTextLayout_GetLocaleNameLength     56 int,var,int
#comfunc global IDWriteTextLayout_GetLocaleName           57 int,var,int,int
#comfunc global IDWriteTextLayout_Draw                    58 int,int,int,int
#comfunc global IDWriteTextLayout_GetLineMetrics          59 int,int,var
#comfunc global IDWriteTextLayout_GetMetrics              60 var
#comfunc global IDWriteTextLayout_GetOverhangMetrics      61 var
#comfunc global IDWriteTextLayout_GetClusterMetrics       62 var,int,var
#comfunc global IDWriteTextLayout_DetermineMinWidth       63 var
#comfunc global IDWriteTextLayout_HitTestPoint            64 int,int,var,var,var
#comfunc global IDWriteTextLayout_HitTestTextPosition     65 int,int,var,var,var
#comfunc global IDWriteTextLayout_HitTestTextRange        66 int,int,int,int,var,int,var
#endif // IID_IDWriteTextLayout

#ifndef IDWriteInlineObject
#define global IID_IDWriteInlineObject "{8339FDE3-106F-47ab-8373-1C6295EB10B3}"
#usecom global IDWriteInlineObject IID_IDWriteInlineObject "{}"
#comfunc global IDWriteInlineObject_Draw                3 int,int,int,int,int,int,int
#comfunc global IDWriteInlineObject_GetMetrics          4 var
#comfunc global IDWriteInlineObject_GetOverhangMetrics  5 var
#comfunc global IDWriteInlineObject_GetBreakConditions  6 var,var
#endif // IDWriteInlineObject

#ifndef d2f
#module mod_d2f
#defcfunc d2f double d
	if( dtof == 0 ){
		d_ = 0.0 : f_ = 0
		dim prm, 2 : dim dtof,4
		dtof(0) = 0x0424448b, 0x4c8b00dd, 0x19d90824, 0x000000c3
		VirtualProtect varptr(dtof), 16, 0x40, varptr(r)
		prm = varptr(d_), varptr(f_)
	}
	d_ = d
	r = callfunc(prm, varptr(dtof), 2)
	return f_
#global
#endif // d2f

#ifndef f2d
#module mod_f2d
#defcfunc f2d int f
	if( ftod == 0 ){
		d_ = 0.0 : f_ = 0
		dim prm, 2 : dim ftod,4
		ftod(0) = 0x0424448b, 0x4c8b00d9, 0x19dd0824, 0x000000c3
		VirtualProtect varptr(ftod), 16, 0x40, varptr(r)
		prm = varptr(f_), varptr(d_)
	}
	f_ = f
	r = callfunc(prm, varptr(ftod), 2)
	return d_
#global
#endif // f2d

#ifndef GetF2D
#module mod_GetF2D
#defcfunc GetF2D
	if( getFtoD == 0 ){
		prm = 0 : dim getFtoD, 3
		getFtoD(0) = 0x241cd951, 0x5924048b, 0x000000c3
		VirtualProtect varptr(getFtoD), 12, 0x40, varptr(r)
	}
	r = callfunc(prm, varptr(getFtoD), 0)
	return f2d(r)
#global
#endif // GetF2D

#module mod_DWMes

#deffunc DWMes_Init
	mref bmscr, 67
	dim IID_ID2D1Factory_, 4
	dim IID_IDWriteFactory_, 4
	IID_ID2D1Factory_(0) = 0x6152247, 0x465a6f50, 0x8b114592, 0x7603bfd
	D2D1CreateFactory 0, IID_ID2D1Factory_, 0, pv
	if ( stat ){ return }
	newcom factory, ID2D1Factory, -1, pv
	IID_IDWriteFactory_(0) = 0xb859ee5a, 0x4b5bd838, 0xdc1ae8a2, 0x48db937d
	DWriteCreateFactory 0, IID_IDWriteFactory_, pv
	if ( stat ){ delcom factory : return }
	newcom dwFactory, IID_IDWriteFactory, -1, pv
	dim prm, 15 : prm(1) = 87, 3
	ID2D1Factory_CreateDCRenderTarget factory, prm, pv
	if ( stat ){ delcom factory : delcom dwFactory : return }
	newcom dcRT, ID2D1DCRenderTarget, -1, pv
	dim curDWInfo, 3
	mref bmscr, 67
	GetObjectA bmscr(38), 60, varptr(prm)
	dupptr dp, varptr(prm) + 28, 32, 2
	if ( prm < 0 ){ prm *= -1 }
	DWMes2Make curDWInfo, hdc, dp, prm, 400, ginfo_r, ginfo_g, ginfo_b
	return

#deffunc DWMes str s
	GetClientRect hwnd, varptr(prm)
	ID2D1DCRenderTarget_BindDC dcRT, hdc, prm
	MultiByteToWideChar 0, 0, s, -1, 0, 0
	if ( stat == 0 ){ return }
	prm(4) = stat - 1, d2f(ginfo_cx), d2f(ginfo_cy), d2f(prm(2)), d2f(prm(3))
	ID2D1DCRenderTarget_BeginDraw dcRT
	ID2D1DCRenderTarget_DrawText dcRT, s, prm(4), curDWInfo(1), prm(5), curDWInfo(2), 0, 0
	ID2D1DCRenderTarget_EndDraw dcRT, 0, 0
	IDWriteFactory_CreateTextLayout dwFactory, s, prm(4), curDWInfo(1), prm(7), prm(8), pv
	newcom objTmp, IDWriteTextLayout, -1, pv
	IDWriteTextLayout_GetMetrics objTmp, prm
	bmscr(28) += f2d(prm(4))
	objTmp = 0
	if ( wpeek(bmscr, 78) ){ redraw 1 }
	return

#deffunc DWMesFont str fontName, int size, int weight
	DWMes2Font curDWInfo, fontName, size, weight
	return

#deffunc DWMesColor int r, int g, int b
	DWMes2Color curDWInfo, r, g, b
	return

#deffunc DWMesGetSize str s, int w, int h, array rc
	DWMes2GetSize curDWInfo, s, w, h, rc
	return

#deffunc DWMesOpacity int opacity
	DWMes2Opacity curDWInfo, opacity
	return

#defcfunc DWMesGetTextAlignment
	return DWMes2GetTextAlignment(curDWInfo)

#deffunc DWMesSetTextAlignment int b
	DWMes2SetTextAlignment curDWInfo, b
	return

#defcfunc DWMesGetParagraphAlignment
	return DWMes2GetParagraphAlignment(curDWInfo)

#deffunc DWMesSetParagraphAlignment int b
	DWMes2SetParagraphAlignment curDWInfo, b
	return

#defcfunc DWMesGetWordWrapping
	return DWMes2GetWordWrapping(curDWInfo)

#deffunc DWMesSetWordWrapping int b
	DWMes2SetWordWrapping curDWInfo, b
	return

#defcfunc DWMesGetReadingDirection
	return DWMes2GetReadingDirection(curDWInfo)

#deffunc DWMesSetReadingDirection int b
	DWMes2SetReadingDirection curDWInfo, b
	return

#defcfunc DWMesGetFlowDirection
	return DWMes2GetFlowDirection(curDWInfo)

#deffunc DWMesSetFlowDirection int b
	DWMes2SetFlowDirection curDWInfo, b
	return

#defcfunc DWMesGetTabStop
	return DWMes2GetTabStop(curDWInfo)

#deffunc DWMesSetTabStop int size
	DWMes2SetTabStop curDWInfo, d2f(size)
	return

#defcfunc DWMesGetTrimmingOption
	return DWMes2GetTrimmingOption(curDWInfo)

#defcfunc DWMesGetTrimmingObj
	return DWMes2GetTrimmingObj(curDWInfo)

#deffunc DWMesSetTrimming int option, int bObj
	DWMes2SetTrimming curDWInfo, option, bObj
	return

#defcfunc DWMesGetLineSpacingMethod
	return DWMes2GetLineSpacingMethod(curDWInfo)

#defcfunc DWMesGetLineSpacingHeight
	return DWMes2GetLineSpacingHeight(curDWInfo)

#defcfunc DWMesGetLineSpacingBase
	return DWMes2GetLineSpacingBase(curDWInfo)

#deffunc DWMesSetLineSpacing int method, double h, double base
	DWMes2SetLineSpacing curDWInfo, method, h, base
	return

#deffunc DWMesClear int r, int g, int b
	GetClientRect hwnd, varptr(prm)
	ID2D1DCRenderTarget_BindDC dcRT, hdc, prm
	ID2D1DCRenderTarget_BeginDraw dcRT
	prm = d2f(1.0 * r / 255), d2f(1.0 * g / 255), d2f(1.0 * b / 255), d2f(1.0)
	ID2D1DCRenderTarget_Clear dcRT, prm
	ID2D1DCRenderTarget_EndDraw dcRT, 0, 0
	mref bmscr, 67
	if ( wpeek(bmscr, 78) ){ redraw 1 }
	return

#deffunc DWMesTransform array p
	ID2D1DCRenderTarget_SetTransform dcRT, p
	return

#deffunc DWMesScale double sx, double sy, double x, double y
	prm = d2f(sx), 0, 0, d2f(sy), d2f(x - x * sx), d2f(y - y * sy)
	ID2D1DCRenderTarget_SetTransform dcRT, prm
	return

#deffunc DWMesRotate double r, double x, double y
	D2D1MakeRotateMatrix d2f(r), d2f(x), d2f(y), prm
	ID2D1DCRenderTarget_SetTransform dcRT, prm
	return

#deffunc DWMesSkew double rx, double ry, double x, double y
	D2D1MakeSkewMatrix d2f(rx), d2f(ry), d2f(x), d2f(y), prm
	ID2D1DCRenderTarget_SetTransform dcRT, prm
	return

#deffunc DWMesHorizen
	DWMes2Horizen curDWInfo
	return

#deffunc DWMesVertical
	DWMes2Vertical curDWInfo
	return

#deffunc DWMes2Begin array dwInfo, int x, int y, int w, int h
	prm = x, y, w, h
	ID2D1DCRenderTarget_BindDC dcRT, dwInfo(0), prm
	ID2D1DCRenderTarget_BeginDraw dcRT
	return

#deffunc DWMes2End
	ID2D1DCRenderTarget_EndDraw dcRT, 0, 0
	return

#deffunc DWMes2 array dwInfo, str s, int x, int y, int w, int h
	prm = d2f(x), d2f(y), d2f(w), d2f(h)
	MultiByteToWideChar 0, 0, s, -1, 0, 0
	ID2D1DCRenderTarget_DrawText dcRT, s, stat - 1, dwInfo(1), prm, dwInfo(2), 0, 0
	return

#deffunc DWMes2Make array dwInfo, int hdc_, str fontName, int size, int weight, int r, int g, int b
	dim dwInfo, 3
	dwInfo = hdc_
	DWMes2Font dwInfo, fontName, size, weight
	DWMes2Color dwInfo, r, g, b
	return

#deffunc DWMes2Free array dwInfo
	newcom objTmp, IDWriteTextFormat, -1, dwInfo(1) : delcom objTmp
	newcom objTmp, ID2D1SolidColorBrush, -1, dwInfo(2) : delcom objTmp
	repeat 3 : dwInfo(cnt) = 0 : loop
	objTmp = 0
	return

#deffunc DWMes2Font array dwInfo, str fontName, int size, int weight
	if ( dwInfo(1) ){
		if ( dwInfo(1) == curDWInfo(1) ){
			delcom curTextFormat
		}
		else {
			newcom objTmp, IDWriteTextFormat, -1, dwInfo(1)
			delcom objTmp
		}
		dwInfo(1) = 0
	}
	prm = weight, size
	if ( prm == 0 ){ prm = 400 }
	if ( size < 0 ){ prm(1) *= -1 }
	IDWriteFactory_CreateTextFormat dwFactory, fontName, 0, prm, 0, 5, d2f(prm(1)), "", dwInfo(1)
	if ( stat ){ return }
	if ( dwInfo(1) == curDWInfo(1) ){
		newcom curTextFormat, IDWriteTextFormat, -1, dwInfo(1)
		DWMesSetWordWrapping 1
	}
	else {
		DWMes2SetWordWrapping dwInfo, 1
	}
	return

#deffunc DWMes2Color array dwInfo, int r, int g, int b
	prm = d2f(1.0 * r / 255), d2f(1.0 * g / 255), d2f(1.0 * b / 255), d2f(1.0)
	if ( dwInfo(2) == 0 ){
		ID2D1DCRenderTarget_CreateSolidColorBrush dcRT, prm, 0, dwInfo(2)
		if ( dwInfo(2) == curDWInfo(2) ){
			newcom curBrush, ID2D1SolidColorBrush, -1, dwInfo(2)
		}
	}
	else {
		if ( dwInfo(2) == curDWInfo(2) ){
			ID2D1SolidColorBrush_SetColor curBrush, prm
		}
		else {
			newcom objTmp, ID2D1SolidColorBrush, -2, dwInfo(2)
			ID2D1SolidColorBrush_SetColor objTmp, prm
		}
	}
	return

#deffunc DWMes2GetSize array dwInfo, str s, int w, int h, array rc
	MultiByteToWideChar 0, 0, s, -1, 0, 0
	if ( stat == 0 ){ return }
	IDWriteFactory_CreateTextLayout dwFactory, s, stat - 1, dwInfo(1), d2f(w), d2f(h), pv
	newcom objTmp, IDWriteTextLayout, -1, pv
	IDWriteTextLayout_GetMetrics objTmp, prm
	dim rc, 4
	rc = int(f2d(prm(0))), int(f2d(prm(1))), int(f2d(prm(2))), int(f2d(prm(4)))
	rc(2) += rc(0) : rc(3) += rc(1)
	objTmp = 0
	return

#deffunc DWMes2Opacity array dwInfo, int opacity
	newcom objTmp, ID2D1SolidColorBrush, -2, dwInfo(2)
	ID2D1SolidColorBrush_SetOpacity objTmp, d2f(1.0 * opacity / 100)
	return

#defcfunc DWMes2GetTextAlignment array dwInfo
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_GetTextAlignment objTmp
	return stat

#deffunc DWMes2SetTextAlignment array dwInfo, int b
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_SetTextAlignment objTmp, b
	return

#defcfunc DWMes2GetParagraphAlignment array dwInfo
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_GetParagraphAlignment objTmp
	return stat

#deffunc DWMes2SetParagraphAlignment array dwInfo, int b
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_SetParagraphAlignment objTmp, b
	return

#defcfunc DWMes2GetWordWrapping array dwInfo
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_GetWordWrapping objTmp
	return stat

#deffunc DWMes2SetWordWrapping array dwInfo, int b
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_SetWordWrapping objTmp, b
	return

#defcfunc DWMes2GetReadingDirection array dwInfo
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_SetReadingDirection objTmp
	return stat

#deffunc DWMes2SetReadingDirection array dwInfo, int b
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_SetReadingDirection objTmp, b
	return

#defcfunc DWMes2GetFlowDirection array dwInfo
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_GetFlowDirection objTmp
	return stat

#deffunc DWMes2SetFlowDirection array dwInfo, int b
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_SetFlowDirection objTmp, b
	return

#defcfunc DWMes2GetTabStop array dwInfo
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_GetIncrementalTabStop objTmp
	return GetF2D()

#deffunc DWMes2SetTabStop  array dwInfo, int size
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_SetIncrementalTabStop objTmp, d2f(size)
	return

#defcfunc DWMes2GetTrimmingOption array dwInfo
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_GetTrimming objTmp, prm, 0
	return prm

#defcfunc DWMes2GetTrimmingObj array dwInfo
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_GetTrimming objTmp, prm, prm(1)
	return prm(1)

#deffunc DWMes2SetTrimming array dwInfo, int option, int bObj
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	if ( bObj == 0 ){
		pv = 0
	}
	else {
		IDWriteFactory_CreateEllipsisTrimmingSign dwFactory, curDWInfo(1), pv
		newcom objTmp2, IDWriteInlineObject, -1, pv
	}
	prm = option
	IDWriteTextFormat_SetTrimming objTmp, prm, pv
	if ( bObj ){ delcom objTmp2 }
	objTmp = 0
	return

#defcfunc DWMes2GetLineSpacingMethod array dwInfo
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_GetLineSpacing objTmp, prm(0), prm(1), prm(2)
	return prm

#defcfunc DWMes2GetLineSpacingHeight array dwInfo
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_GetLineSpacing objTmp, prm(0), prm(1), prm(2)
	return f2d(prm(1))

#defcfunc DWMes2GetLineSpacingBase array dwInfo
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_GetLineSpacing objTmp, prm(0), prm(1), prm(2)
	return f2d(prm(2))

#deffunc DWMes2SetLineSpacing array dwInfo, int method, double h, double base
	newcom objTmp, IDWriteTextFormat, -2, dwInfo(1)
	IDWriteTextFormat_SetLineSpacing objTmp, method, d2f(h), d2f(base)
	return

#deffunc DWMes2Clear array dwInfo, int r, int g, int b
	prm = d2f(1.0 * r / 255), d2f(1.0 * g / 255), d2f(1.0 * b / 255), d2f(1.0)
	ID2D1DCRenderTarget_Clear dcRT, prm
	return

#deffunc DWMes2Horizen array dwInfo
	DWMes2SetTextAlignment dwInfo, 0
	DWMes2SetParagraphAlignment dwInfo, 0
	DWMes2SetReadingDirection dwInfo, 0
	DWMes2SetFlowDirection dwInfo, 0
	DWMes2SetWordWrapping dwInfo, 0
	return

#deffunc DWMes2Vertical array dwInfo
	DWMes2SetTextAlignment dwInfo, 0
	DWMes2SetParagraphAlignment dwInfo, 0
	DWMes2SetReadingDirection dwInfo, 2
	DWMes2SetFlowDirection dwInfo, 3
	DWMes2SetWordWrapping dwInfo, 0
	return

#global
	DWMes_Init
#endif // MOD_DWMES_HSP_
コメント ( 0 ) | Trackback ( 0 )

ガンマ設定

モジュール 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)
メニューを作成します。
strMenu: メニュー作成用の文字列
beginID: 最初のメニューID
戻り値: 成功ならメニューハンドル、失敗なら0。
hMenu = MakePopMenu(strMenu, beginID)
ポップアップメニューを作成します。
strMenu: メニュー作成用の文字列
beginID: 最初のメニューID
戻り値: 成功ならメニューハンドル、失敗なら0。
モジュール関数名説明
モジュール型変数の作成
newmod mod, mod_MakeMenu, strMenu, beginID, bPop
mod: 作成されるmod_MakeMenuモジュール型変数
strMenu: メニュー作成用の文字列
beginID: 最初のメニューID
bPop: ポップアップメニューを作成する場合1、メニューを作成する場合0を指定。
ret = MakeMenu_Make(mod, strMenu, beginID, bPop)
メニューを再作成します。
strMenu: メニュー作成用の文字列
beginID: 最初のメニューID
bPop: ポップアップメニューを作成する場合1、メニューを作成する場合0を指定。
戻り値: 成功ならメニューハンドル、失敗なら0。
ret = MakeMenu_Del(mod)
メニューを破棄します。
戻り値が0なら失敗で、それ以外は成功です。
ret = MakeMenu_Show(mod, bShow)
メニューの表示、非表示を設定します。
bShow:
1の場合、現在アクティブなウィンドウにメニューを表示します。
0の場合、メニューを表示させたウィンドウのメニューを非表示にします。
戻り値が0なら失敗で、それ以外は成功です。
ret = MakeMenu_Pop(mod)
現在のマウス位置に、ポップアップメニューを表示します。
戻り値が0なら失敗で、それ以外は成功です。
ret = MakeMenu_PopEx(mod, x, y, flag)
任意の位置に、ポップアップメニューを表示します。
x: 水平位置を、スクリーン座標で指定します。
y: 垂直位置を、スクリーン座標で指定します。
flag: こちらを参照。TrackPopupMenu function
戻り値が0なら失敗で、それ以外は成功です。
ret = MakeMenu_SetLabel(mod, menuLabel)
モジュールにラベル配列を登録します。
menuLabel: メニューが押されたときに実行するラベル配列を指定。
戻り値が1なら成功で、0なら失敗です。
ret = MakeMenu_CallLabel(mod, wp)
wparamから該当するメニューのIDがあれば、ラベルをgosubします。
wp: wparam。
戻り値が1ならラベル実行。0なら該当IDではありません。
hMenu = MakeMenu_GetMenu(mod)
メニューハンドルを返します。
flag = MakeMenu_GetFlag(mod)
メニューの状態を返します。
0:作成されていません。
1:メニューが作成されています。
3:メニューが作成され、ウィンドウに表示されています。
4:ポップアップメニューが作成されています。
id = MakeMenu_GetBeginID(mod)
最初のメニューIDを返します。
size = MakeMenu_IDSize(mod)
メニューIDの数を返します。
name = MakeMenu_GetName(mod, nID)
指定したIDのメニューアイテム名を返します。
nID: メニューID
戻り値が""なら失敗で、それ以外は成功です。
ret = MakeMenu_SetName(mod, nID, str name)
指定したIDのメニューアイテム名を変更します。
nID: メニューID
name: 新しいメニューアイテム名
戻り値が0なら失敗で、それ以外は成功です。
ret = MakeMenu_Checked(mod, nID, int bCheck)
指定したIDのメニューアイテムのチェックを設定、取得します。
nID: メニューID
bCheck:
-1: チェック状態を取得します。戻り値は、0ならチェック無しで1ならチェック有です。
0: チェック無しの状態に設定します。戻り値が0なら失敗で、それ以外は成功です。
1: チェック有りの状態に設定します。戻り値が0なら失敗で、それ以外は成功です。
ret = MakeMenu_Disabled(mod, nID, bDisabled)
指定したIDのメニューアイテムの有効状態を設定、取得します。 無効状態の場合、押しても反応しません。
nID: メニューID
bCheck:
-1: 有効状態を取得します。戻り値は、0なら有効で1なら無効です。
0: 有効の状態に設定します。戻り値が0なら失敗で、それ以外は成功です。
1: 無効の状態に設定します。戻り値が0なら失敗で、それ以外は成功です。
ret = MakeMenu_SetID(mod, nID, newID)
指定したIDを変更します。
nID: メニューID
newID: 変更するID
戻り値が0なら失敗で、それ以外は成功です。
メニュー作成用文字列
メニュー用文字列は、複数行で構成され、各行はタブ(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)となります。
メニュー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です。
以下サンプル。
#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 )
« 前ページ