常にForm1の手前にForm2を表示したい。

解決


よっさん  2006-11-14 04:16:13  No: 23902

レイヤードウインドウを使い文字だけを表示し、他を透過させるプログラムを作成しているのですが、文字以外の部分をマウスでクリックすることが出来なくなります。
そこで、そのウインドウの下にアルファ値1のウインドウを置いてマウスの処理をさせたいと思いました。

Form1の移動をWM_MOVEで検出しForm1をForm2の裏にするように

procedure TForm1.WMMove(var Msg: TWMMove);
begin
    // とりあえず、Form2の移動は記述していません
    if Assigned(Form2) then
        SetWindowPos(Handle, Form2.Handle, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
end;

と記述し、確かに移動時はForm2の裏に表示されるのですがマウスのボタンを上げるとForm1がForm2の上に表示されてしまいました。

また、WM_WINDOWPOSCHANGINGで下記のようにForm2を前にもってこようとしたのですが、効果がありませんでした。

procedure TForm1.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
begin
    if Assigned(Form2) then
        Msg.WindowPos^.hwndInsertAfter:=Form2.Handle;
end;

常にForm1の手前にForm2を表示する方法はありますでしょうか?
開発環境は、
Windows XP SP2
Delphi6 Personal
です。

参考にしたページ
http://www.sutosoft.com/room/archives/000035.html


かみづ  2006-11-14 08:27:22  No: 23903

Owned Windowを使用すると、Form2を常に特定のウィンドウ
の手前に表示するようにできます。

方法ですがTForm2のCreateParamsをオーバライドして、
Params.WndParentにForm1のハンドルを与えてあげると、
Form2はOwned Windowになります。


よっさん  2006-11-14 09:02:30  No: 23904

かみづさんありがとうございました。
おかげさまで1週間悩んでいたことが解決されました。
感謝感激です^^


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

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






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