
הטקסט המלא של הדקות הראשונות בהרצאה «שגרת החלון» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
טוב, אז אנחנו רוצים להמשיך מה שהתחלנו בהרצאה הקודמת. בואו נפתח Visual Studio, Simple Dialog Sample 101. נסגור את זה, הנה הוא, נפתח? לא, לא נפתח, לחמת אחרים...
זה. יפה, אז זה היה לנו כבר ווינפור. אז רצינו בהרצאה הקודמת לעשות שהם, אוקיי, אז היוזר לחץ על X, X זה Close, בבקשה לסגירה. בבקשה לסגירה, אם אתה רוצה לסגור, אם כן, אז ניידע את מיין שאנחנו רוצים להסתכל על לולאה, זה לא בהכרח מיין, אבל ניידע את הלולאה האין
סופית שאנחנו רוצים לסיים. ואז גילינו שאם אנחנו ממשיכים בהמשך אחרי פוסט מסג', זה לא פתאום היא יוצאת מהפונקציה, אלא היא ממשיכה, ממשיכים.
ואז דף וינדו פוק מופעלת עבור קלוז, דף וינדו פוק עבור וינדו קלוז סוגרת את החלון, היא עושה דסטרוי וינדו, סוגרת את החלון, החלון נעלם, זה לא מה שרצינו במקרה שהיוזר רוצה no אם היוזר רוצה no לא רוצה לסגור אנחנו בכל מקרה מגיעים לפה לא טוב אז יש כל מיני אפשרויות לפתור את זה אפשרות אחת היא פשוט לשים פה
return 0 או return 1 תלוי אני כבר זה זהו מה הרשמות של מה שאנחנו מחזירים אז האמת שכדאי קצת לקרוא ולהבין אנחנו לא נעשה את זה כרגע אם משהו לא יעבוד לנו אז ננסה לפתור את זה בוא ננסה לראות אם זה עובד ואז אם היוזר, אז אם אנחנו, רגע, רגע, סליחה.
אם דווקא, סליחה, בכל מקרה, אם קיבלנו זה, אז אני רוצה זה, ככה וככה, נכון? אם קיבלתי קלוז, בין אם היוזר רוצה לסגור ובין אם הוא לא רוצה, רגע, אם הוא רוצה לסגור, אז דווקא עדיף לקרוא לזה, הוא רוצה לסגור, אז אני גם אגיד לאפליקציה ואני גם אסגור, נכון?
טוב, האמת היא שאם אני, רגע, השאלה היא, השאלה היא בעצם למה התכוון המשורר? שהיוזר לוחץ, מה בעצם, כן, בעצם נשאלת השאלה, איך אנחנו היינו רוצים שהחלון שלנו יתנהג?
הווינפרו קובע את ההתנהגות של החלון, איך היינו רוצים שהחלון יתנהג? כשהיוזר לוחץ על קלוז, מה אנחנו רוצים? שהחלון ייעלם או לא ייעלם?
ובלי קשר לזה אנחנו רוצים, האם אנחנו רוצים שהאפליקציה תיסגר או לא תיסגר? כמובן שאם האפליקציה תיסגר אז גם החלון ייסגר, אבל אז זה כבר לא מעניין אותי, גם אם החלון יישאר בטוח, אבל הוא ייסגר, הכל ייסגר.
השאלה הנשאלת היא איך אנחנו רוצים שהחלון יתנהג בדאבל עם קלוז, האם אני רוצה. השאלה היא קוויט מה? קוויט זה אפליקיישן או קוויט זה וינדו?
אז בואו נגיד שהגיוני להגיד גם וגם, שאם אני רוצה קלוז, אם אני רוצה אכן לסגור, אז בסדר, אז אני סוגר, אם יצא לי שכן יקרה, לא יקרה, זה לא מעניין, אני סוגר, אבל אם אני רוצה לא לסגור, בוא נגיד לא קלוז לא קוויט אתה רוצה לסגור אותו לחלון קלוז דיס ווינדו ווינדו לסגור את החלון לא אקזיט המבלבל קוויט דיס ווינדו אה בעצם זה לא משנה בעצם קוויט אם אתה רוצה לסיים
בקיצור האם אתה רוצה לסיים כן או לא אם אתה רוצה לסיים אני אטפל בהכל זה מטפל תכלס בהכל ואם אתה לא רוצה לסיים אם זה נו אז פה כתוב return אפס לפחות לא נגיע לזה שזה יסגור לנו אבל מה אם הוא רוצה לסגור את החלון ולא לסגור את האפליקציה?
אז במקרה כזה אנחנו צריכים לסגור את החלון, זה כבר צריך טיפול אחר. אבל על זה נדבר בהזדמנות אחרת. בואו קודם כל נריץ את זה, נראה שזה עובד. אז אם הוא אומר no, החלון יישאר בחיים.
אבל אם הוא אומר yes, אז כל האפליקציה תמות. יפה, סבבה. אוקיי, אתם מתחילים להבין איך הדבר הזה עובד, להצעה.
יפה. טוב, לפני שנמשיך, הדבר הבא שאני רוצה להראות זו טכניקה מאוד עוצמתית בואו נראה מה מה שאני רוצה לעשות זה דבר כזה אוקיי אז עשינו קרנט ווינדו ואז החלפנו לו את הווין פרוק שלו עם ווין פרוק שלנו יפה מאוד ועכשיו הוא מפעיל את הווין פרוק שלנו אז בואו נגיד שהייתי רוצה שהוא יפעיל את הווין
פרוק שלנו אבל שגם יפעיל את הווין פרוק שלו איך עושים דבר שכזה זאת אומרת הרי כאן אני מפעיל את הדיפולט ווינדו פרוק יפה מאוד, אבל הייתי רוצה לא להפעיל את הדיבוס ואינו פרוק, הייתי רוצה להפעיל את הווין פרוק המקורי.
הווין פרוק המקורי גם לא להפעיל את הדיבוס ואינו פרוק עבור כל מיני דברים, אבל עבור דברים מסוימים, כמו התצוגה שהוא מראה כפתור ומראה כפתור נלחץ והוא מטפל.
בקיצור הייתי רוצה שהוא כן יפעיל את הווין פרוק שלנו, וכמה שהייתי רוצה זה לא להפעיל את הדיבוס ואינו פרוק אלא להפעיל את הבדון פרוק, איפה הפרוק המקורי?
יפה, אז מה שאני רוצה זה את הפרוק המקורי. אז איפה הפרוק המקורי? אז נעשה פה ctrl-shift-רווח. סבור שהפרוק המקורי, או כל דבר מקורי שבעצם הכנסנו לפה, הרי פה אני יכול להכניס כל מיני דברים, תלוי במה זה.
אמרתי, תחליף את הווין פרוק המקורי, תדחוף את זה. כשאני אומר לו תדחוף את זה, כמו הרבה פונקציות של Windows API, שאומרים לו קבל הזוג זוג ומקיא החוצה את הישן.
אז פה אני יכול להגיד לו, זה הישן. אז long, וזה ה-Original proc. יפה, זה ה-proc המקורי. יפה, עכשיו את ה-proc המקורי אני רוצה להעביר לחלון.
אז איך אני אעביר? פה אני במיין, ושם איזה פונקציה אחרת. אז איך אני אעביר? אז אני יכול להעביר את זה כמשתנה גלובלי. נכון, אז זה יהיה winproc 1 ו-winproc 2. ותכף נראה, ננסה לעשות טכניקה אחרת, תרשום שאני רוצה להראות טכניקה אחרת.
זה יהיה winprog2 יפה מאוד אבל אני רוצה לתקן משתנים גלובליים אז בואו ניקח את זה גרור וקרופי ואת זה אני מעיף ואת זה אני מעיף יפה אז יש לי את זה וקונטרול cv וזה אחד וזה שתיים נקודה פסיק נקודה פסיק ואנטר וזה משתנים גלובליים כל הכבוד הבעיה עם c++ משתנים גלובליים אם אני אנסה להשתמש בהם לפני
אז הוא אמר אני רוצה פה לדחוף את הפונקציה המקורית שלי אז רגע אז אם אני אנסה פה בכלל לכתוב אוריג'ינל קונטרול רווח הוא בכלל לא מכיר את האוריג'ינל למה הוא לא מכיר את האוריג'ינל מי יודע אם c++ צריך הצהרה או הגדרה לפני אז ניקח את זה ונגרור את זה לכאן יפה מאוד יפה אז עכשיו
זה לפני עכשיו בואו נראה אם הוא מכיר קונטרול רווח יפה אני רוצה להפעיל את זה טוב אבל האמת היא שיש איזה לונג אז אולי עדיף להגדיר לא לקבל את זה כלונג אלא כבר לקבל את זה כפונקציה טוב אני לא יכול לקבל את זה כפונקציה כי זה מחזיר אותו כלונג אני יכול להמיר את זה פה אבל אני גם יכול להמיר את זה פה זה לא משנה איפה
אני ממיר את זה בוא נמיר את זה לא משנה איפה נמיר את זה פה יפה אז אוריג'ינל פרוק בואו נמיר אותו לפרוק אז איך נראה פרוק פרוק האמת שנראה ככה אבל אני צריך את הטיפוסים, ניקח את הטיפוסים, זה פרוק, בואו ניקח את זה, נגרור אותו, בעזרת גם עם קונטרול, פספסתי אותו, יפה, בואו נגרור
אותו לכאן, עם קונטרול, שנשכפל את זה, חץ ואנטר, יפה, אז אני יכול להרוג את עצמי ולהגדיר פוינטר לפונקציה ולעשות קאסטינג, כן, ווין פרוק, נקרא לזה, זה יהיה, זה הולך להיות נורא נורא נורא קשה, אבל יש לנו הרצאות על פוינטרים, הוא ינפוג בעצם פה, אני לא צריך להגיד את השם, או זה לא משנה, אבל אני כן צריך להגדיר שם של משתנה שהוא
יהיה הפוינטר החדש, זאת אומרת, אני יכול להגדיר, אוקיי, זה הטיפוס, זה פוינטר לפונקציה, זה הטיפוס, אבל אתה יכול את זה להעיף, זה לא מפריע.
בקיצור, זה נורא נורא מסובך. הרבה יותר פשוט, כשעובדים עם פוינטרים ופונקציות, זה להשתמש ב-type def, אז בואו נגדיר type def, איך מגדירים type def?
של פוינטר לפונקציה אז בואו נעשה רגע נחזיר את זה נקונטרול זה יפה זה משתנה והוא לא פוינטר לפונקציה אם אני רוצה להגדיר פוינטר לפונקציה איפה יש לי את הכוכבית פה אני רחץ אוקיי אני חושב אני לא בטוח תכף אנחנו ניווכח זה משתנה חדש כן השורה הזו פה בסוף אני שם נקודה פסיק זה נראה מוזר אבל העובדה
היא שזה משתנה חדש והוא מסוג פוינטר פונקציה שמקבלת הפרמטרים הללו ומחזירה את זה והיא סטנדרט קוונינג קונבנצ'ן מבנה שלה אז זה פוינטר לפונקציה זה לא בריא להגדיר את המשתנה הזה כשאני בתוך פונקציה עם אותו שם אז בוא נגיד נקרא לזה פי פוינטר לווין פרוק יפה פוינטר לווין פרוק זה המשתנה ועכשיו נעשה
לזה קאסטינג אז אני יכול להגיד שהמשתנה פוינטר לווין פרוק זה המשתנה והוא מקבל את הערך הזה. אבל אני צריך לעשות קאסטינג.
נכון? אני צריך לעשות קאסטינג. אז קאסטינג, נוקחים את זה, קודם כל בואו נכין פה מקום לקאסטינג, זה לפני הטייפ דף, תבינו למה הטייפ דף כזה חשוב.
אני לוקח את כל זה בלי הנקודה פסיק בסוף, ועושה עכבר ימני לכאן עם קופי, אבל אני מוציא את השם של המשתנה. אני לא רוצה להגדיר משתנה חדש, אני רוצה להשתמש בטיפוס.
בואו נעשה פה קצת סדר, מה יש לנו? מה כתוב כאן? כתוב כאן שזה משתנה חדש מסוג פוינטים לפונקציה שמקבל את זה, מחזיר את זה וזה. אוקיי.
עכשיו, המשתנה הזה שזה עתה הגדרנו, אני נותן לו ערך. אגב, יכולתי גם לשים פה שווה. בלי זה, וזה אותו דבר. אבל אני תמיד אוהב שורות נפרדות, אז שורות נפרדות.
אז הגדרתי משתנה. המשתנה, אנחנו ניתן לו ערך. מה הערך? הערך זה זה. אבל באמצע אני עושה לזה קאסטינג, זה שורת הקאסטינג.
מה הקאסטינג הזה עושה? אני פותח סוגריים, סוגר סוגריים, ובתוכם אני שם את הטיפוס של הפוינטר לפונקציה, אבל בלי שם של משתנה.
אין פה שם של משתנה. יפה מאוד. זה בעצם קאסטינג. תכף אנחנו ננסה להגדיר טיפוס חדש שמחליף את זה, ואז זה יהיה אפשרי בלי הבלאגן הזה שחוזר על עצמו פעמיים, אבל לעת עתה זה בסדר, זה הפוינטר לווין פרוק, ועכשיו במקום זה אני
אקרא לפוינטר לווין פרוק תחת סוגריים ואני אביא לו את הפרמטרים hwnd message w param וl param יפה זה נויץ אז הם נראים כמו כפתורים אבל הקוד עובר דרכנו אז זוכרים את זה זה עדיין שלנו יפה אז זה גם וגם הטכניקה הזו, טכניקה נורא עוצמתית, קוראים סאב קלאסינג.
ולמעשה אני יכול ליישם אותה, במקרה הזה אנחנו מיישמים אותה על מחלקה שאנחנו, אין לנו את הקוד שלה. ובעצם חדרנו לקוד של, זה בעצם פילטר, חדרנו, עשינו פילטר על הקוד של מיקרוסופט.
במיקרוסופט כתבו קוד א', ואני, לפני שהקוד של מיקרוסופט מבוצע, אני נכנס שם באמצע ואני יכול לעשות מניפולציות. יתרה על זאת, תנו לי חלון.
שאני לא יצרתי אפילו, חלון באנשהו הוא, ואני יכול פשוט לעשות לו סאב קלאסינג. אני לא צריך ליצור את החלון כדי לעשות לו סאב קלאסינג, זה נקרא סאב קלאסינג.
אני לא חייב ליצור את החלון ורק לעשות לו, אני יכול לקחת כל חלון ולעשות לו סאב קלאסינג. זה מאוד עוצמתי. אני יכול לשנות התנהגות של חלון קיים בלי קוד, בלי גישה לקוד של החלון המקורי.