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 wcTWndClass;
begin
wc
.Style:= CS_VREDRAW or CS_HREDRAW;
end
تعليمة OR هي تعليمة جمع منطقية , من خصائصها :

PHP كود :
or // 8 or 8=8
//***********************
or or d
or // => x = b
(*
ex :
or or // => b= 14
or // x=b=14
*)
//********************* 
باستغلالها قمت بكتابة هذه الدالة البسيطة لعمل Enum ل Window Class Styles
PHP كود :
procedure EnumClassStyles(ClassStyle :integerout 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_Listthen
 sClass_Styles_List
:=TStringList.Create;

TempClassStyles:=ClassStyle;

for 
:= 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 or or 
في نظرك هذه أعداد صحيحة ولكن في نظر المعالج هذه أعداد ثنائية ويراها بهذا الشكل :
PHP كود :
0x1110 0x1000 or 0x110 or 0x10 

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


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


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