delphi4arab منتديات دلفي للعرب
تغيير شكل الساعة - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : تغيير شكل الساعة (/showthread.php?tid=4815)

الصفحات: 1 2


تغيير شكل الساعة - ع بلال - 27-12-2012

السلام عليكم

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


تغيير شكل الساعة - you_per7 - 31-12-2012

السلام عليكم

هل تم تصميم البرنامج بالدلفي فعلا... حتى نبحث عن المكون المستخدم أو الملف المصدري للبرنامج؟
عموما يمكنك تفكيك السؤال حتى تتمكن بنفسك تدريجيا من إنشاء برامج مشابهة أو أفضل من ذلك


تغيير شكل الساعة - ع بلال - 01-01-2013

نعم البرنامج مصمم بدلفي ولم استطع تحريره
قمت فقط بتحرير الواجهة وخصائصها ، أما الأوامر لا


تغيير شكل الساعة - SMP3 - 01-01-2013

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

.jpg   clockwindow.jpg (الحجم : 4.93 ك ب / التحميلات : 85)
هذا مثال على السريع 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; 



تغيير شكل الساعة - S.FATEH - 02-01-2013

Smp3 عمل ممتاز جعلت الكلاس في وحدة :p


تغيير شكل الساعة - SMP3 - 02-01-2013

s.fateh كتب :smp3 عمل ممتاز جعلت الكلاس في وحدة :p

جميل .. لكن ليس هناك داعي لاستخدامها في وحدة منفصلة لأن الكلاس صغير و لا يحتوي على دوال كثيرة :d


تغيير شكل الساعة - S.FATEH - 02-01-2013

طبعا الكلاس صغير لكن جعله في وحدة منفصلة افضل سهل للقراءة و اسهل للتطوير ...


تغيير شكل الساعة - SMP3 - 02-01-2013

S.FATEH كتب :طبعا الكلاس صغير ...

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


تغيير شكل الساعة - ع بلال - 03-01-2013

السلام عليكم

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

.jpg   460690989.jpg (الحجم : 7.21 ك ب / التحميلات : 81)


تغيير شكل الساعة - SMP3 - 03-01-2013

ع بلال كتب :السلام عليكم

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

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

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