PracticU

Paint Brush

בלי כתוביותעם כתוביות
PracticU › קורס C למתקדמים - עבודה מול חומרה Win32 › Paint Brush
מילון מושגים:
משתנה - שם שמפנה למקום בזיכרון שבו נשמר ערך שיכול להשתנות במהלך ריצת התוכנית, כמו מספר, טקסט או אובייקט.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).

Paint Brush
ההרצאה בונה תוכנת ציור פשוטה ב-Win32: ציור עם העכבר, שמירת הקווים במבנה נתונים וציור מחדש של החלון כשהוא מתעדכן.
השלבים העיקריים
1. רישום המחלקה: מגדירים WNDCLASS עם שגרת החלון, רקע לבן (GetStockObject עם WHITE_BRUSH) וסמן מוכן מראש (LoadCursor).
2. קבלת HDC: בעזרת GetDC מקבלים הקשר ציור למסך. עם MoveToEx מזיזים את הנקודה ההתחלתית, ועם LineTo מציירים קו עד הנקודה הבאה.
3. מצב לחיצה: משתנה שמזהה אם הכפתור השמאלי לחוץ. הוא נדלק ב-WM_LBUTTONDOWN וכבה ב-WM_LBUTTONUP. ציור ב-WM_MOUSEMOVE מתבצע רק כשהמשתנה דלוק.
4. מבנה הנתונים: נשמר מערך של קווים, וכל קו הוא מערך של נקודות. בלחיצה חדשה נפתח קו חדש, והנקודות נשמרות לתוכו במהלך התנועה.
5. ציור מחדש: ב-WM_PAINT מציירים את כל הקווים מהמבנה. זה מונע מחיקה כשחלון אחר עובר מעל התוכנה.
6. InvalidateRect: מבקש מהמערכת לצייר שוב את החלון. ההרצאה משתמשת בזה אחרי לחיצה ימנית כדי לנקות את המסך.
7. חילוץ קואורדינטות: מהערך של LPARAM מחלצים X ו-Y בעזרת חיתוך ביטים (LOWORD ו-HIWORD).
שימו לב
המרצה מדגיש שה-HDC שמחזיקים צריך להיות אותו HDC לאורך כל הציור. אם מקבלים HDC חדש בכל הודעה, הציור נשבר.
השיעור הבא בקורס: בניית מחשבון של חלונות

פרקי ההרצאה: Paint Brush

  1. 00:00

    פתיחת פרויקט ומחלקת החלון WNDCLASS

  2. 01:46

    הגדרות WNDCLASS: רקע, אייקון וסמן

  3. 03:51

    WndProc במחלקה ו-SetWindowLong

  4. 05:27

    תיקון שם המחלקה ל-Unicode

  5. 07:25

    רקע לבן עם GetStockObject

  6. 08:43

    מברשת לבנה מהמחסן של GDI

  7. 12:24

    סמן Arrow מובנה של המערכת

  8. 14:27

    טיפול בלחיצת עכבר להתחלת ציור

תמלול ההרצאה: Paint Brush

הטקסט המלא של הדקות הראשונות בהרצאה «Paint Brush» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:03

    טוב אנחנו ממשיכים ושוב נצליח להביא visual studio וניכנס לסימפל דיאלוג סאמפל 02 נסגור את זה ומה שאני רוצה היום לעשות אוקיי זה הדבר הבא אז עד עכשיו השתמשנו בעצם במשהו מאוד מוזר מחלקת בטן כן קונטרול שיפט רווח פה אנחנו אמורים להגיד את המחלקה של החלון מה זה בעצם מחלקה של חלון זה כל מיני הגדרות יסוד לחלון במיוחד מה הפונקציה שמטפלת בחלון.

  2. 00:44

    פונקציה שמטפלת בחלון אז ראינו שאני יכול להחליף אותה אבל תכלס זה לא באמת עובד כי אחרי זה כי הוא כבר כי הבעינית הוא כבר בנה משהו ואז הוא מסתבך שאני בקיצור אני רוצה להתחיל מאפס אני לא רוצה להתחיל ממחלקה קיימת אני רוצה ליצור מחלקה משלילית אני רוצה לקרוא לregistered class אז רג'יסטל קלאס,

  3. 01:17

    רג'יסטל קלאס, אני צריך להעביר לה מבנה מסוג ווינד קלאס. בואו נגדיר ווינד קלאס, WND קלאס, WND קלאס, קונטרול רווח, WND קלאס, ווינד קלאס ולאפס, יפה.

  4. 01:42

    ווינד קלאס, נקודה. עכשיו יש פה כל מיני צדדות, אני יכול להגדיר עבור החלון הזה מה הבראש של ה-Background, אז מה הצבע הרקע?

  5. 01:56

    מי הקלסר, איך נראה הקלסר, מי האייקון, איי צ'ינס, תנסו אחרי זה, מעניין אותי כרגע, מי הווינד פרוק, מה ה-class name, מי המניו, ומה הסטייל של החלון, של החלון בסיס.

  6. 02:16

    עכשיו, האמת שדי את כל אלה אני יכול להחליף תוך כדי ריצה, אבל כל דבר אני יכול להחליף. גם אני כבן אדם, אני יכול להחליף כל מיני איברים, אבל בסופו של דבר, אני זה אני. גם את המוח אני יכול להחליף.

  7. 02:28

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

  8. 02:40

    אז בואו דבר ראשון ניתן לו שם. אז ה-class name נקרא לזה משה, מחלקת משה. פה אנחנו נגדיר שמסוג מחלקת משה אנחנו מייצרים חלון. עכשיו שימו לב שאנחנו ניצור ווין קלאס, אבל יצירת ווין קלאס היא חסרת משמעות.

  9. 03:06

    מה שיהפוך את הקלאס הזה לבעל משמעות זה קריאה ל-register-class, register-class תרשום את החלון במערכת ההפעלה, ואז אני אוכל לבנות חלונות על ידי create-window מסוג המחלקה.

  10. 03:21

    יפה. אז register-class, בסופו של דבר אני אעביר את wind-class, או לפחות כתובת של wind-class, ומה מחזירה לי wind-class? היא מחזירה לי אטום, אבל אני אתעלם ממנו.

  11. 03:38

    יפה. והשדות הבאים שמעניינים אותי, האקדם היחידי שאותי מעניין זה הווינד פרוק בשלב זה, אני רק רוצה לראות שזה עובד לי. אז הווינד פרוק שלי יהיה הווינד פרוק שלי.

  12. 03:51

    WND, פרוק, ווינד פרוק שלנו. יפה מאוד. אבל כשהווינד פרוק הזה יופעל אז אם אנחנו נעשה גט ווינדו לונג זה יחזיר אפס.

  13. 04:04

    טוב האמת היא שפה אנחנו עושים משהו די מוזר, יוצרים חלון מסוג משה וקוראים לו סט ווינדו לונג ודוחפים לו את הווינד פרוק אבל כבר יש לו את הווינד פרוק. אז לשורות האלה כבר אין משמעות, הם לא יעשו שום דבר.

  14. 04:19

    אולי הם יעשו, אבל משהו מוזר. מצד אחד אני דוחף לו את הווינד פרוק, אבל כבר יש לו את הווינד פרוק הזה, אז הוא יחזיר את הווינד פרוק.

  15. 04:26

    ואז אני אעביר לו את הווינד פרוק, האמת שזה לא יעשה נזק. שום דבר, זה לא יגרום נזק, זה לא יהיה מאופר, זה פשוט יחלף את הווינד פרוק של עצמו ויפעיל אותו, וזה אולי אינסופי, סליחה.

  16. 04:38

    אז בעצם הוא יפעיל את הווינד פרוק של עצמו במקום להפעיל את הדיפרוט ווינד פרוק אבל אם הוא יפעיל את הווינד פרוק של עצמו האמת שאני לא רוצה אפילו לחשוב על זה בואו נסיים את הדיון בזה שאנחנו נסיר את זה יפה כמעט נסיר עד לכאן ונסיר עד לכאן יפה ואז נגדיר את משה ומסוג משה ניצור חלון יפה מאוד הכל נראה מצוין בואו נריץ את זה No, מה הבעיה?

  17. 05:18

    ההשמה של משה היא L. למה? כי זה, זה הוא לא מראה, קונטרול רווח. למה הוא לא מראה קונטרול רווח?

  18. 05:30

    ווין קלאס, אני יודע. קונטרול רווח, למה הוא לא מראה את זה? קונטרול רווח, הוא לא מראה קונטרול רווח. בואו נלך לווין קלאס, גולד דפינישן, ווין קלאס הוא מקלאס עם w וזה ווין קלאס.

  19. 05:46

    אז הסטרינגים בקלאס ניים הם w, בקיצור w, זאת אומרת l, יפה, בואו נביא, יפה, נוצר לי חלון 1, 2 ו-3.

  20. 06:07

    עכשיו השניים האחרים בעצם זה edit ו-bottom, אבל מכיוון שאכלנו לפונקציה הזאת את הסיומת, אז deathwindproc מופעל, זה לא בעצם, זה לא קשור לחלון הרגיל, זאת אומרת, לא קשור ל-bottom, הכל עובד פה, אבל זה לא-bottom, זה לא-bottom, זה לא-edit, זה לא כמו שרצינו.

  21. 06:31

    בסדר, אבל הסגירה על 3 עובדת? no, וה-2 הסגירה עובדת? no, והסגירה על 1 גם היא עובדת. הסגירה על כולם עובדת, זאת אומרת, בכל מקרה, כשווינט פרוק מופעל עבור כל אחד מהם, עושים את הבדיקה הזו, אבל בסופו של דבר אנחנו מפעילים את הדף ווינט פרוק הרגיל, ולא את הווין פרוק המקורי עבור מספר שתיים ושלוש מה שגורם לשתיים ושלוש לא להתנהג כמו

  22. 07:01

    אדיט וכמו באטן יפה אבל בעצם יש לנו חלון רגיל ולא חלון שגנבנו בעצם ממחלקת באטן יפה בואו נראה מה עוד אני יכול לעשות שפתף חמש מה לגבי בואו נעשה פה אנטר וווין קלאס נקודה אז יש לי את ה-Background מה אתה רוצה?

  23. 07:28

    סטיילה, קצת פחות, למה סטייל מעניין? לא רואה למה מעניין בסטייל, אבל יש לי את ה-Background, את ה-Brush של ה-Background, אז זה שווה ל...

  24. 07:38

    איך, מה זה בא, מאיפה אני אקבל Handle ל-Brush? אז יש דבר שנקרא GetStock, GetStockBrush יש, אונדרום רווח, GetStockBrush אין, אבל GetStockObject תביא לי משהו מהמחסן, מהסטוק, פה אני צריך להגיד לו איזה...

  25. 08:02

    טוב, שנייה, אני צריך לבדוק את זה, אני לא רוצה להלאות אתכם פה. בואו רגע נעשה פחת על get stoke object אני בסך הכל רוצה שיהיה לנו צבע רקע get stoke object זה לא בדיוק מה שרציתי אבל זה דווקא בסדר פה אני מעביר לו מה? אני יכול להגיד לו black brush gray brush כל מיני brush gray brush הייתי רוצה white brush יש דבר

  26. 08:26

    כזה white brush יש white pen אבל אני לא רואה white brush null brush הנה white brush דווקא white brush יופי אז בואו נגיד לו פה או וייט בראש, וייט בראש, F12, מה זה וייט בראש? במקרה זה 0, מעניין, יכולנו אפילו להגיד לו 0, 0, יפה.

  27. 08:51

    בהזדמנות נלמד על GDI, יש לי פה HGDI Object, GDI קשור ל-Graphic Device Interface, מה שקשור לכרטיס המסך, אז אני מקבל פה מצביע או הנדל לידית למברשת לבנה שהיא כבר קיימת, אני לא מקצה אותה, אני מקבל אותה מהמחסן, היא כבר קיימת מראש.

  28. 09:17

    יש כמה אובייקטים של GDI של גישה לכרטיס המסך שהם זמינים מראש, אחד מהם זה מברשת בצבע לבן. עוד על הדבר הזה בהזדמנות אחרת, יפה.

  29. 09:27

    בואו ננסה להריץ את זה. לא מקבל, כן. hbrush, בואו נעשה לו casting. hbrush, ctrl רווח, enter ו-f5, יפה. זה חלון לבן, לא, זה לא חלון לבן.

  30. 09:52

    כמו שאחד, כמו שאחד הוא חלון לבן, יפה. חלון לבן רגיל, טהור. שימו לב שאני יכול לשנות את האייקון פה להיות איי-בים, ואז יראה כמו חלון אמיתי, כמו החלון הזה.

  31. 10:08

    בואו ננסה לשנות לו את האייקון, בואו נעצור אותו, שיפט F5 ו-WND קלאס נקודה. care h cursor, בואו נראה שווה ל-get cursor, יש דבר כזה? גט קורסור אה יש דבר כזה גט קורסור אה אבל זה מביא לי את הקרסר הנוכחי זה לא זה אני צריך בעצם איכשהו ליצור קרסר אולי חדש מה לגבי בואו נבדוק גם מה היה שם האם יש פה קרסרים מוכנים גם תמתינו שנייה אני אברך את הדברים

  32. 10:45

    האלה בואו ניגש ל-register class F1 וב-register class בואו נראה את ווינד קלאס ובווינד קלאס בואו נראה אם אני יכול לקבל אינפורמציה על ה-H-Cursor הזה, אם הוא יכול לעזור לייצר אותו.

  33. 11:04

    H-Cursor, H-Cursor, Handle זה בקלאס קרסר, This may or must be a Handle to a Cursor ייצור. If this may or is not, the בגישן must ייצור את ה-Cursor שייפ וואן אבר דה מאוס מוז.

  34. 11:16

    קיצור, הוא צריך ליצור, הוא צריך לטפל בזה. בואו נראה אם יש לנו Create Cursor, Create 123, Control-Reverse, Create Cursor, כן, אבל זה יוצרים ממש, אני לא רוצה קרסר חדש, אני בסך הכל רוצה I-Beam, אני רוצה את הסוג הזה של הקרסר, מאיפה את זה אני מציג?

  35. 11:42

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

  36. 11:59

    את הקרסר לאחורי גט קרסר, אינפו פוזישן, פיזיקל, לואוד קרסר לא גם לא טוב זה קרסר נייגס גם כן משהו מתקדם לואוד קרסר סט קרסר סט קרסר סט סט סט סט זה שואו לא טוב יש לי רעיון אחר סמפל דיאלוג 0.1 הרי פה עשינו את זה שלשום אתמול מתי שעשינו את זה אז יש את הקוד המקורי אפשר לראות את רג'יסטר קלאס עם מיי רג'יסטר במיי רג'יסטר הם עשו לואוד

  37. 12:31

    אייקון לואוד קרסר או או יפה, לואוט קרסרנל ואיי-די-סי אירו, הרבה יותר טוב, בואו נראה. אז נקרא ללואוט קרסר, לואוט קרסר מוכר, קונטרול שייר זה, זה לא מעניין, ואיי-די-סי אירו, אירו, ושימו לב שיש לי פה גם קרוס, זה אין טוב, אירו הוא by default, גם עכשיו הוא היה אירו,

  38. 13:02

    כמו שאותי מעניין זה האיי-בים, האיי-בים זה הסמן הזה, זה איי, נכון? זה נראה כמו איי. רבים אם תדעו הנדסה אזרחית אז תדעו יפה אז קונטרול שאיף רווח ו h קרסר וזה h קרסר זה נראה אותו דבר בואו נריץ אותו יפה אז זה כנראה שלוש וזה שתיים והנה אחד וכשאני מורחף מעליו ויש לו את זה ממש נראה כאילו נכון זה ממש נראה כמו חלון זה נראה כמו חלון אמיתי זה ממש מתחיל לתפקד

  39. 13:40

    כמו חלון טוב כאילו נראה כאילו תכף אני אעשה פה קליק ויופיע הסמן זה הדבר הבא אולי שכדאי שנעשה יפה מה עוד אנחנו יכולים לעשות?

  40. 13:53

    קונטרול רווח אפשר h-icon winport זה זה זה מניו לא חשוב בסדר טוב הדבר הבא שהייתי רוצה זה להראות שכשאני עושה קליק אז מופיע הסמן ואולי קודם מה שכדאי שנעשה זה בוא נצייר קו הייתי רוצה פשוט לצייר קו הייתי רוצה לעשות צייר כך שאני רוצה לצייר בחלון שלי בואו ננסה לצייר

  41. 14:21

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

  42. 14:48

    בהודעה wm-close זה מה שאני עושה, מה אני עושה בהודעה אחרת? בוא נגיד if message שווה ל-wm-mouse-down זהו, יש mouse-down, יש

לקורס המלא: קורס C למתקדמים אונליין

ההרצאה הקודמת: סיכום - בניית חלון מאפס

ההרצאה הבאה: בניית מחשבון של חלונות

קורסים נוספים במסלול

  • קורס WinForms - תוכנות רגילות בווינדוס
  • פרויקט מעשי ב-#C - בונים מחשבון פשוט
  • פרויקט מעשי ב-#C - ספר טלפונים
  • פרויקט מעשי ב-#C - תוכנת צייר
  • קורס ADO.NET - חיבור אתר למסד נתונים
  • קורס תכנות מתקדם - #Advanced .NET C