Enum Window Class Styles
#1
مقدمة :احتجت قديما عندما انتهيت من برمجة Window Spy الى دالة تقوم بالحصول على ال Class Styles , لكن لضيق الوقت لم أتمكن من كتابة الدالة و خصوصا أن الاصدار مر عليه عامين و لا يزال Beta .لذلك اكتفيت بعرض القيمة التي تعيدها الدالة GetClassLong
PHP كود :
ClassStyle:=GetClassLong(WinHandle,GCL_STYLE ); 
المهم اليوم لقيت بعض الوقت و تفكرت الموضوع .. لكن للأسف فقد أضعت السورس كود ..

على كل حال لقد قمت بكتابة الدالة أملا أن أقوم بتطوير اصدار جديد من Window Spy

عليك أن تعرف عزيزي القارئ أن اسناد أكثر من ستايل للكلاس يتم عن طريق استخدام تعليمة الجمع المنطقي OR
إقتباس ::From MSDN
Class Styles
The class styles define additional elements of the window class. Two or more styles can be combined by using the bitwise OR (|) operator. To assign a style to a window class, assign the style to the style member of the WNDCLASSEX structure. For a list of class styles, see Window Class Styles.
[COLOR="Red"]مثال :
[/COLOR]
PHP كود :
var wc: TWndClass;
begin
wc
.Style:= CS_VREDRAW or CS_HREDRAW;
end; 
تعليمة OR هي تعليمة جمع منطقية , من خصائصها :

PHP كود :
a or a = a // 8 or 8=8
//***********************
b = a or c or d
x 
= b or c // => x = b
(*
ex :
b = 8 or 6 or 2 // => b= 14
x = b or 6 // x=b=14
*)
//********************* 
باستغلالها قمت بكتابة هذه الدالة البسيطة لعمل Enum ل Window Class Styles
PHP كود :
procedure EnumClassStyles(ClassStyle :integer; out sClass_Styles_List : TStringList);
 
// By SMP3
const VClassStyles:array [0..11]of integer =(CS_BYTEALIGNCLIENT,CS_BYTEALIGNWINDOW
 
,CS_CLASSDC,CS_DBLCLKS,
 
CS_DROPSHADOW,CS_GLOBALCLASS
 
,CS_HREDRAW,CS_NOCLOSE,CS_OWNDC
 
,CS_PARENTDC,CS_SAVEBITS,
 
CS_VREDRAW);

SClassStyles:array [0..11]of string =('CS_BYTEALIGNCLIENT','CS_BYTEALIGNWINDOW',
 
'CS_CLASSDC','CS_DBLCLKS',
 
'CS_DROPSHADOW','CS_GLOBALCLASS',
 
'CS_HREDRAW','CS_NOCLOSE','CS_OWNDC',
 
'CS_PARENTDC','CS_SAVEBITS',
 
'CS_VREDRAW');
var
 
TempClassStyles:integer;
 
i:integer;
begin

if not assigned(sClass_Styles_List) then
 sClass_Styles_List
:=TStringList.Create;

TempClassStyles:=ClassStyle;

for 
i := 0 to 11 do begin
 
if(ClassStyle or VClassStyles[i])=TempClassStyles then
 sClass_Styles_List
.Add(SClassStyles[i])

end; 

استعمال الاجراء :

PHP كود :
var
ClassStyle:integer;
sList:TStringList;
WinHandle:HWND;
begin

sList
:=nil;
sList:=TStringList.Create;
WinHandle:=Handle; // $00050B7A ;
self.WinHandleEdit.Text :=IntToHex(WinHandle,8);
ClassStyle:=GetClassLong(WinHandle,GCL_STYLE );
self.ClassStyleEdit.Text :=IntToHex(ClassStyle,8);

EnumClassStyles(ClassStyle,sList);
self.ClassStylesListBox.Items:=sList ;
sList.Free ;

end; 
كود :
http://delphinews.files.wordpress.com/2012/10/enum-window-class-styles.png
الرد
#2
إقتباس : تعليمة جمع منطقية

معذرة اخى ولكن ياريت شرح اكثر عن منطقية الجمع or
ما هو المنطقى الثابت
كود :
b := 2 or 0 = 2 b := 2 or 1 = 3 b := 2 or 2 = 2 b := 2 or 3 = 3 b := 2 or 4 = 6 b := 2 or 5 = 7 b := 2 or 6 = 6 b := 2 or 7 = 7 b := 2 or 8 = 10 b := 2 or 9 = 11 b := 2 or 10 = 10
> مبرمج مبتدئ < سبحان الله بحمده... سبحان الله العظيم
الرد
#3
الـ OR عملية جمع منطقية , وتكون دائماً على معدل البتات أي بنظام العد الثنائي (Binary) .

فملاُ إذا أردنا عمل جمع في 8 + 6 + 2 تكتب بالصيغة التالية :
PHP كود :
14 = 8 or 6 or 2 
في نظرك هذه أعداد صحيحة ولكن في نظر المعالج هذه أعداد ثنائية ويراها بهذا الشكل :
PHP كود :
0x1110 = 0x1000 or 0x110 or 0x10 

وعندما نعرف جدول المنطق لدى التعليمة OR سنعرف كيف تم حسابها .
هذا هو الجدول المنطقي الخاص بـ OR :
PHP كود :
0 or 0 = 0
    0 
or 1 = 1
    1 
or 1 = 1
    1 
or 0 = 1 
كذلك يجب أن تعرف أن الرمز | يمثل التعليمة OR , أي أنهما متساويين في المعنى .
أقراء أساسيات لغة باسكال لكي تفهم هذه الأساسيات
يمكنك إجاد أساسيات الباسكال هنا بشكل مبسط :
كود :
http://www.pilotlogic.com/sitejoom/index.php/wiki?id=162
بالتوفيق
الرد


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


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