お疲れ様です。
ひとつ皆さんの案をお聞かせください。
フォームを用意し、その上にページコントロールを配置
DockSite=True とする。
このページコントロールに対して別のexe(メモ帳などや別に作成したexe)を
ドッキングさせる。
以上のようなことは出来るでしょうか?
ちなみに同一Exe内のフォームのドッキングは manualDockで動作
させることが出来、満足ゆく動作ができました。
SetParent APIを使えばできます。
メモ帳などのタイトルバーが不要ならSetWindowLong APIを使ってタイトルバーを無しにします。
サイズの調整はSetWindowPos APIをSWP_NOACTIVATEオプションを指定して使います。
こんな感じで。
private
{ Private 宣言 }
F_hWindow: HWND;
procedure TForm1.Button1Click(Sender: TObject);
var
li_Style: Longint;
begin
F_hWindow := FindWindow('Notepad', nil);
if (F_hWindow <> 0) then begin
Windows.SetParent(F_hWindow, TabSheet1.Handle);
//タイトルバーを無しに
li_Style := GetWindowLong(F_hWindow, GWL_STYLE);
if ((li_Style and WS_CAPTION) <> 0) then Dec(li_Style, WS_CAPTION);
if ((li_Style and WS_THICKFRAME) <> 0) then Dec(li_Style, WS_THICKFRAME);
SetWindowLong(F_hWindow, GWL_STYLE, li_Style);
PageControl1Resize(nil);
end;
end;
procedure TForm1.PageControl1Resize(Sender: TObject);
begin
if (F_hWindow <> 0) then begin
//メモ帳のサイズをタブシートに合わせる
SetWindowPos(F_hWindow, 0, 0, 0, TabSheet1.ClientWidth, TabSheet1.ClientHeight, SWP_NOACTIVATE);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
li_Style: Longint;
begin
//メモ帳を元に戻す
if (F_hWindow <> 0) then begin
//タイトルバーを元に戻す
li_Style := GetWindowLong(F_hWindow, GWL_STYLE);
li_Style := li_Style or WS_CAPTION or WS_THICKFRAME;
SetWindowLong(F_hWindow, GWL_STYLE, li_Style);
Windows.SetParent(F_hWindow, GetDesktopWindow);
end;
F_hWindow := 0;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if (F_hWindow <> 0) then begin
Button2Click(nil);
end;
end;
回答ありがとうございます、今は出先で環境がないので
今夜辺りになってしまいますが戻り次第ためさせていただきます。
かげで世界がぐんと広がりそうです。
ありがとうございます。
お疲れ様です、試してみました。
ばっちりドッキングしてくれますね、なんだか感動します。
これは直接親を指定しているので、これを元に
メモ帳>フォーム>ページコントロール の順でドッキングを目指して
見ます。
ありがとうございました。
ツイート | ![]() |