01-01-2013, 10:38 PM
و عليكم السلام
الطريقة جد سهلة و لا تحتاج الى عمالقة
نبدأ :
أولا عليك تصميم كلاس منبثق من TCustomControl
عدل على الستايل من خلال عمل override ل CreateParams و جعل الستايل WS_POPUP (لأن الكونترول ليس جزءا من الفورم يعني لن تحتاج الى خاصية parent لاظهار الكونترول)
ثانيا يجب عليك الحصول على مقبض التاسك بار TaskBar
ثم مقبض الأب(TrayNotifyWnd) لنافذة الوقت
وأخيرا مقبض نافذة الوقت TrayClockWClass
بعدها نحصل على موقعها باستخدام الدالة GetWindowRect
ثم حساب العرض و الطول و اسنادهما للكونترول الخاص بك
ثالثا تقوم بالرسم على الكونترول من خلال paint
هذا كل مافي الأمر
clockwindow.jpg (الحجم : 4.93 ك ب / التحميلات : 85)
هذا مثال على السريع
الطريقة جد سهلة و لا تحتاج الى عمالقة

نبدأ :
أولا عليك تصميم كلاس منبثق من TCustomControl
عدل على الستايل من خلال عمل override ل CreateParams و جعل الستايل WS_POPUP (لأن الكونترول ليس جزءا من الفورم يعني لن تحتاج الى خاصية parent لاظهار الكونترول)
ثانيا يجب عليك الحصول على مقبض التاسك بار TaskBar
ثم مقبض الأب(TrayNotifyWnd) لنافذة الوقت
وأخيرا مقبض نافذة الوقت TrayClockWClass
بعدها نحصل على موقعها باستخدام الدالة GetWindowRect
ثم حساب العرض و الطول و اسنادهما للكونترول الخاص بك
ثالثا تقوم بالرسم على الكونترول من خلال paint
هذا كل مافي الأمر
clockwindow.jpg (الحجم : 4.93 ك ب / التحميلات : 85)
هذا مثال على السريع

PHP كود :
type TClockWindow =class(TCustomControl)
//By SMP3 .
private
ClockWinRect :TRect;
protected
procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
procedure CreateParams(var Params: TCreateParams); override;
procedure Paint;override;
public
procedure ShowClock();
procedure HideClock();
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Color;
property Font;
end;
{ TClockWindow }
constructor TClockWindow.Create(AOwner: TComponent);
var TrayClockWClassHandle :HWND;
begin
inherited;
Color :=clWhite;
TrayClockWClassHandle:=FindWindow('Shell_TrayWnd',0);//TaskBar Handle
TrayClockWClassHandle:=FindWindowEx(TrayClockWClassHandle,0,'TrayNotifyWnd',0);//Parent Clock Handle
TrayClockWClassHandle:=FindWindowEx(TrayClockWClassHandle,0,'TrayClockWClass',0);// Final Clock Handle
GetWindowRect(TrayClockWClassHandle,ClockWinRect );
with ClockWinRect do
begin
Width :=Right - Left;
Height :=Bottom - Top ;
end;
Left := ClockWinRect.Left;
Top:=ClockWinRect.Top;
end;
procedure TClockWindow.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style:=WS_POPUP;// Since it is not a part of your Form
// it does not requires Parent propretie
end;
destructor TClockWindow.Destroy;
begin
inherited;
end;
procedure TClockWindow.HideClock;
begin
HandleNeeded;
SetWindowPos(Handle, HWND_TOPMOST, Left , Top , Width, Height,
SWP_HIDEWINDOW or SWP_NOACTIVATE);
end;
procedure TClockWindow.Paint;
var R:TRect ;
Text:String;
begin
// Get Curent Time
Text :=FormatDateTime('hh:mm', Time);
Canvas.Brush.Color := Color;
Canvas.FillRect(ClientRect);
Canvas.Brush.Color :=ClBlack;
R:=ClientRect;
// Set Canvas background color to Transparent
SetBkMode(Canvas.Handle,TransParent);
Canvas.Font:=Font;
// Draw and Center Text
DrawText(Canvas.Handle,{$IFDEF UNICODE}Text {$ELSE} PAnsiChar (Text){$ENDIF},Length(Text),R, DT_SINGLELINE or DT_VCENTER or DT_CENTER);
end;
procedure TClockWindow.ShowClock;
begin
HandleNeeded ;
SetWindowPos(Handle, HWND_TOPMOST, Left , Top , Width, Height,
SWP_SHOWWINDOW or SWP_NOACTIVATE);
end;
procedure TClockWindow.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
Message.Result:=1;
end;

