hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
String/矩形 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

文字列の矩形

文字列の幅と高さを取得(v3.00)

描画せずに文字列の描画される矩形サイズを取得します。
改行にも対応しています。

一部修正しました。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
-
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
#include "llmod3/llmod3.hsp"
#module
 
 ;################################################
 ; < GetStrRect >
 ;	文字列の描画される矩形サイズを取得
 ;GetStrRect p1, p2
 ;	p1 : 幅,高さを受け取る数値型配列変数
 ;	p2 : 長さを調べる文字列型変数
 ;	【解説】
 ;	p2で指定した1行以上の文字列をmes等で表示する前にその横幅と高さを取得します。
 ;	失敗するとstatに0が返り、成功すると0以外が返される。
 #deffunc GetStrRect var intSize, var szword
     mref outstat, 64
     mref bmscr, 67
 
     dim prm2
     dim tm,56
     prm2.0 = bmscr.4    ;画面のデバイスコンテキスト
     getptr prm2.1, tm
     dllproc "GetTextMetricsA", prm2, 2, D_GDI    ;指定フォントの高さ取得に使用 tm.0
     if stat = 0 : outstat = 0 : goto *@forward
 
     dim prm1, 4
     prm1.0 = prm2.0
     getptr prm1.3, size
     outstat = 1
     intSizeW = 0 : intSizeH = 0
     szTxt = szword
     notesel szTxt
     szTxtMax=noteinfo(0)     ;行数取得
     repeat szTxtMax
         noteget@ szLine,cnt        ;1行づつ読み込み
         getptr prm1.1, szLine    ;対象文字列
         prm1.2=strlen(szLine)     ;文字列の長さ取得
         dllproc "GetTextExtentPoint32A", prm1, 4, D_GDI
         if stat {
             ;文字列の幅
             if intSizeW<size.0 : intSizeW = size.0
         }
         else{
             outstat = stat
             break
         }
         intSizeH += tm.0    ;フォント高さ
     loop
 
     intSize = intSizeW, intSizeH    ;幅と高さ
 
 *@
     return
 
 #global
 ;###モジュールここまで########################################################
 
 
     ;
     ; 実行サンプル
     ;
     font "MS Pゴシック", 36,16
 
     s = "test\nあいうえお\n\n012"
     dim intMojiSize, 2
     GetStrRect intMojiSize, s    ;矩形サイズ取得
 
     color 255,0,0
     boxf ,, intMojiSize.0, intMojiSize.1
     color 255,255,255
     boxf 1,1, intMojiSize.0-1, intMojiSize.1-1
     color 0,0,0
     mes s
コメント
  • HSPWikiでkz3さんv3.0用にやってたのをv2.61でも使いたいと思ってやってみたのですが… -- GENKI
  • 文字列中のスペース1字からなる行は・・・^^;
    このソースだと、空行には対応していませんよね?例えば
      1
    
     
    
        a = "test\nあいうえお\n \n012"
      1
    
     
    
        a = "test\nあいうえお\n\n012"
    にすると分かると思います。
    これは文字列の"描画"をどう捕らえるか、次第だと思います。
      1
    
     
    
        a = "Hello,world\n\n"
    のとき、目に見えて描画される文字列は"Hello,world"です。しかし、
      1
    
     
    
        a = "Hello,world\n\nBonjour,HSP3"
    とした時は"...HSP3"までが描画されます。ここで空行を描画と捕らえるかどうか。
    僕は文字列は終端で終わるという文字列の仕様から空行も描画と捕らえて実装しました。
    GetTextExtentPoint32()は空行は"描画されない"ものとします。
    しかし僕の仕様では空行も行として高さを計算に含めなければならなかったので、GetTextMetrics?()を使ったというわけです。
    あとはメモリノートで1行処理するたびに1行の高さを描画矩形サイズに加算していく、というわけです。
    が僕の仕様だと
      1
    
     
    
        a = "Hello,world\n\n"
    とした時には目に見えて描画されていない部分まで描画されている、とするので上のGENKIさんのサンプルスクリプトに適用すると、 ちょっと違和感があると思います。
    文字列中の最後の行が空行かどうかで処理を分けられもしますが、文字列描画は文字列の仕様に合わせるのがいいと思うので、 空行を文字列の"終り"と見なすよりは、空行も描画に含めてもいいと思います。
    カレントポジションも移るしね^^
    この辺りの命令の仕様は作者次第ということで・・・GENKIさんどうかな? -- kz3 2005-09-07 08:59:01 (水)
  • 助かります。HSP3もAPIも使い慣れないもんだから追いかけきれてませんでした。改行バグまで再現しきれなかったので注釈で逃げ。 [worried2](使えないことないからいーやー・・・とつい) -- GENKI? 2005-09-08 00:19:10 (木)
  • そういえばmrefの67なんてはじめて使った…。APIの使い方も少し分かってきた気もするし、今回いいべんきょーになりました。 -- GENKI? 2005-09-08 00:21:56 (木)
  • 今設定されてるフォントから高さ(tmHeight)を取得するから改行であることとかは関係ないということか。ふむふむ…。 -- GENKI? 2005-09-08 00:23:02 (木)
  • ん^^; うん^^ (良く分かってない) -- kz3 2005-09-08 10:29:03 (木)
    URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

文字列の描画される矩形サイズ取得(v3.00)

filestrrect.hsp
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
;===========================================================
;	文字列の描画領域のサイズを取得する for hsp3.0a
;
;	2006/01/13 ... kz3
;===========================================================
#module
    #uselib "user32.dll"
    #func DrawText "DrawTextA" int,sptr,int,sptr,int
 
    #deffunc getstrrect int p1, str p2, array p3
        rc = 0,0,0,0
        DrawText p1, p2, -1, varptr(rc), $00000400
        p3.0 = rc.2
        p3.1 = rc.3
 
        return
 
#global
 
    dim rc, 2
 
    getstrrect hdc, "Hello\n12345", rc
 
    mes rc.0
    mes rc.1
コメント
  • HSPWikiに載せたものを載せて置きます。ただし内容はもしかしたら若干変わっているかもしれません。 -- kz3 2005-09-07 10:54:32 (水)
  • 今のままだとモジュールの使い勝手が悪いので修正します。配列の書き方も2.xxだったりして全体的な統一感もなかったし^^;急ごう。 -- kz3 2005-09-07 11:08:48 (水)
  • デバイスコンテキストを指定できるように直しました。(HSPWikiも) -- kz3 2005-09-07 12:57:48 (水)
  • このモジュールでオブジェクトの大きさを文字列に合わせようとしても無理です。このモジュールはデバイスフォント情報を元に矩形サイズを取得しますが、オブジェクトのフォントはGDIフォントで管理しています。いずれそちらのモジュールも作ってみよう・・・。getdevicestrrect , getgdistrrect と分けるかな・・・。 -- kz3 2005-09-07 15:42:50 (水) }
  • 全体的にSizeとRectが混乱している。Rectは長方形の左上、右下の座標を表現し、Sizeは長方形の辺を表現している。文字列の矩形サイズと言ってるようにSizeとしたほうが混乱しないな・・・またまた変更します。 -- kz3 2005-09-08 08:52:42 (木)
  • 36行目、h=0と同様にw=0もすべきでは?長い文字列幅取得後に短い文字列を取得したときに変な値が返るように思います。 -- a? 2006-01-12 (木) 22:37:38
  • まだ他にもこういったものがあるかも・・・^^;短くスッキリしました。 -- kz3 2006-01-13 (金) 02:24:46
  • ありがとうございます、すごく短くなってびっくりです。おかげさまで自作ソフトを公開することができました。http://www7.atwiki.jp/khan/pages/36.html -- a? 2006-01-16 (月) 03:22:28
  • ライブラリって程のものでもないし、DrawText?()を使うということを私も教えてもらったし・・・(「DrawText?()じゃダメなの?」と^^;)

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2013-10-21 (月) 07:27:10 (48d)