HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1003
infoaldrawtext で描画されるサイズ。4解決


info

リンク

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



この記事に返信する


pizza

リンク

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)



pizza

リンク

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の引数が後ろにつきます。



info

リンク

2011/10/5(Wed) 13:50:43|NO.42029

スクリプトありがとうございます。解決しました。



info

リンク

2011/10/5(Wed) 14:05:38|NO.42030

 



ONION software Copyright 1997-2023(c) All rights reserved.