17

Microsoftによる通知領域の推奨事項に関して、通知領域フライアウトを実装するためのアイデアまたはDelphiコンポーネントを探しています。

代替テキスト

最初の「自然な」アイデアは、標準のDelphiフォームを使用することですが、私は2つの問題に直面しています。

  1. 標準の「BorderStyle」プロパティを使用してフォームの境界線の動作を取得できません。GlassFrameプロパティとbsNoneに設定されたBorderStyleを使用して境界線を「模倣」しようとしましたが、境界線がない場合はGlassFrameはありません(少なくともDelphi 2007では)。
  2. ユーザーがフォーム自体のどこかをクリックしたときにフォームを閉じる方法がわかりません。昨日は別のメッセージを試していましたが、期待どおりに機能する人は誰もいませんでした。

私はそれを実現するための手がかりやコンポーネントに感謝します:)

よろしくお願いします。

jachguate。

ps。Win7(Delphi)で通知領域アイコンをプログラムアイコンに変換する際に関連する質問があります。

update[0] 私はまだアドバイスを探しています。@skamradtの回答は非常に良さそうですが、残念ながら実際にはうまく機能しません。

update [1] 最後に、自動クローズ動作は、SetForegroundWindogを呼び出してフライアウトを強制的に「アクティブ化」した後、WM_ACTIVATEメッセージで機能します。

begin
  FlyoutForm.Show;
  SetForegroundWindow(FlyoutForm.Handle);
end;

今、私は境界の振る舞いと視覚的なスタイルに到達するためのアドバイスを探しています。なぜなら、最も近い振る舞いはWS_POPUPまたはWS_DLGFRAMEとしてのスタイルで達成され、最も近い視覚的な目標はWS_POPUPまたはWS_THICKFRAMEとしてのスタイルの設定で達成されるからです。

4

1 に答える 1

9

あなたのその後は次のとおりだと思います:

TForm1 = class(TForm)
  :
protected
  procedure CreateParams(var Params: TCreateParams); override;
  procedure WMActivate(Var msg:tMessage); message WM_ACTIVATE;
end;

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := WS_POPUP or WS_THICKFRAME;
end;

procedure TForm4.WMActivate(var msg: tMessage);
begin
  if Msg.WParam = WA_INACTIVE then
    Hide; // or close
end;

これにより、ガラス フレームの大きなポップアップ ウィンドウが表示されます。標準のウィンドウ キャプションがないため、追加のプログラミングなしではウィンドウを移動できません。別のウィンドウがフォーカスされると、FormDeactivate イベントが発生します...ただし、同じアプリケーション内の別のフォームに切り替えた場合のみです。アプリケーションの切り替えに関係なく処理するには、メッセージ キャプチャ メソッドを使用します。

于 2010-01-21T00:06:53.910 に答える