תפיסת חלק מהמסך

gilad_no

New member
תפיסת חלק מהמסך

אני צריך לכתוב משהו שמשתמש יוכל לסמן חלק מהמסך. כאשר הוא לוחץ על צירוף מקשים כלשהו (לא משנה באיזה חלון), הסמן ישתנה לריבוע שיהיה אפשר לשנות את גודלו - וכאשר הוא יעזוב את הלחצן, התוכן שהוא סימן יועתק למחסנית מסוימת. את תפיסת הארועים אני אבצע עם HOOK לעכבר ומקלדת, אבל אני מחפש קוד דוגמא שמצייר ריבוע שאפשר לשנות את גודלו (על המסך - לא בחלון שלי!). בחלון משלי זה עובד לי מצויין, אבל יש לי בעיה עם הREDRAW של המסך הראשי כאשר אני מנסה לצייר עליו. אשמח אם מישהו יימצא לי קוד דוגמא. גלעד
 

scalla

New member
למה שלא תשמור את תוכן הריבוע

לפני שאתה מצייר עליו (אני מתכוון רק למסגרת שאתה מצייר).
 

gilad_no

New member
כי אני לא מצייר על הכל

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

scalla

New member
אם היה חידוש אז מן הסתם גם ככה

היתה צריך לצייר את הריבוע מחדש.
 

gilad_no

New member
לאו דווקא

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

scalla

New member
אם ככה

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

galh

New member
הדרך לעשות את זה היא...

ע"י תפיסת האירוע של לחיצה על עכבר, ואז לעשות את העבודה באירוע של MouseMove. מציירים על המסך אחרי שעובדים למצב של R2_XORPEN באמצעות ה- API בשם SetROP2. תופסים את ה- DC של החלון הראשי, ואז מציירים עליו. קודם "מוחקים" את הריבוע הישן עי חזרה של ציור הריבוע ואז מציירים את הריבוע החדש. ואם לא הייתי מספיק ברור:
void COnDrawDlg::OnMouseMove(UINT nFlags, CPoint point) { // Do the magic... if (m_bMouseDrag == TRUE) { HDC hScrDC = ::GetWindowDC(NULL); CPen pen(PS_SOLID, 1, RGB(0, 0, 0)); CDC cdc; CPoint ptButtomLeft(point); ClientToScreen(&ptButtomLeft); cdc.Attach(hScrDC); cdc.SetROP2(R2_NOTXORPEN); cdc.SelectObject(pen); // Erase previous rectangle. cdc.MoveTo(m_ptTopLeft); cdc.LineTo(m_ptPrev.x, m_ptTopLeft.y); cdc.LineTo(m_ptPrev.x, m_ptPrev.y); cdc.LineTo(m_ptTopLeft.x, m_ptPrev.y); cdc.LineTo(m_ptTopLeft); // Draw new rectangle. cdc.MoveTo(m_ptTopLeft); cdc.LineTo(ptButtomLeft.x, m_ptTopLeft.y); cdc.LineTo(ptButtomLeft.x, ptButtomLeft.y); cdc.LineTo(m_ptTopLeft.x, ptButtomLeft.y); cdc.LineTo(m_ptTopLeft); cdc.Detach(); // Draw previous point for erasing rectangle. m_ptPrev = ptButtomLeft; } CDialog::OnMouseMove(nFlags, point); }​
 
למעלה