2010-01-20 30 views
14

Về khuyến nghị Khu vực thông báo của Microsoft, tôi đang tìm ý tưởng hoặc thành phần Delphi để triển khai Notification Area Flyouts.Windows 7 phong cách Thông báo Flyouts trong Delphi

alt text

Ý tưởng "tự nhiên" đầu tiên là sử dụng một hình thức Delphi chuẩn, nhưng tôi đang phải đối mặt với hai vấn đề với nó:

  1. tôi không thể nhận được các hành vi biên giới dưới hình thức sử dụng thuộc tính "BorderStyle" chuẩn. Đã cố gắng "bắt chước" đường viền bằng cách sử dụng thuộc tính GlassFrame cùng với BorderStyle được đặt thành bsNone, nhưng không có GlassFrame khi không có đường viền (ít nhất, trong Delphi 2007).
  2. Tôi không thể tìm ra cách tạo biểu mẫu gần khi người dùng nhấp vào mọi nơi trong chính biểu mẫu đó. Hôm qua tôi đã cố gắng với các thông điệp khác nhau, nhưng không ai làm việc như mong đợi.

Tôi sẽ cảm ơn bất kỳ đầu mối hoặc một thành phần để làm cho nó xảy ra :)

Trân trọng.

jachguate.

ps. Có một câu hỏi liên quan trong converting notification area icon to Program icon in Win7 (Delphi).

cập nhật [0] Tôi vẫn đang tìm kiếm lời khuyên. @skamradt câu trả lời trông rất tốt, nhưng tiếc là không hoạt động tốt trong thực tế.

cập nhật [1] Cuối cùng, Hành vi tự động đóng đang hợp tác với thông điệp WM_ACTIVATE sau một SetForegroundWindog gọi để buộc flyout "kích hoạt"

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

Bây giờ, tôi đang tìm tư vấn để đạt được hành vi biên giới và phong cách trực quan, vì hành vi gần nhất đạt được với phong cách như WS_POPUP hoặc WS_DLGFRAME, trong khi mục tiêu trực quan gần nhất đạt được kiểu thiết lập là WS_POPUP hoặc WS_THICKFRAME.

+0

Cảm ơn bạn RRUZ về chuyển đổi liên kết :) – jachguate

+0

Không có vấn đề @jachguate. ;) – RRUZ

Trả lời

8

Tôi tin rằng những gì sau của bạn là như sau:

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; 

này sẽ cung cấp cho bạn một cửa sổ popup khá lớn với một khung kính. Bạn không thể di chuyển cửa sổ mà không cần lập trình bổ sung vì thiếu chú thích cửa sổ tiêu chuẩn. Khi một cửa sổ khác được lấy nét, sự kiện FormDeactivate bị kích hoạt ... nhưng chỉ khi bạn chuyển sang một biểu mẫu khác trong cùng một ứng dụng. Để xử lý nó bất kể ứng dụng đã được chuyển, sử dụng phương thức chụp tin nhắn.

+0

Cảm ơn bạn! Nó trông rất, rất tốt. Tôi không có win7 trên tay, và trong vista nó hoạt động 50% thời gian, bởi vì WM_ACTIVATE không bị sa thải trên mọi tình huống, hoặc có lẽ tôi quá mệt mỏi. Trong một vài giờ, với một số phần còn lại và Win7 trên tay tôi sẽ thực hiện một thử. Cảm ơn một lần nữa. – jachguate

+0

Cuối cùng tôi cũng nhận được máy Win7 và thử nghiệm nó, nhưng như trong vista, biểu mẫu vẫn hiển thị trong trường hợp khi các flyouts khác đóng lại. Ví dụ: nếu bạn chuyển sang ứng dụng khác chọn nút thanh tác vụ, nó sẽ chỉ đóng 50% số lần (gần đúng). Tôi đã thử một vài điều để hiểu và biểu mẫu không nhận được thông báo WM_ACTIVATE tất cả các lần. Có thể là một lỗi giành chiến thắng, nhưng chắc chắn có một giải pháp thay thế vì hệ thống flyouts (pin) hoạt động. Nếu bạn nhấp vào một biểu tượng khay khác, thì delphi frm không đóng. Tui bỏ lỡ điều gì vậy? Theo tôi thấy, ý tưởng của bạn là trong chương trình thử nghiệm của tôi. – jachguate

+0

Bạn cũng có thể móc vào sự kiện Application.OnDeactivate. Chỉ cần đặt Application.OnDeactivate thành một sự kiện thông báo cũng ẩn cửa sổ bật lên nếu nó hiển thị. Thật không may là tôi không có Vista để thử nghiệm. – skamradt

Các vấn đề liên quan