windows forms controls c# - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

windows forms controls c#


noam25

Recommended Posts

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

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

זה הקוד :



private void timerGraph_Tick(object sender, EventArgs e)
{
// Move to and get the latest value in the performance counter
try //the list of resourcers is static until next refresh, in order to prevent excep check if resource
{ //is still available
currVal = perfGraphCounter.NextValue();

if (currVal > maxVal)
maxVal = currVal;
lblPeekVal.Text = "Max :" + Math.Round(maxVal,1);
Trimedval = currVal % 100;
// Update the label with the value
lblUsagePrecent.Text = "Value :"+Math.Round(Convert.ToDouble(currVal.ToString()), 1);
Graphics gfx = picGraph.CreateGraphics();
gfx.DrawLine(pen1, graphLast, (picGraph.ClientRectangle.Bottom - 10 - lastVal), graphNext, (picGraph.ClientRectangle.Bottom - 10 - Trimedval));
gfx.DrawLine(pen2, graphLast, (picGraph.ClientRectangle.Bottom - 10 - lastVal), graphLast, (picGraph.ClientRectangle.Bottom));
graphLast = graphNext;
lastVal = Trimedval;
graphNext += 2;
if (graphNext > picGraph.ClientRectangle.Right)
{
picGraph.Invalidate();
graphNext = 0;
graphLast = graphNext;
}
}
catch
{
timerGraph.Enabled = false;
MessageBox.Show("The resource you've selected is out of date\r\nRefresh the list.");
this.Dispose();
MonitorPerformance.DecWorkingGraphsCounter();
}
}

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

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

אשמח לעזרה .

קישור לתוכן
שתף באתרים אחרים

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

בכל מקרה, כמו שכבר כתבתי לך שם, פקד מסוג PictureBox (או כל פקד אחר)

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

על מנת לצייר כמו שצריך על גבי תמונה, צריך להשתמש באובייקט כלשהו היורש מ-Image, כמו למשל Bitmap

שהוא קל ונוח לעבודה, ואז לצייר עליו ולקבוע אותו בתור ה-Image של פקד ה-PictureBox שלך.

אני מציע שתנסה לבצע את השינויים שאמרתי לך כאן (בדיוק כמו בת'רד הקודם) ואז תחזור אם זה עדיין לא עובד,

בצירוף הקוד הרלוונטי (המעודכן) ומה בדיוק עובד/לא עובד.

ואגב, בנוגע ל-Try/Catch שלך, זה נראה כאילו הוא פשוט מחליף בדיקה של If (אם כי קשה להיות בטוח).

מבחינה רעיונית, Try/Catch אמורים להיות כאשר אין דרך לוודא שלא תיזרק שגיאה, ולא כאשר זה יותר נוח לכתיבה,

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

כבדות יחסית מבחינת ה-Overhead שלהן.

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

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

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

קישור לתוכן
שתף באתרים אחרים

ניסיתי כבר לעשות את הציור על תמונה בתוך הPIC BOX זאת לא הבעייה .

הבעייה היא בארוע כניסה ויציאה ולחיצה על הכפתור כולו - להזכירך זה יושב על כפתור .

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

קישור לתוכן
שתף באתרים אחרים

מזאת אומרת שה-picturebox יושב בתוך כפתור? האם הם פשוט שניהם באותו מקום ב-form?

אם כן, זה לא משנה בכלל, כל עוד אתה דואג שה-Picturebox יהיה ה"עליון" מביניהם, באמצעות

picGraph.BringToFront()

אחרת, אני לא בדיוק מבין למה אתה מתכוון.

קישור לתוכן
שתף באתרים אחרים

כן, הבנתי את זה.

אבל אין שום "שילוב" בין הכפתור לבין התיבת תמונה. לתיבת התמונה לא אמור להיות

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

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

אם זאת הבעיה, לעשות BringToFront כאשר זה קורה יכול לפתור את הבעיה.

אם זאת לא הבעיה,

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

מהכפתור, שאמרת שהם גורמים לבעיה כלשהי, אך לא הסברת לאיזה בעיה.

קישור לתוכן
שתף באתרים אחרים

מה בדיוק הכוונה שלך בפקד שנמצא על הכפתור?

לא כ"כ ברור לי מה עשית שם - אם אתה רוצה כפתור עם ציור דינמי, אז תשים תמונה בתוך הכפתור (לא פקד, סתם, תמונה) - פשוט button.Background image = myBitmap

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

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

אם זה לא מה שאתה צריך, אז תפרט קצת יותר מה בדיוק הולך שם כי כרגע (לפחות לי) זה לא כ"כ ברור...

קישור לתוכן
שתף באתרים אחרים

חברה תודה רבה על העזרה .

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

NJMAN : אחי, קיים USER CONTROL שיצרתי, שחלק מהאובייקטים שבו זה אובייקט תמונה, שהקוד לציור עליה נמצא בתחילת הדף (למעלה ) .

כל ה-CONTROL הזה, ממקומם על כפתור פשוט בטופס . איך אני עושה שבארוע כניסה/יציאה/לחיצה על הכפתור הפשוט (החיצוני) שום גורם ב-CONTROL שלי לא יעשה לעצמו REPAINT או משהו כזה ????

קישור לתוכן
שתף באתרים אחרים

אתה לא יכול לעשות את זה -אפשר לעשות Override לאירוע צביעה שלו ולבטל אותו במקרים מסויימים,

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

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

על ה"ציור" שלהם למרות שעובר מעליהם עכבר, עושים להם Minimize וכד'.

כמו שכבר אמרתי לך, ו-NJMAN גם כתב זאת, צריך לצייר על תמונה (אובייקט Image כלשהו) ואז לקבוע

אותו בתור ה-Image או BackgroundImage של פקד כלשהו, ואז זה יישאר, כל עוד אתה לא מוחק את

התמונה הזאת איפשהו, למרות אירועי כניסה/יציאה.

קישור לתוכן
שתף באתרים אחרים

ניסיתי לשנות את הקוד ל :

graphics gfx = graphics.formImage(image)

ואני מציב בו את התמונה שב-PICGRAPH

הבעייה שבמצב הזה קורה משהו אחר :

רק בארוע PAINT של כל הכפתור הציור מתעדכן ולא כל תיזמצון שעון

קישור לתוכן
שתף באתרים אחרים

האם לאחר שינוי התמונה אתה קורא ל-Invalidate של הפקד? (או משהו כזה, ישנן מספר אופציות. יש גם Update אני חושב)

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...