WinForms: כיצד ליצור פקד שקוף על פקדים אחרים

מקור: התמיכה של Microsoft

פרסום מהיר

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

פעולה



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

הגורם



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

פתרון



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

מידע נוסף



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

<DllImport("user32.dll", SetLastError:=True)> _

ציבורית משותפת הפונקציה MapWindowPoints(ByVal hwndFrom As HandleRef, ByVal hwndTo As HandleRef, ByRef lpPoints As POINT, <MarshalAs(UnmanagedType.U4)> ByVal cPoints As Integer) כ- Int32

הפונקציה קצה









<System.Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _

נקודת מבנה ציבורי

ציבורי X כמספר שלם



ציבורי Y כמספר שלם

ציבורי משנה חדש (ByVal X כמספר שלם, ByVal Y כמספר שלם)

Me.X = X

Me.Y = Y

End Sub







Structur קצה

Dim backgroundCache כמו מפת סיביות

עמעום regenerations כ מספר שלם = 0

OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs) משנה עוקף מוגן

' תחילה לצבוע את הרקע של האב שלנו







אם (backgroundCache הוא דבר) לאחר מכן

regenerations = regenerations + 1

backgroundCache = Bitmap(Me.Width, Me.Height) חדש

Dim g כגרפיקה = Graphics.FromImage(backgroundCache)

מלבן dim מלבן כ = Rectangle(0, 0, Me.Width, Me.Height) חדש

אם (לא Me.Parent הוא דבר) לאחר מכן







' הסטת מקור הגרפיקה כדי להתאים את האב.

עמעום p כנקודת = נקודת חדש

p.X = p.Y = 0

MapWindowPoints (חדש HandleRef (לי, אחיזה), HandleRef חדש (האב, Parent.Handle), p, 1)

' היסט את cliprect לתוך שטח האב





rectangle.Offset(p.X, p.Y)

עמעום שאינו בקובץ החלפה כ- PaintEventArgs = PaintEventArgs(g, rectangle) חדש

עמעום מצב כ- GraphicsState = g.Save()

נסה





g.TranslateTransform(-p.X, -p.Y)

' קבל האב כדי למחוק את הרקע שלנו

InvokePaintBackground (האב, שאינו בקובץ החלפה)

' הגדר אותו שוב במקרה OnPaintBackground מוברג אותו

g.Restore(state)

מצב = g.Save()

g.TranslateTransform(-p.X, -p.Y)

' ספר האב כדי לצבוע החזית שלו

InvokePaint (האב, שאינו בקובץ החלפה)

לבסוף

g.Restore(state)

נסה קצה

rectangle.Offset(-p.X, -p.Y)

אחר

' כל סיבה, האב שלנו אין אפשרות לצבוע רקע שלנו, אך אנו זקוקים סוג כלשהו של רקע

' מאז אנחנו שקוף.

g.FillRectangle (SystemBrushes.Control, מלבן)

לסיים אם

חזית 'לאחר מכן צבעו האחים שלנו'

עמעום sibs כ- ControlCollection = Me.Parent.Controls

עבור i כ מספר שלם = sibs. ספירת לשלב 1-1

עמעום הפקד כ- c = sibs (i - 1)

' אנו החשובים רק הפקדים מאחורי לנו







אם c.Equals(Me) מכן

יציאה עבור

לסיים אם

' אינם טורחים אם אנו לא לשתף שטח

אם (Me.Bounds.IntersectsWith(c.Bounds)) מכן

עמעום p כנקודת = נקודת חדש

' היסט נקודת המוצא שלנו כדי להתאים את האח



p.X = Me.Bounds.X - c.Bounds.X

p.Y = Me.Bounds.Y - c.Bounds.Y

' היסט את cliprect לתוך השטח של הפקד אח





rectangle.Offset(p.X, p.Y)

עמעום שאינו בקובץ החלפה כ- PaintEventArgs = PaintEventArgs(g, rectangle) חדש

עמעום מצב כ- GraphicsState = g.Save()

נסה





' שמירת המצב כך אנו יכולים לבטל את השינוי

' עבור נסיעה הבא סביב

מצב = g.Save()

g.TranslateTransform(-p.X, -p.Y)

' לדעת על הפקד כדי לצבוע החזית שלו

InvokePaint (c, שאינו בקובץ החלפה)

לבסוף

g.Restore(state)

נסה קצה

לסיים אם

הבא

לסיים אם

עמעום g2 כ גרפיקה = pevent. גרפיקה

g2. DrawImage (backgroundCache, 0, 0)

End Sub

כתב-ויתור

MICROSOFT CORPORATION ו/או ספקיה להפוך ללא ייצוגים אודות ההתאמה, אמינות או דיוק של מידע וגרפיקה קשורים הכלול כאן. כל מידע וגרפיקה קרובים כאלה ניתנים "כמות שהוא" ללא אחריות מסוג כלשהו. MICROSOFT ו/או ספקיה מסירים מעצמם בזאת כל אחריות ותנאים ביחס זה מידע וגרפיקה קשורים, כולל כל אחריות ותנאים של סחירות, התאמה למטרה מסוימת, למאמץ מיטבי, כותרת וכותרת ואי-הפרה. אתה מסכים במפורש כי באירוע לא יישאו MICROSOFT ו/או ספקיה בחבות עבור כל נזק ישיר, עקיף, עונשי, מקריים, מיוחדים, תוצאתי או כל נזק שהוא כולל ללא הגבלה, נזקים מאובדן שימוש, נתונים או רווחים, עבור הנובע מחוזה או בכל אופן מחובר עם השימוש או אי-יכולת להשתמש מידע וגרפיקה קשורים הכלול בזאת , אם בהתבסס על חוזה, עוולה, רשלנות, אחריות או אחרת, גם אם MICROSOFT או ספקיה קיבלו מידע אודות האפשרות להתרחשות נזקים.
מאפיינים:

מזהה פריט: 943454 - סקירה אחרונה: 15 בינו׳ 2017 - תיקון: 1

משוב