|
|
2011/10/3(Mon) 17:53:17|NO.41950
a2d の alDrawText で描画されるサイズを取得する方法はありますか?
例えば gdi32 の DrawText 関数 は DT_CALCRECT を指定すると 描画される四角形領域を計算して返す事が出来ます。
api の仕様上 どこかにこのような方法が有りそうだと思うのですが。色々調べても見つかりませんでした。
#include "user32.as"
#define DT_CALCRECT $00000400
#define DT_WORDBREAK $00000010
txt = {"ががが\nががが\nががががががががが\nががががががが\nあがggggggggggggddd
gggggggggggggggggggg\nggggggggggg"}
font msGothic , 24,1|2
rc = 0,0,620,430
color 210,210,255
boxf rc,rc.1,rc.2,rc.3
drawtext hdc , varptr(txt) , -1 , varptr(rc) , DT_CALCRECT|DT_WORDBREAK
color
boxf rc,rc.1,rc.2,rc.3 // 描画する範囲のみ塗りつぶし
color 255,210,210
drawtext hdc , varptr(txt) , -1 , varptr(rc) , DT_WORDBREAK
redraw
|
|
2011/10/4(Tue) 16:29:50|NO.41984
GdipMeasureStringを使うみたいですね。
a2dに手を加えないと難しそうです。
#func GdipMeasureString "GdipMeasureString" int, wstr, int, int, int, int, int, int, int
dim br, 4
GdipMeasureString imgGraphics, p1, alWstrlen(p1), imgFont, varptr(rectf), tmpFormat, varptr(br), varptr(a), varptr(b)
↑をalDrawText_命令のGdipDrawStringの下あたりに加えておいて、
変数brの値を取り出す命令を作る。
(a2dをバックアップしてから編集したほうが無難です。)
brの中身はfloatになっているのでintにする。
(↓自力キャストがわからないのでcで書きました...)
#module
#uselib "kernel32.dll"
#func VirtualProtect "VirtualProtect" int, int, int, int
#defcfunc float2int int p1
if pfunc == 0 {
dim fncode,10
fncode.0 = $50e58955, $fe7dd950, $fe45b70f, $800845d9, $89660ccc
fncode.5 = $6dd9fc45, $f85ddbfc, $8bfe6dd9, $c2c9f845, $90900004
VirtualProtect varptr(fncode), 10*4, 0x40, varptr(old)
pfunc = varptr(fncode)
}
prm = p1
return callfunc(prm, pfunc, 1)
#global
w = float2int(br.2)
h = float2int(br.3)
|
|
2011/10/4(Tue) 17:03:13|NO.41988
alDrawTextをコピー編集して新規命令にしてみました。
alDrawText_命令のreturnの下あたりに貼り付けると使えます。
#func GdipMeasureString "GdipMeasureString" int, wstr, int, int, int, int, int, int, int
#uselib "kernel32.dll"
#func VirtualProtect "VirtualProtect" int, int, int, int
#defcfunc float2int int p1
if pfunc == 0 {
dim fncode,10
fncode.0 = $50e58955, $fe7dd950, $fe45b70f, $800845d9, $89660ccc
fncode.5 = $6dd9fc45, $f85ddbfc, $8bfe6dd9, $c2c9f845, $90900004
VirtualProtect varptr(fncode), 10*4, 0x40, varptr(old)
pfunc = varptr(fncode)
}
prm = p1
return callfunc(prm, pfunc, 1)
#deffunc alDrawText_CalcRect_ array p0, str p1, int px, int py, int pw, int ph, int pah, int pav
if imgFont {
GdipCreateStringFormat 0, 0, varptr(tmpFormat) ; アラインメント用 Format オブジェクト
GdipSetStringFormatAlign tmpFormat, pah
GdipSetStringFormatLineAlign tmpFormat, pav
rectf = alFloat(px), alFloat(py), alFloat(pw), alFloat(ph)
dim br, 4
GdipMeasureString imgGraphics, p1, alWstrlen(p1), imgFont, varptr(rectf), tmpFormat, varptr(br), varptr(a), varptr(b)
GdipDeleteStringFormat tmpFormat ; Format オブジェクト 削除
tmpFormat = 0
repeat 4
p0.cnt = float2int(br.cnt)
loop
}
return
#define global alDrawText_CalcRect(%1, %2="", %3=0, %4=0, %5=9999, %6=9999, %7=0, %8=0) alDrawText_CalcRect_ %1, %2, %3, %4, %5, %6, %7, %8
p1にRECT(変数)が入り後はalDrawTextの引数が後ろにつきます。
| |
|
2011/10/5(Wed) 13:50:43|NO.42029
スクリプトありがとうございます。解決しました。
|
|
2011/10/5(Wed) 14:05:38|NO.42030
|
|