SetParentで表示したフォームの位置がズレます

解決


なな  2011-05-25 02:24:31  No: 102930  IP: [192.*.*.*]

この前質問させて頂いたものです。
この前はごめんなさい。

またSetParentで解らないことがあって教えてください。

親フォームにピクチャーボックスを貼っています。
そのピクチャーボックスに子フォームをSetParentで表示しています。

親フォーム:form1
ピクチャーボックス:pic1
子フォーム:form2

private sub loadform()
dim lngret as long
load form2
with form2
 .width=form1.pic1.scalewidth
 .height=form1.pic1.scaleheight
 .left=0
 .top=0
 lngret=setparent(.hwnd,form1.pic1.hwnd)
 if lngret<>0 then
  .visible=true
  .move 0, 0, form1.pic1.scalewidth, form1.pic1.scaleheight
end with
end sub

private sub unloadform()
 if not form2 is nothing then
  unload form2
  set form2=nothing
  err.clear
 end if
end sub

これで子フォームをロードしたりアンロードしたりしています。

親フォームロード時に子フォームをロードすると問題なく、left=0、top=0に表示されるんですが、子フォームをアンロードして再度ロードするとき、left=2040、top=8865に表示されて子フォームが見えなくなります。

left=0、top=0にmoveしているんですが、位置が指定どおりになりません。

解決法ないでしょうか?

vb6(sp6)、win7です。

宜しくお願いします。

編集 削除
なな  2011-05-25 02:27:08  No: 102931  IP: [192.*.*.*]

ごめんなさい。
end ifが抜けていました。

with form2
 .width=form1.pic1.scalewidth
 .height=form1.pic1.scaleheight
 .left=0
 .top=0
 lngret=setparent(.hwnd,form1.pic1.hwnd)
 if lngret<>0 then
  .visible=true
  .move 0, 0, form1.pic1.scalewidth, form1.pic1.scaleheight
 end if
end with
end sub

編集 削除
むに  2011-05-25 22:50:12  No: 102932  IP: [192.*.*.*]

APIの
ClientToScreen 
ScreenToClient
どっちか忘れましたけど座標変換して.moveしてみては?
いつもどっちか分からなくなりますが多分それではないかと。

編集 削除
なな  2011-05-25 23:58:54  No: 102933  IP: [192.*.*.*]

ありがとうございます。

いろいろ調べていたんですが、ClientToScreenとScreenToClientどちらもあって。。。

すみません。質問させてください。

moveメソッドは、スクリーン座標にして使うのでしょうか?

サンプルとなるサイト等があれば教えてもらえないですか?

すみません。よろしくお願いします。

編集 削除
むに  2011-05-28 02:06:34  No: 102934  IP: [192.*.*.*]

申し訳ないです。
SetParentの後に
MoveWindowかSetWindowPos APIを子のダイアログのハンドルに
対して使います。
その時に座標変換が必要だったかと思います。
VBのプロパティは多分使いません。ごめんなさい。
月曜でよければ確認ます。

編集 削除
むに  2011-05-28 02:12:34  No: 102935  IP: [192.*.*.*]

>MoveWindowかSetWindowPos APIを子のダイアログのハンドルに
MoveWindowかSetWindowPos APIを親のダイアログのハンドルに

編集 削除
むに  2011-05-28 02:20:54  No: 102936  IP: [192.*.*.*]

>MoveWindowかSetWindowPos APIを親のダイアログのハンドルに
MoveWindowかSetWindowPos APIを子のダイアログのハンドルに
ばかん。見なかったことにして。

管理人さん。気が付いたら消しといてください。

編集 削除
なな  2011-05-31 11:31:59  No: 102937  IP: [192.*.*.*]

むにさん、ありがとうございます。

何か質問ばかりですみません。
本当に困っています。

>月曜でよければ確認ます。
よろしくお願いします。

編集 削除
むに  2011-06-01 00:24:09  No: 102938  IP: [192.*.*.*]

まずはごめんなさい。環境を勘違いしていました。
XPでは同様の現象は再現しませんでした。何回やっても
きっちり子になりました。
提示のソースでは私の環境で再現しなかったのですけど
親ダイアログを左上端に寄せた状態だとどうなります?

また、例えばXPで作成したEXEで動かしてみるとか。
SetParent失敗してたりしてないですか?

編集 削除
なな  2011-06-01 11:10:44  No: 102939  IP: [192.*.*.*]

ありがとうございます。

>また、例えばXPで作成したEXEで動かしてみるとか。
残念ながらXPの環境がないのでXPでEXEを作成できません。

>親ダイアログを左上端に寄せた状態だとどうなります?
親は、親フォームのピクチャーボックスなので。
ちなみにイメージとして、イミディエイトウィンドウみたいな感じです。

>SetParent失敗してたりしてないですか?
エラーは出ていません。
起動するとき、同じコードを使って子フォームを表示していますが、そのときはキレイに表示されます。

教えてください。
手順として、
座標変換してMoveWindowかSetWindowPosを使うで良いのでしょうか?
座標変換は、ClientToScreenとScreenToClientどちらを使うのでしょうか?

お騒がせしてすみませんが、お願いします。

編集 削除
なな  2011-06-01 21:39:07  No: 102940  IP: [192.*.*.*]

解決しました。

ごめんなさい。

親フォームのピクチャーボックスが非表示になっていました。
子フォームをロードした後ピクチャーボックスを表示していました。

お騒がせしました。

編集 削除