تغيير شكل الساعة
#1
السلام عليكم

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

هل تم تصميم البرنامج بالدلفي فعلا... حتى نبحث عن المكون المستخدم أو الملف المصدري للبرنامج؟
عموما يمكنك تفكيك السؤال حتى تتمكن بنفسك تدريجيا من إنشاء برامج مشابهة أو أفضل من ذلك
الرد
#3
نعم البرنامج مصمم بدلفي ولم استطع تحريره
قمت فقط بتحرير الواجهة وخصائصها ، أما الأوامر لا
 
سبحان الله وبحمده عدد خلقه ورضا نفسه وزنة عرشه ومداد كلماته
الرد
#4
و عليكم السلام
الطريقة جد سهلة و لا تحتاج الى عمالقة 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; 


الملفات المرفقة
.rar   TClockWindow.rar (الحجم : 162.53 ك ب / التحميلات : 75)
الرد
#5
Smp3 عمل ممتاز جعلت الكلاس في وحدة :p


الملفات المرفقة
.rar   TClockWindow.rar (الحجم : 15.16 ك ب / التحميلات : 30)
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
الرد
#6
s.fateh كتب :smp3 عمل ممتاز جعلت الكلاس في وحدة :p

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

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

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

.jpg   460690989.jpg (الحجم : 7.21 ك ب / التحميلات : 81)
 
سبحان الله وبحمده عدد خلقه ورضا نفسه وزنة عرشه ومداد كلماته
الرد
#10
ع بلال كتب :السلام عليكم

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

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

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


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم