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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1123
ふにくらHGIMG4で文字列矩形のサイズ取得2解決


ふにくら

リンク

2020/11/23(Mon) 12:49:46|NO.91839

お世話になります。
HGIMG4で文字列矩形の幅・高さを取得しようとGetTextExtentPoint()やGetTextMetrics()を使ってみたのですが、おそらくデバイスコンテキストが(GDIとOpenGLで)違うため正常な値が返ってきませんでした。
ならばと以下のようにデバイスコンテキストから作ってみましたが、font命令でフォントやサイズの変更した際に反映できなかったりと、どうにも上手いやり方が思いつきません。

なにか良いお知恵をお貸し頂きたい次第です。よろしくお願いいたします。


#cfunc CreateCompatibleDC "CreateCompatibleDC" int #func SelectObject "SelectObject" int,int #func GetTextExtentPoint32 "GetTextExtentPoint32A" int, str, int, var dc1 = GetDC(hwnd) hMemDC = CreateCompatibleDC(dc1) SelectObject hMemDC, hFont tmpStr1 = "あいうa" dim rect,2 GetTextExtentPoint32 hMemDC, tmpStr1, strlen(tmpStr1), rect



この記事に返信する


K-s

リンク

2020/11/25(Wed) 01:44:15|NO.91852

mes命令でしたら描画後にginfo_mesx, ginfo_mesyで幅、高さが得られます。
HSP3.6β4でしか試していませんが標準のHSPと違ってdish版は複数行の高さが得られるようです。

#include "hgimg4.as" screen 0, 960, 540 randomize fontname = msgothic, msmincho, "メイリオ", "游ゴシック" txt(0) = {"あのイーハトーヴォのすきとおった風、 夏でも底に冷たさをもつ青いそら、 うつくしい森で飾られたモリーオ市、 郊外のぎらぎらひかる草の波。"} txt(1) = {"HSP is a development language of the interpreter type. The world can be constructed by expanding the wing of the creation."} c = 0 *mainLoop redraw 0 color 30, 30, 30 : boxf repeat 2 if c \ 60 == 0 { fi(cnt) = rnd(length(fontname)) sz(cnt) = 18 + rnd(10) ti(cnt) = rnd(length(txt)) } font fontname(fi(cnt)), sz(cnt) mx = 10 my = 30 + cnt * 270 color 220, 220, 220 pos mx, my mes txt(ti(cnt)) sx = ginfo_mesx sy = ginfo_mesy color 255, 64, 200 pos mx , my line mx + sx, my line mx + sx, my + sy line mx , my + sy line mx , my font msgothic, 16 color 255, 255, 255 pos mx, my - 20 mes fontname(fi(cnt)) + ", " + sz(cnt) loop redraw 1 await 30 c++ goto *mainLoop



ふにくら

リンク

2020/12/6(Sun) 23:03:51|NO.91875

>> K-s 様
ありがとうございます。こんなシステムマクロがあったとは知りませんでした……。
確かに仰る通り、十分なサイズのバッファを用意してあれば複数行のサイズを取得できるようです。

大変助かりました。解決とさせて頂きます。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.91839への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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