0

TMainMenu を含む Delphi フォームを使用しています。特定の状況では、このフォームを別のフォーム内で親にしてクライアントに合わせて表示したいと考えています。これは正常に機能しますが、親フォームのメイン メニューは表示されません。この SO の質問に、「子ウィンドウにはメニューを表示できません」というコメントがあります。この動作をオーバーライドして TMainMenu を表示するためにできることはありますか?

余談ですが、これに気付いたのは、以前にこの原則を使用したことがある場所で、Developer Express メニュー コンポーネントを使用しており、子フォームで表示するのが非常に楽しいからです。

後で編集: 以下の TLama のコードを使用すると、これは機能します (ただし、子メニューはテーマ化されていません。私は非常に単純です): これは機能します:

procedure TForm65.FormShow(Sender: TObject);
begin
  Winapi.Windows.SetParent(ChildForm.Handle, Handle); // <<<<<<<<
  ChildForm.BorderStyle := bsNone;
  ChildForm.Align := alClient;
  ChildForm.Show;
end;

このコードは機能しません。なんで?

procedure TForm65.FormShow(Sender: TObject);
begin
  ChildForm.Parent := Self; // <<<<<<<<<
  ChildForm.BorderStyle := bsNone;
  ChildForm.Align := alClient;
  ChildForm.Show;
end;
4

1 に答える 1

3

MSDNはこれを完全に明確にしています。

子ウィンドウにはクライアント領域がありますが、明示的に要求されない限り、他の機能はありません。アプリケーションは、子ウィンドウのタイトル バー、ウィンドウ メニュー、最小化および最大化ボタン、境界線、およびスクロール バーを要求できますが、子ウィンドウにメニューを含めることはできません。

これは、Windows 自体によって描画されるメニューを指します。カスタム コンポーネントがメニュー バーを描画する場合、もちろん、それが子ウィンドウであっても、メニューを持つことができます。


を呼び出してSetParentも、ウィンドウは子ウィンドウになりません。これはドキュメントで説明されています:

互換性の理由から、SetParent は、親が変更されるウィンドウの WS_CHILD または WS_POPUP ウィンドウ スタイルを変更しません。したがって、hWndNewParent が NULL の場合は、SetParent を呼び出した後、WS_CHILD ビットもクリアし、WS_POPUP スタイルを設定する必要があります。逆に、hWndNewParent が NULL ではなく、ウィンドウが以前にデスクトップの子だった場合は、SetParent を呼び出す前に、WS_POPUP スタイルをクリアして WS_CHILD スタイルを設定する必要があります。

于 2013-05-08T12:06:55.387 に答える