Windows Sublcassing חלק ב'
בהמשך למאמר הקודם, במאמר זה אציג את הטכניקה הידועה בשם global subclassing.טכניקה זו הינה טכניקה רבת שימוש אשר נפוצה פחות מהטכניקה הקודמת כתוצאה מההשלכות שלה על תפקוד האפליקציה.
אז ללא הקדמות מיותרות,קוד המדגים את הטכניקה הנ"ל מצוי בקובץ החיצוני הזה.
כמו שאתם רואים אין כמעט שינויים בקוד.
השינוי העיקרי הוא העובדה שהשתמשנו בפונקציה SetClassLong במקום בפונקצייה SetWindowLong.
הפונקצייה מקבלת כפרמטר חלון מסוג edit, ולאחר שעשינו לו subclass מעתה והלאה כל חלון מהסוג edit אשר יווצר יכיל את הפרוצדורה החדשה.
על מנת לבטל את הsubclassing מעבירים לפונקציה כפרמטר את הפונקציה הקודמת.
(g_oldproc).
דברי סיום:
בכתבה זו, למדנו על שני דרכים בעזרת ניתן to subclass windows, הטכניקה הזו הינה רבת עוצמה, וניתן לעשות איתה המון.
החל מmonitor לחלון מסויים, עד לשינוי ההתנהגות שלו כולה.
בהמשך למאמר הקודם במאמר זה אציג את הטכניקה הידועה בשם Global Subclassing.
מידע נוסף על הטכניקה ניתן למצוא בחיפוש בMSDN.
9 בינואר 2010 אין תגובות
Windows Subclassing חלק א'
הקדמה:
windows subclassing זו טכניקה המאפשרת לאפליקציה מסויימת "להשתלט" על ההודעות של חלון מסויים ולטפל בהם באופן מסויים. במילים אחרות להחליף את הפרוצדורה של החלון. ראשית כל נשאלת השאלה, למה יש צורך בטכניקה הזו? ובכן, לעיתים נרצה שחלונות מסויימים יגיבו באופן שונה ממה שהם תוכנתו להגיב בלי לערוך את הקוד. הדוגמא הקלאסית הינה edit box אשר מקבלת רק מספרים ומתעלמת משאר התווים, בהמשך נכתוב קוד הממש זאת. קיימים שני סוגים של window subclassing. instance subclassing ו global subclassing. instance subclassing משנה את ההתנהגות של חלון ספציפי בלבד. global subclassing לעומת זאת, משנה את ההתנהגות של סוג החלון כולו במבנה WNDCLASS. מה שאומר שלאחר שבוצעה פעולת ה subclassing כל חלון שיווצר מעתה יתנהג לפי הפרוצדורה החדשה שנקבעה לו. חלונות שנוצרו לפני פעולת ה subclassing לא יכירו בפונקציה החדשה. instance subclassing: ובכן, כמו שציינתי, באופן תיאורטי כל מה שצריך לעשות הוא להחליף את הפרוצדורה של החלון בפרוצדורה אחרת. ניתן להשתמש לשם כך בפונקציה SetWindowLong. הפונקציה מקבלת שלוש פרמטרים. במקרה שלנו אנחנו צריכים להעביר כפרמטר ראשון את ה-HANDLE לחלון, כפרמטר שני את הקבוע GWL_WNDPROC וכפרמטר שלישי את הפונקציה החדשה של החלון. את הפונקציה הקודמת של החלון ניתן לשמור בתוך מצביע, במידה ונרצה להחזיר אותה אח"כ. ניתן להכניס אותה לתוך המשתנה על ידי הפונקציה GetWindowLong או להשתמש בערך המוחזר של SetWindowLong. קוד הכתוב ב-C המדגים את הטכניקה הזו, תוכלו למצוא בקובץ הזה.
הקטעים הדורשים הסבר הינם הקטעים הבאים:
g_oldproc = (WNDPROC)SetWindowLong(GetDlgItem(hwnd, IDC_EDIT1), GWL_WNDPROC, (long)NewProc);
g_oldproc זהו מצביע חיצוני לפונקצייה. הוא כעת יכיל את הפרוצדורה הישנה. NewProc זאת הפונקצייה הזאת:
LRESULT CALLBACK NewProc (HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{
switch(msg)
}
case WM_CHAR:
if(wParam!=8 && !isdigit(wParam))
return 0;
break;
}
return CallWindowProc (g_oldproc, hwnd, msg, wParam, lParam);
{
היא פונקצייה סטנדרטית של חלון. הפונקציה בודקת את ההודעות ומתייחסת אך ורק להודעה WM_CHAR. לאחר מכן הפונקציה בודקת האם הchar שהתקבל הינו מספר, והאם הוא שונה מ-8(backspace). במידה והתו אינו עונה על התנאים, הפונקציה חוזרת, אחרת, הפונקציה קוראת לפונקציה הקודמת ששמרנו מקודם שמטפלת בתו.
9 בינואר 2010 אין תגובות