תכנות WINDOWS » Youclub

Youclub – המקום שלך באינטרנט

מועדון האינטרנט החדש שלך, כתבות, סיקורים ועדכונים מעניינים

 Random header image... Refresh for more!

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   אין תגובות