אוף עם ה MFC הזה

vinney

Well-known member
אוף עם ה MFC הזה ../images/Emo10.gif

איך אני קובע גודל פקד יחסית לגודל החלון אליו הוא משויך? תודה
 

vinney

Well-known member
ד'ה... ../images/Emo10.gif

אני יודע. הקטע הוא שכשאני עושה את הקוד הבא:
this->GetWindowRect(&rect); MyPropPage.SetWindowPos(this , rect.left, rect.top, rect.right, rect.bottom, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);​
שום דבר לא קורה MyPropPage אגב זה מופע של CPropertySheet.
 

ברנדל

New member
הנה הקוד שעבד אצלי..

void CAsdddDlg::OnOK() { // TODO: Add extra validation here CButton *pButton = (CButton*)GetDlgItem(ID_BUTTON); CRect rect; this->GetWindowRect(&rect); pButton->SetWindowPos(this , rect.left, rect.top, rect.right, rect.bottom, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); // CDialog::OnOK(); }​
 

vinney

Well-known member
זה עובד גם לי

הקטע הוא שאני צריך לעשות CPropertySheet, לא CButton, ועם CPropertySheet זה לא עובד, ולא ברור לי למה!
 

Pembelton

New member
אתה בכלל רואה את הפקד?

כי אם לא, אז תנסה לעשות עליו showwindow() . אם כן, אז תנסה לבצע redrawwindow() (אני לא זוכר את השמות המדויקים של המתודות ב MFC אז השתמשתי בשמות של API מ- win32. זה צריך להיות די דומה)
 

vinney

Well-known member
אני רואה אותו, וזה לא משפיע.

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

Pembelton

New member
הקורדינטות שונות

GetWindowRect מחזיר לך את המיקום של החלון על המסך ב- SetWindowPos אתה צריך לציין מיקום בקורדינטות הפנימיות של החלון (כלומר: 0, 0 זה הפינה הימנית העליונה של החלון האבא)
MyPropPage.SetWindowPos(this, 0, 0, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);​
 

vinney

Well-known member
גם את זה ניסיתי.

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

Pembelton

New member
אולי תפרסם תכנית קטנה שמדגימה

את הבעיה. תסלק את כל מה שלא קשור. זה צריך להיות לא יותר מדי שורות. ובינתיים עוד כיוונים: א. זה לא הגיוני ש GetWindowRect יחזיר לך קורדינטות לא נכונות. אולי אתה מפעיל אותו באוביקט הלא נכון? ב. אתה בטוח שהפקד שלך הוא אכן פקד ולא top-level-window? ג. אתה בטוח שהחלון החיצוני הוא אכן חלון האבא של הפקד שלך?
 

vinney

Well-known member
קח דוגמא, תנסה לעזור לי

אני מאוד אשמח, כי זה משגע אותי
תשנה את הקובץ מTXT לZIP, ותפתח אותו.
 

דריזט

New member
לא להתייאש, פתרתי את התעלומה ../images/Emo13.gif

ראשית העף את SWP_NOSIZE, ולאחר מכן תשנה גם את הגודל של ה CTabCtrl ששייך ל CproperySheet ע"י GetTabCtrl(). שים לב שיש הבדל קטן בין שינוי הגודל של שניהם לבין שינוי TabCtrl בלבד - במקרה השני הלחצנים OK ו CANCEL עליונים, ואילו במקרה הראשון לא רואים אותם. נ.ב. בשביל הסיפור, הגעתי לפתרון ע"י זה שהשוותי את rect ל MyPropSheet.GetClientRect , ראיתי שהם דומים, ולכן הסקתי שצריך לשנות את גודלו של פקד אחר. להלן הקוד המשופץ:
CRect rect; GetClientRect(&rect); MyPropPage.AddPage(&m_StamDlg); MyPropPage.Create(this, WS_CHILD|WS_VISIBLE, 0); MyPropPage.ModifyStyleEx (0, WS_EX_CONTROLPARENT); MyPropPage.ModifyStyle (0, WS_TABSTOP ); MyPropPage.SetWindowPos(this , rect.left, rect.top, rect.right, rect.bottom, SWP_NOZORDER | SWP_NOACTIVATE); CTabCtrl *tc = MyPropPage.GetTabControl(); tc->SetWindowPos(this, rect.left, rect.top, rect.right, rect.bottom, SWP_NOZORDER | SWP_NOACTIVATE);​
 

vinney

Well-known member
כן כן...

אם זה היה תלוי בי הייתי כותב את זה ב#C, אני שונא MFC... זה LEGACY של מישהו אחר, שאני צריך להפעיל...
 
למעלה