今回2回目の質問をさせて頂きます。
現在、あるプログラムを組んでいまして
その中の仕様として初期起動フラグがたっている物に関しては
DBが記憶している座標、配置、Zオーダーに変更するというのがありまして
その仕様どおりにするため最初にフラグがたっているものを
FormLoad内で通常起動し、その後に座標などを変更しているのですが
起動まではうまくいっているのですが座標などを変更するAPIを使用すると
使用されたEXEが画面上から消えてしまいます。
使用したAPIはSetWindowPosとMoveWindowの2通りをしました。
最初にSetWindowPosを使ったのですが消えてしまったため
Zオーダーのせいかと思いとりあえず座標などを変えようと思い
MoveWindowを使用したらそれでも消えてしまいました。
消えるというのは最小化された状態みたいな感じなのですが
そうなってしまったら強制終了させるしか
原因がわからず困っているのでどなたかわかる方がいらっしゃいましたら
よろしくお願いいたします。
ちなみにMoveWindowは正常に機能しているみたいで戻値は0ではありませんでした。
VBの質問じゃないような。。
VB6.0で組んでいるプログラムなのでVBの話題だと思うんですけど。。。
こういう質問はどこでしたらいいんでしょうか?
VBで組んでるなんてどこにもないですよ?
APIの話だけだし。。
あ、そういえばそうですね。。。
MoveWindowやSetWindowPosについてはAPIになるから
ここじゃ駄目なんですね。
えっとVBで出来るかわからないんですがメインとなるExeを起動した時に
メインExeから他Exeを起動し予めDBに書いてある配置、サイズに変更
しようとするなら上記APIを使用しないで何か方法はありませんでしょうか?
sin さん こんにちは。
> メインとなるExeを起動した時に
> メインExeから他Exeを起動し予めDBに書いてある配置、サイズに変更
> しようとするなら
メインのEXE内の処理で、起動した他EXEの位置・サイズを変更するんでしょうか?
> FormLoad内で通常起動し、その後に座標などを変更しているのですが
こっちを読むと、起動した他EXE内で、自分の位置・サイズを変更しよとしているとも取れますけど・・・
後者なら、APIは使わずに、単純にプロパティを指定すれば良いと思いますが・・・
後、API(MoveWindowやSetWindowPos)で指定したときに、具体的に、どういう風に(どういう値で)指定したんでしょうか?
#値を間違った(例えば、座標系が違うとか)なんて事は無いですか?
他EXEに座標等を引数で渡すっていうのは多分無理なんでしょうね。
まず、MoveWindowやSetWindowPosの使い方が間違ってるんじゃないかと
疑っています、(ソースないし。。)
あさっての場所にいってるかと。。
消えた後、スタートバーのところで最大化等やったら復活しません?
大吉末吉さん、あんさん返答ありがとうございます。
>メインのEXE内の処理で、起動した他EXEの位置・サイズを変更するんでしょうか?
その通りです。メイン側が起動した他Exeの位置、サイズの変更です。
APIの記述はMoveWindowの場合ですが
Ret = MoveWindow(他Exe.hwnd, Left,Top,Width,Height, true)
と記述してあります。
各座標やサイズについては上記に書いてありますがDBを参照して
それを一度内部TBLに格納してから使っています。
>他EXEに座標等を引数で渡すっていうのは多分無理なんでしょうね。
この方法が不可能でしたらやはりその方法をとるしかないということ
ですよね・・・
>消えた後、スタートバーのところで最大化等やったら復活しません?
最大化の場合のみ復活しました!しかしそこから元に戻す等をすると
また消えてしまいます。原因は何なのでしょうか?
MoveWindow等の宣言のところと、
Left,Top,Width,Heightの宣言のところを
教えてください。
Left,Top,Width,Heightにはたとえばどんな数値が入ってますか?
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
と入っています。
やっぱり。。 あさっての方向にいってたのね
値がでかすぎます。。
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 プロパティ」の値を使って変換できます。
なるほど。
ということは今Twipsでとってる値にScreen.TwipPerPixcel?だったかな
その値でわってあげればそのままでもいけるんでしょうか?
sin さん こんにちは。
> その値でわってあげればそのままでもいけるんでしょうか?
そうですね。
Twips単位の座標を使っているなら、
X方向(=LeftとWidth)の場合、Screen.TwipPerPixcelXで
Y方向(=TopとHeight)の場合、Screen.TwipPerPixcelYで
割れば、Pixel単位の座標になります。
わかりました!
ありがとうございます!
一度週明けにしかちょっとプログラムさわれないので
その時やってみようと思います。
まだまだ初歩的な段階でつまづく自分にがっかりですが
これからも精進していこうかと思います!
また何かあったときは宜しくお願いします〜。
解決をチェックし忘れていたので解決します。
ツイート | ![]() |