フォームのサイズ、座標を設定するには?

解決


sin  2006-08-24 23:44:44  No: 96409

今回2回目の質問をさせて頂きます。

現在、あるプログラムを組んでいまして
その中の仕様として初期起動フラグがたっている物に関しては
DBが記憶している座標、配置、Zオーダーに変更するというのがありまして
その仕様どおりにするため最初にフラグがたっているものを
FormLoad内で通常起動し、その後に座標などを変更しているのですが
起動まではうまくいっているのですが座標などを変更するAPIを使用すると
使用されたEXEが画面上から消えてしまいます。

使用したAPIはSetWindowPosとMoveWindowの2通りをしました。
最初にSetWindowPosを使ったのですが消えてしまったため
Zオーダーのせいかと思いとりあえず座標などを変えようと思い
MoveWindowを使用したらそれでも消えてしまいました。

消えるというのは最小化された状態みたいな感じなのですが
そうなってしまったら強制終了させるしか
原因がわからず困っているのでどなたかわかる方がいらっしゃいましたら
よろしくお願いいたします。

ちなみにMoveWindowは正常に機能しているみたいで戻値は0ではありませんでした。


あん  2006-08-24 23:56:30  No: 96410

VBの質問じゃないような。。


sin  2006-08-25 00:16:51  No: 96411

VB6.0で組んでいるプログラムなのでVBの話題だと思うんですけど。。。
こういう質問はどこでしたらいいんでしょうか?


あん  2006-08-25 00:58:35  No: 96412

VBで組んでるなんてどこにもないですよ?
APIの話だけだし。。


sin  2006-08-25 01:15:41  No: 96413

あ、そういえばそうですね。。。
MoveWindowやSetWindowPosについてはAPIになるから
ここじゃ駄目なんですね。

えっとVBで出来るかわからないんですがメインとなるExeを起動した時に
メインExeから他Exeを起動し予めDBに書いてある配置、サイズに変更
しようとするなら上記APIを使用しないで何か方法はありませんでしょうか?


大吉末吉  2006-08-25 01:41:37  No: 96414

sin  さん  こんにちは。

> メインとなるExeを起動した時に
> メインExeから他Exeを起動し予めDBに書いてある配置、サイズに変更
> しようとするなら

メインのEXE内の処理で、起動した他EXEの位置・サイズを変更するんでしょうか?

> FormLoad内で通常起動し、その後に座標などを変更しているのですが
こっちを読むと、起動した他EXE内で、自分の位置・サイズを変更しよとしているとも取れますけど・・・

後者なら、APIは使わずに、単純にプロパティを指定すれば良いと思いますが・・・

後、API(MoveWindowやSetWindowPos)で指定したときに、具体的に、どういう風に(どういう値で)指定したんでしょうか?

#値を間違った(例えば、座標系が違うとか)なんて事は無いですか?


あん  2006-08-25 01:46:17  No: 96415

他EXEに座標等を引数で渡すっていうのは多分無理なんでしょうね。

まず、MoveWindowやSetWindowPosの使い方が間違ってるんじゃないかと
疑っています、(ソースないし。。)
あさっての場所にいってるかと。。
消えた後、スタートバーのところで最大化等やったら復活しません?


sin  2006-08-25 02:23:38  No: 96416

大吉末吉さん、あんさん返答ありがとうございます。

>メインのEXE内の処理で、起動した他EXEの位置・サイズを変更するんでしょうか?

その通りです。メイン側が起動した他Exeの位置、サイズの変更です。

APIの記述はMoveWindowの場合ですが
Ret = MoveWindow(他Exe.hwnd, Left,Top,Width,Height, true)

と記述してあります。
各座標やサイズについては上記に書いてありますがDBを参照して
それを一度内部TBLに格納してから使っています。

>他EXEに座標等を引数で渡すっていうのは多分無理なんでしょうね。

この方法が不可能でしたらやはりその方法をとるしかないということ
ですよね・・・

>消えた後、スタートバーのところで最大化等やったら復活しません?
最大化の場合のみ復活しました!しかしそこから元に戻す等をすると
また消えてしまいます。原因は何なのでしょうか?


あん  2006-08-25 02:33:28  No: 96417

MoveWindow等の宣言のところと、
Left,Top,Width,Heightの宣言のところを
教えてください。
Left,Top,Width,Heightにはたとえばどんな数値が入ってますか?


sin  2006-08-25 02:39:49  No: 96418

MoveWindowの宣言というとこれでいいんでしょうか?

Public Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long

Left,Top,Width,Heightの宣言は上記のものと少し名前が違いますが

Public Type RD_USER_REC
            Puser_Ka          As String
            Puser_Ope         As String
            Puser_Seq         As Long
            Puser_Index       As Long
            Puser_Argument    As String
            Puser_Kido_flg    As String
            Puser_Left        As Long
            Puser_Top         As Long
            Puser_Width       As Long
            Puser_Height      As Long
            Puser_Zorder      As Long
            Puser_Syoki       As String
End Type

という風にタイプ宣言をしてTBLとして使ってます。
実際の値(プログラムを流したときに実際入っていた値をそのまま書きます)

Left=4620  Top=3030  Width=9360  Height=6225

と入っています。


あん  2006-08-25 02:47:56  No: 96419

やっぱり。。  あさっての方向にいってたのね
値がでかすぎます。。


大吉末吉  2006-08-25 02:50:11  No: 96420

sin  さん  こんにちは。

> Left=4620  Top=3030  Width=9360  Height=6225

ですか。

> #値を間違った(例えば、座標系が違うとか)なんて事は無いですか?

が、当たりっぽいですね。

API関数の場合、座標系は、「Pixel」で指定しなければなりません。
Pixelは、ドット単位で、いわゆる「画面の解像度」と同じです。
#画面が1024x768のサイズなら、画面の右下の座標は(1024,768)になります。

4620や3030なんて指定すると、画面をはみ出してしまいますよ。

VBの座標系(Twips)で、指定してしまったんでしょうか?

でしたら、Pixelに変換して指定してください(位置&サイズ両方)

なお、TwipsとPixelは、「Screen オブジェクト」の「TwipsPerPixelX、TwipsPerPixelY プロパティ」の値を使って変換できます。


sin  2006-08-25 03:29:03  No: 96421

なるほど。
ということは今Twipsでとってる値にScreen.TwipPerPixcel?だったかな
その値でわってあげればそのままでもいけるんでしょうか?


大吉末吉  2006-08-25 03:37:04  No: 96422

sin  さん  こんにちは。

> その値でわってあげればそのままでもいけるんでしょうか?

そうですね。

Twips単位の座標を使っているなら、
X方向(=LeftとWidth)の場合、Screen.TwipPerPixcelXで
Y方向(=TopとHeight)の場合、Screen.TwipPerPixcelYで
割れば、Pixel単位の座標になります。


sin  2006-08-25 07:01:16  No: 96423

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

一度週明けにしかちょっとプログラムさわれないので
その時やってみようと思います。

まだまだ初歩的な段階でつまづく自分にがっかりですが
これからも精進していこうかと思います!

また何かあったときは宜しくお願いします〜。


sin  2006-09-04 23:51:24  No: 96424

解決をチェックし忘れていたので解決します。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加