delphi4arab منتديات دلفي للعرب

نسخة كاملة : تغيير شكل الساعة
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
السلام عليكم

كيف يتم تغيير شكل الساعة كما هو في برنامج Tray clock وكما في الصورة :
كود :
http://www6.0zz0.com/2011/09/08/06/460690989.jpg
وشكراً
السلام عليكم

هل تم تصميم البرنامج بالدلفي فعلا... حتى نبحث عن المكون المستخدم أو الملف المصدري للبرنامج؟
عموما يمكنك تفكيك السؤال حتى تتمكن بنفسك تدريجيا من إنشاء برامج مشابهة أو أفضل من ذلك
نعم البرنامج مصمم بدلفي ولم استطع تحريره
قمت فقط بتحرير الواجهة وخصائصها ، أما الأوامر لا
و عليكم السلام
الطريقة جد سهلة و لا تحتاج الى عمالقة Smile
نبدأ :
أولا عليك تصميم كلاس منبثق من TCustomControl
عدل على الستايل من خلال عمل override ل CreateParams و جعل الستايل WS_POPUP (لأن الكونترول ليس جزءا من الفورم يعني لن تحتاج الى خاصية parent لاظهار الكونترول)
ثانيا يجب عليك الحصول على مقبض التاسك بار TaskBar
ثم مقبض الأب(TrayNotifyWnd) لنافذة الوقت
وأخيرا مقبض نافذة الوقت TrayClockWClass
بعدها نحصل على موقعها باستخدام الدالة GetWindowRect
ثم حساب العرض و الطول و اسنادهما للكونترول الخاص بك
ثالثا تقوم بالرسم على الكونترول من خلال paint
هذا كل مافي الأمر
[attachment=2429]
هذا مثال على السريع Smile
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; 
Smp3 عمل ممتاز جعلت الكلاس في وحدة :p
s.fateh كتب :smp3 عمل ممتاز جعلت الكلاس في وحدة :p

جميل .. لكن ليس هناك داعي لاستخدامها في وحدة منفصلة لأن الكلاس صغير و لا يحتوي على دوال كثيرة :d
طبعا الكلاس صغير لكن جعله في وحدة منفصلة افضل سهل للقراءة و اسهل للتطوير ...
S.FATEH كتب :طبعا الكلاس صغير ...

معك حق Big Grin .. كل المسألة هي مسألة كسل لا غير Cool
أختار ملف ثم وحدة جديدة ثم تسمية الوحدة و حفظها ثم اضافة الوحدات المستعملة للوحدة .. هههه الطريقة طويلة نوعا ما Big Grin
السلام عليكم

البرنامج عبارة فقط عن فورم في مكان الساعة وليس بالجديد
كما في الصورة
[attachment=2431]
ع بلال كتب :السلام عليكم

البرنامج عبارة فقط عن فورم في مكان الساعة وليس بالجديد
كما في الصورة
460690989.jpg

كيف ليس بالجديد !! ماهو الجديد برأيك ؟

هناك طريقة أخرى معقدة تعتمد على استخراج ال wndproc الخاص ب TrayClockWClass ثم تحويله الى
wndproc الخاص بك ومن ثم اقتناص رسائل الوينداوز واعادة الرسم
الطريقة ممكن تسبب مشاكل لانه عند تحويل ال wndproc الوينداوز سيكمل ارسائل الرسائل لل wndproc القديم و التي لن تعالج ... مما قد يتسبب في انهيار للنظام .. لكن تظل مجرد احتمال
لاني جربت تغيير ال wndproc الخاص ب TPanel لبرنامج خارجي و قد استطعت اعادة رسمه بدون مشاكل
الصفحات : 1 2