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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
1013
わっしいタイトルバーの縦幅や、ウインドウ枠の幅は9解決


わっしい

リンク

2008/10/13(Mon) 19:04:17|NO.20104

ウインドウ内部の左上隅の座標は、
ウインドウ内部の座標系ですと (0, 0) になりますが、
画面全体の座標系ですと、どのように求めたらよいのでしょうか?

タイトルバーなどを含めたウインドウの、画面全体での左上座標が得られる
システム変数 ginfo_wx1 / ginfo_wy1 をつかえばいいかとは思いましたが、
タイトルバーの縦幅やウインドウ枠の横幅がわからないので
行きづまってしまいました。

わかる方、ご教授くださいませ。



この記事に返信する


flory

リンク

2008/10/13(Mon) 19:37:25|NO.20108

hsp開発wikiより。
http://hspdev-wiki.net/?%A5%A6%A5%A3%A5%F3%A5%C9%A5%A6%B3%B0%A4%E4%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BE%E5%A4%CE%A5%DE%A5%A6%A5%B9%BA%C2%C9%B8%A4%F2%BC%E8%C6%C0

リンク先で使われているモジュールを参考に。

ただ、以前自分で使ってみたとき、特定状況下でうまくいかなかった覚えがありますので、そういうときはwin32APIのClientToScreen関数を使えば確実です。



inovia

リンク

2008/10/13(Mon) 19:52:26|NO.20110

こんな感じでいけるかと。
と思ったら、floryさんが先に答えていましたね。(^_^;)
一応のせておきます。


repeat x=ginfo(4)+(ginfo(10)-ginfo(12))/2 y=ginfo(5)+(ginfo(11)-ginfo(13))-((ginfo(10)-ginfo(12))/2) //枠の太さが、均一(タイトルバーを除き)を利用して・・・ //枠を含めたウィンドウサイズX-クライアントエリアXサイズ/2=枠の大きさ //枠を含めたウィンドウサイズY-クライアントエリアYサイズ-枠の大きさ=タイトルバーの大きさ //そしたら、枠の大きさ+スクリーンから見たX座標がウインドウ内部の座標系Xという訳(Yも同じ) pos 0,0:color:boxf:color 255,255,255:mes ""+x+":"+y: redraw 1 wait 10 redraw 0 loop



わっしい

リンク

2008/10/13(Mon) 20:26:49|NO.20114

floryさん、inoviaさん、ありがとうございました!

あれから自分でも考えてみましたが、うまくいきませんでした。

floryさんのおっしゃる「特定状況下でうまくいかなかった」というのが気になります。
覚えていらっしゃれば、教えていただけないでしょうか?



ka-navi

リンク

2008/10/13(Mon) 22:18:32|NO.20121

WinAPIのGetSystemMetrics関数を使えば取得することができたと思います



わっしい

リンク

2008/10/13(Mon) 22:29:32|NO.20124

ka-naviさん、ありがとうございました!

このようなルーチンの存在も知りませんでした。
勉強になりました。



わっしい

リンク

2008/10/13(Mon) 22:34:16|NO.20125

floryさんに教えていただきました win32APIのClientToScreen を使ったサンプルを
以下に示します。
これまで win32API を使う方法があるということを知りませんでした。
ありがとうございました。
(win32APIの呼び出しは、ちょくとさんのサイトを参考にさせていただきました。)


なお、私のPCですと以下のように、
ウインドウID=0 のウインドウのほうが他のより縦横とも幅が1ドットずつ
小さいという結果になりました。

ウインドウID  ウインドウ左枠の横幅  タイトルバーの縦幅
0        3           29
1,2,3     4           30


;サンプルです-----------------------------------------------------------------
;以下の2行は、スクリプトの最初のほうでしておきます
#uselib "user32.dll"
#func ClientToScreen "ClientToScreen" int, int


;つづいて、スクリプトのどこかで
gsel 知りたいウインドウのID ;buffer 命令で初期化したIDだとエラーになります

dim rc, 2
rc(0) = 0
rc(1) = 0
ClientToScreen hwnd, varptr(rc)

xlen = rc(0) - ginfo_wx1
ylen = rc(1) - ginfo_wy1


gsel 結果を表示するウインドウID
color 255, 255, 255

if (stat == 0) {
mes "関数呼び出し時にエラーが発生しました。"
} else {
mes "関数呼び出しは成功しました。"
}

mes "hwnd = "+hwnd
mes "ウインドウ左枠の横幅 = " + xlen
mes "タイトルバーの縦幅 = " + ylen
;-------------------------------------------------------------------------------



flory

リンク

2008/10/14(Tue) 17:34:58|NO.20151

>floryさんのおっしゃる「特定状況下でうまくいかなかった」というのが気になります。
>覚えていらっしゃれば、教えていただけないでしょうか?

そのときのスクリプトが残っていたので、うまくいかなかった状況を再現しようとしてみましたが、……きちんと動作しますな。まったく別の原因だったようです。

というわけで、前言撤回、自分で確認した限りではうまく動作します。お騒がせしました。



>ウインドウID=0 のウインドウのほうが他のより縦横とも幅が1ドットずつ
>小さいという結果になりました。

それは、ウィンドウID1以降のウィンドウがサイズ可変の状態で作られるからです。
たとえ見た目が同じでも、サイズ可変ウィンドウとサイズ固定ウィンドウではウィンドウの枠の幅が異なります。
実際、ウィンドウID1以降を作成するときに、screen命令の第四パラメータに+4(サイズ固定)してみると、ウィンドウID1以降でもID0と同じ値になります。なるはずです。

ちなみに、ウィンドウの枠の幅は、ka-naviさんが仰られているGetSystemMetrics関数を使えば具体的な数値を得ることができます。
以下使用例。

#uselib "user32.dll" #cfunc GetSystemMetrics "GetSystemMetrics" int #const SM_CYCAPTION $00000004 ;タイトルバーの高さ #const SM_CXFIXEDFRAME $00000007 ;タイトルバーを持ち、かつ、サイズを変更できないウィンドウの枠の幅 #const SM_CYFIXEDFRAME $00000008 ;タイトルバーを持ち、かつ、サイズを変更できないウィンドウの枠の高さ #const SM_CXSIZEFRAME $00000020 ;サイズを変更できるウィンドウの枠の幅 #const SM_CYSIZEFRAME $00000021 ;サイズを変更できるウィンドウの枠の高さ #const SM_CYSMCAPTION $00000033 ;小さなタイトルバーの高さ(ツールウィンドウなどの場合) mes "タイトルバーの高さ : " + GetSystemMetrics(SM_CYCAPTION) mes "小さなタイトルバーの高さ : " + GetSystemMetrics(SM_CYSMCAPTION) mes "サイズを変更できないウィンドウの枠の幅と高さ : " + GetSystemMetrics(SM_CXFIXEDFRAME) + ", " + GetSystemMetrics(SM_CYFIXEDFRAME) mes "サイズを変更できるウィンドウの枠の幅と高さ : " + GetSystemMetrics(SM_CXSIZEFRAME) + ", " + GetSystemMetrics(SM_CYSIZEFRAME)



わっしい

リンク

2008/10/14(Tue) 19:59:50|NO.20159

>そのときのスクリプトが残っていたので、うまくいかなかった状況を再現しようと
>してみましたが、……きちんと動作しますな。まったく別の原因だったようです。

わざわざお時間をさいて確かめていただき、ありがとうございました!


>たとえ見た目が同じでも、サイズ可変ウィンドウとサイズ固定ウィンドウではウィンドウの
>枠の幅が異なります。
>実際、ウィンドウID1以降を作成するときに、screen命令の第四パラメータに+4
>(サイズ固定)してみると、ウィンドウID1以降でもID0と同じ値になります。なるはずです。

なるほど。そういう理由で1ドット違っていたのですねー。
さっそく試してみました。そのとおりになりました!

ウインドウID=0は、もともとサイズ固定のみで、可変にすることができないので
screen命令の第4パラメータを +4 にしてもしなくても1ドット小さい値となりました。

ウインドウID=1は、サイズ固定にしますと、サイズ可変の値より1ドット小さくなりました。


ka-naviさんご紹介のGetSystemMetrics関数のサンプルプログラムは、
今度いろいろためしてみたいです。


ありがとうございました!



わっし

リンク

2008/11/26(Wed) 13:54:26|NO.21049

ka-navi さんと flory さんに教えていただいたやり方をやってみました。

このやりかたですと、
ウインドウ上のクローズボックスなどがあるバーの幅(以下A)は、
・ウインドウの枠の高さ…以下B
・タイトルバーの高さ……以下C
の2つに分けて得られるのですね。

Aを得たいときは、B+Cをしなくてはならないようです。

サイズ固定のウインドウとサイズを変更できるウインドウとでは、
Cは同じですが、Bが1ドット変わります(3ドットと4ドット)。



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