مشروع : TThemedSysControls VCL Style
#1
السلام عليكم و رحمة الله و بركاته

انتهيت للتو من مشروع كنت قد بدأته منذ أسبوع TThemedSysControls
على غرار مكونات المكونات التجارية Alpha Skin , BusinessSkinForm , تعد ال VCL Style من أفضلهم ..
لكون أن أحداث و رسائل النظام ترسل بطريقة مرنة غير عشوائية ..
لكن مع الأسف مكونات VCL Style لا تدعم المكونات القياسية الخاصة بالنظام :
System Menu , PopupMenu, OpenDialog,SaveDialog,ColorDialog,FontDialog,PrintDialog,FindDialog,ReplaceDialog,PageSetupDialog,MessageBox , ... و القائمة طويلة ..

[صورة: CJyBZ.png]
كود :
http://im37.gulfup.com/dDS4k.png

السبب في عدم دعم هذه المكونات هو أن جميع هذه المكونات يتدخل النظام في رسمها , ومحاولة التعديل عليها صعبة للغاية تتطلب فهم عميق لأغلب رسائل النظام ومتى يتم ارسالها و متى لا يتم ارسالها ..
اضافة الى ذلك مايكروسوفت جعلت من الأمر شبه مستحيل للتعديل على بعض المكونات , مثل المكون PopupMenu : كل شيئ مبهم حول هذا المكون حتى الرسائل التي يرسلها النظام للمكون غير موثقة لدى موقع المطورين MSDN (Undocumented Windows Messages) .

TThemedSysControls : مشروع لدعم كل هذه النقائص , و جعل مكونات النظام متناسقة مع مظهر ال VCL Style .
لا أخفيكم الأمر : لقد حدث صدفتا , كيف و لماذا ؟ شخصيا لا أدري !!
لقد بدأ الأمر بمحاولتي لتغيير شكل ال PopupMenu .. عندما لاحظت أن المقبض الذي حصلت عليه من الدالة GetMenu مختلف عن الذي حصلت عليه باستخدام Window Spy .
سرعان ما استنتجت أن الوينداوز يقوم بعمل نسخة عن المقبض الحقيقي , هذه النسخة لن تفيد في شيئ ان أردنا التعديل على مظهر المكون .
لوهلة اعتقدت أن الامر مستحيل , خصوصا عندما أيقنت أن مكون PopupActionBar مطور من الصفر !!
بورلاند قامت بتطوير مكون PopupActionBar من الصفر عوضا عن اشتقاقه من PopupMenu , و السبب يعود لتجاوز كل العقبات الخاصة ب PopupMenu .
فكرت في أن أعمل Clone لمكون PopupMenu واستبداله ب المكون PopupActionBar الذي يدعم ال VCL Style , لكن الصدفة تلعب دور كبير : صدفتا باطلاعي على سؤال احد السائلين الذي يريد أن يقوم بتطبيق هووك على رسائل النظام ..وجدت أنه يمكن الوصول للمقبض الحقيقي لل PopupMenu بتطبيق هووك على رسائل النظام ..
ثم كل ماحدث أني قمت بتغيير ال WndProc الخاص ب PopupMenu الى ال WndProc الخاص بي ..
استطعت الرسم على المكون من دون جعله OwnerDraw .. لكن الأمر لم ينتهي بعد : العديد و العديد من الغموض حول رسائل المكون , بحثت في النت ووجدت بعض الرسائل لكن بدون أي شروحات لماهية هذه الرسائل : قمت بعمل تحليل عميق لهذه الرسائل ثم قمت باعادة رسمه من الصفر ..
عند عمل الهووك استطعلت الولوج الى جميع ال PopupMenu الخاصة بالتطبيق (System Menu, Edit Popup Menu ,...) .
لكن المشكلة كانت مع TMenu & OwnerDraw : ان كان ال PopupMenu OwnerDraw لن تستطيع الحصول على Caption الخاصة ب ال Item . شكلت المشكلة تعقيدا كبيرا لي , الى غاية أن قمت بحلها بتطبيق هووك Hook على الدالة InsertMenuItem ..
عندما أنهيت العمل و حصلت على PopupMenu داعم لل VCL Style , توجهت أنظاري لدعم باقي المكونات ..
بنفس الطريقة : بعمل هووك على رسائل النظام و اقتناص الحدث Create للمكونات استطعت تغيير ال
WndProc ثم اعادة رسم المكون النستهدف ..

الآلية المستخدمة بسيطة :
-تنصيب هووك على رسائل النظام WH_CBT
- اقتناص الرسالة HCBT_CREATEWND التي تدل على أن مكون جديد تم انشائه .
- مقارنة كلاس المكون (Button , Edit , ...)
- تغيير ال WndProc الافتراضي الخاص بالمكون الى WndProc الخاص بي عن طريق الدالة SetWindowLongPtr
-اقتناص الرسائل المتعلقة بالرسم WM_PAINT , WM_PRINT , ..
-اعادة رسم المكون
-نداء ال WndProc الافتراضي (الأصلي).


الكلاسات المستخدمة في المشروع :
TControlWnd : الركيزة الأساسية لكل كلاس : جميع الكلاسات مشتقة من هذا الكلاس ماعدا الكلاس TPopupWnd & TThemedSysControls . الكلاس مسؤول عن تغيير ال WndProc و الحصول على بعض المعلومات حول المكون (العرض , الطول , المقبض , ...)
TEditWnd : مسؤول عن رسم مكون Edit .
TComboBoxWnd : مسؤول عن رسم مكون ComboBox .
TButtonWnd : مسؤول عن رسم Button , RadioButton , GroupeBox,CheckBox .
TPopupWnd : مسؤول عن رسم ال PopupMenu .
TDialogWnd : مسؤول عن رسم جميع النوافذ OpenDialog,ColorDialog,MessageBox , ...
TThemedSysControls : الكلاس المسؤول عن الهووك .

المكونات المدعومة :
- TMenu
- TPopupMenu
- System Menu
- TEdit PopupMenu
- MessageBox
- VCL Error Message
All Dialog :
- TFontDialog
- TColorDialog
- TSaveDialog
- TPrintDialog
- TReplaceDialog
- TFindDialog
- TTaskDialog
- TPageSetupDialog
- ......
- ......


لمن يريد المساهمة في المشروع : لاعادة رسم أي مكون يتوجب أن تقوم بالتوريث من الكلاس TControlWnd .

استخدام المكون TThemedSysControls :
لدعم مكونات النظام في برنامجك ستحتاج الى كتابة سطرين فقط :
PHP كود :
var
  
ThemedSysControls: TThemedSysControls;
procedure TMain.FormCreate(Sender: TObject);
begin
   ThemedSysControls 
:= TThemedSysControls.Create(Self);
end;

procedure TMain.FormDestroy(Sender: TObject);
begin
if Assigned(ThemedSysControls) then
  ThemedSysControls
.Free;
end; 


[صورة: 84TV7.png]

[صورة: 35wG8.png]

[صورة: 8LLoq.png]

[صورة: L9389.png]

TODO :
Skin SpinButton
Skin ScroolBar
Support FireMonkey


Bugs :
لمن اطلع على السورس .. سيعلم أن المشروع طويل و معقد , لذلك بالتأكيد ستكون هناك أخطاء .
لم صادف أي أخطاء مع المكونات (لا أعلم ) , أرجــوا منه أن يذكر الخطأ في هذا الموضوع مع وصف دقيق وصورة ان أمكن .
لمن استطاع تحسين أي دالة من الدوال التي كتبتها فأرجــوا أن يتفضل بذكرها في هذا الموضوع .
لمن قام بدعم مكونات أخرى فأرجــوا أن يقوم بمراسلتي قبل أن يقوم بنشرها .
Download TThemedSysControls :
كود :
https://dl.dropboxusercontent.com/u/99625333/Delphi/ThemedSysControls%20V1.rar
و السلام عليكم .
Open Your Source .. Open Your Mind
#2
الوحدة uUtils : تحتوي على دوال و اجراءات مفيدة مستخدمة في كامل التطبيق .
شرح فلاشي :
كود :
https://dl.dropboxusercontent.com/u/99625333/Delphi/ThemedSysControls.swf
Open Your Source .. Open Your Mind
#3
تحديث جديد :
TThemedSysControls Update 1
PHP كود :
v1.1 (16/10/2013):
 
 New 
Unit(uStaticWnd):
  +Static 
Control is themed when its disabled .
  
 
Button (uButtonWnd Unit):
  +
BugFix : When button is down ,the button style/state does not change .
  +
BugFix : Button painted as RadioButton .
  +
Added support for SplitButton : Split Button is themed .
  +
Added focus effect to CheckBox & RadioButton
  
+Added BSFocused state to Button : button is correctly themed when its got focus .

 
Dialog (uThemedDialog Unit):
  +
BugFix:Window size is smaller than the original size .
  +
Main Icon is painted .
  
 
uControlWnd Unit:
  +
Added Enabled property .
  +
Added Focused property .
  +
Added Visible property . 
كود :
https://dl.dropboxusercontent.com/u/99625333/Delphi/ThemedSysControls%20v1.1.rar
Open Your Source .. Open Your Mind
#4
TThemedSysControls v1.5

[صورة: aOTrT.png]

كود :
v1.5 (07/11/2013) New unit uTooltipsWnd: +The Tooltip Control is themed. +HeaderSection of ListView is themed as hot when mouse is on it . +BugFix : Clicking on CloseButton does not close the Window . v1.4 (31/10/2013) + The Header of SysListView32 control is themed . + BugFix : when clicking on Column , background color change . + BugFix: The white bakground color that apear when combobox has an edit control . v1.3 (26/10/2013): New unit uScrollBarWnd New unit uNativeScrollBar +ScrollBar is themed. v1.2 (20/10/2013): New unit uSysListView32Wnd : +SysListView32 control is themed . New unit uToolbarWindow32Wnd : +ToolbarWindow32 control is themed. PopupMenu: +Add support to Menu item icon (icons are painted if you use a Vcl Menu control (TMenu)). +BugFix : If Menu is a Vcl control (TMenu) then , in some situation the item text will not painted correctly. +BugFix : ItemDiasabled in some situation is draw as normal item . +BugFix : If PopupMenu is droped from MainMenu , the first item is highlighted. +BugFix : if item was selected using mouse then reselected using keyboard , the item does not appears hot. v1.1 (16/10/2013): New Unit(uStaticWnd): +Static Control is themed when its disabled . Button (uButtonWnd Unit): +BugFix : When button is down ,the button style/state does not change . +BugFix : Button painted as RadioButton . +Added support for SplitButton : Split Button is themed . +Added focus effect to CheckBox & RadioButton +Added BSFocused state to Button : button is correctly themed when its got focus . Dialog (uThemedDialog Unit): +BugFix:Window size is smaller than the original size . +Main Icon is painted . uControlWnd Unit: +Added Enabled property . +Added Focused property . +Added Visible property .

[COLOR="Red"]Download TThemedSysControls v1.5
[/COLOR]
كود :
https://dl.dropboxusercontent.com/u/99625333/Delphi/ThemedSysControls%20v1.5.rar
Open Your Source .. Open Your Mind
#5
إقتباس :انتهيت للتو من مشروع كنت قد بدأته منذ أسبوع TThemedSysControls
على غرار مكونات المكونات التجارية Alpha Skin , BusinessSkinForm , تعد ال VCL Style من أفضلهم ..

تشكر على هذا المجهود ولكن الـ VCL لا اعتقد هي خير من BusinessSkinForm
اننا نتكلم عن 120 كومبوننت ودقة شديدة في رسم السكين والاهتمام بكل التفاصيل الصغيرة قبل الكبيرة
بينما الـ VCL واضح تماماً انها لا تهتم بالتفاصيل ورسمها للمكونات سيئ نوعاً ما
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
#6
Delphi4Us كتب :تشكر على هذا المجهود ولكن الـ VCL لا اعتقد هي خير من BusinessSkinForm
اننا نتكلم عن 120 كومبوننت ودقة شديدة في رسم السكين والاهتمام بكل التفاصيل الصغيرة قبل الكبيرة
بينما الـ VCL واضح تماماً انها لا تهتم بالتفاصيل ورسمها للمكونات سيئ نوعاً ما
أختلف معك أخي ..
ال VCL Style مبنية بنفس بنية ال Win Style الخاص بمايكروسوفت ..
اضافة الى أن رسائل النظام ترسل بطريقة سلسة .. على عكس المكونات الأخرى ..
ال BSF لا تدعم المكونات المنشئة من قبل النظام مثل ال OPENDIALOG ..
لقد تعمقت مع ال VCL Style .. وثبت لي أنها حاليا من أفضل الوسائل لعمل السكين ..
صحيح أن بها بعض الأخطاء و تدعم فقط المكونات القياسية التي تأتي مع دلفي .. لكنها مرنة جدا مقارنة بالمكونات الاخرى المتاحة .
في الأخير يبقى الأمر راجع للمبرمج ..في أن يختار المكون الذي يلائمه و يلبي احتياجاته ..
Open Your Source .. Open Your Mind
#7
عمل جبار اخي تشكر عليه
ليس لي اطلاع في هدا مجال لاكني ساحوال فهم الامور اولا حتى اكون في صورة ^^
.:: مبرمج شوارع ::.
#8
آه .. كنت أعتقد أني كتبت هذا الرد من قبل !!!
على كل حال :
المشروع تم دمجه مع مشروع VCL Styles Utils لصاحبه Rodrigo ..
المشروع تجدونه على Google Code :
كود :
https://code.google.com/p/vcl-styles-utils/
أرجــوا من يستخدم المشروع أن يقوم بتحديثه الى آخر نسخة لأننا قمنا بتصحيح العديد من الأخطاء و اضافة العديد من المزايا الجديدة .
Open Your Source .. Open Your Mind
#9
إقتباس :المشروع تجدونه على Google Code :
السلام عليكم
لما لا تضيفون تبويب للتحميل لمن لا يعرف استخدام Subversion
#10
B.M.AbdelAziZ كتب :السلام عليكم
لما لا تضيفون تبويب للتحميل لمن لا يعرف استخدام Subversion

حاليا الأمر غير ممكن .. لعدة أسباب :
- المشروع موجه بالدرجة الأولى الى فئة المبرمجين .
- المشروع نشط , سنحتاج الى كل مرة الى انشاء روابط جديدة لكل تعديل
- سرعة النت لا تسمح لي .. بل حتى في بعض الأحيان لا أستطيع عمل commit , بدل ذلك أقوم بارسال التعديل الى صاحب المشروع ليقوم باضافته .. أنت أدرى بسرعة النت في الجزائر .
Open Your Source .. Open Your Mind


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


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