CSplitterWnd ו-MFC

voguemaster

New member
CSplitterWnd ו-MFC

חבר'ה נתקלתי בבעיה מעצבנת. אני מנסה ליצור אפליקציה ב-MFC שהחלון בתוכה מחולק לשלושה חלקים. אני יודע לחלק אותו לשניים ע"י CSplitterWnd אבל אני רוצה לחלק את אחד ה-panes פעם נוספת כדי שייווצר לי חלון בסגנון זה של ++VC הבנתי שאני צריך ליצור מחלקה שיורשת מ-CSplitterWnd שמגדירה את DECLARE_DYNAMIC כדי ש-MFC תוכל ליצור דינמית את המחלקה. בקוד האיתחול עקבתי אחרי הדוגמא שלהם (VIEWEX) וזה נראה כאילו אמור לעבוד. אח"כ גיליתי שהם עובדים עם CMDIFrameWnd ולא CFrameWnd כמו שאני עשיתי, אז ביצעתי את השינוי וגם עבדתי עם CMultiDocTemplate במקום ה-CSingleDocTemplate הרגיל ש-APP WIZARD יוצר לי. עכשיו הכל מתקמפל אבל כשאני מריץ החלון מופיע לשבריר שנייה ונעלם. כשאני עובד עם sinle doc ו-CFrameWnd החלון נשאר אבל מה שרואים בתור תוכן החלון הוא מה שהיה שם קודם (חלק מהתצוגה של ++VC
) ואין עידכון לחלון בשום צורה
מישהו התעסק עם זה פעם ? גלעד ? מישהו ?
 

gilad_no

New member
התעסקתי הרבה, אבל רק עם WTL

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

voguemaster

New member
אין לי בעיה לנסות WTL

או כל דבר אחר בעצם, אבל אני צריך להישאר במסגרת ++C. מה שמצחיק זה שבג'אווה הייתי עושה את זה ב-5 דקות בלי להתאמץ
(עוד דרישה של האפליקציה שלי היא גישה ל-DB ו-JDBC זה פיתרון ממוסד וטוב
.. נו טוף..)
 

gilad_no

New member
בWTL:

אתה יוצר 2 CSplitterWindow: נקרא להם m_Split1,m_Split2. לאחר מכן, לm_Split2, אתה משייך 2 תצוגות בעזרת SetSplitterPanes. ולבסוף, לm_Split1 אתה משייך תצוגה נוספת ואת הספליטר השני ע"י SetSplitterPanes.
LRESULT CMainFrame::OnCreate(...) { ... CRect Rect; GetClientRect(&Rect); m_Split1.Create(m_hWnd,Rect,NULL,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN); m_Split2.Create(m_Split1,Rect,NULL,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN); m_view1.Create(...); m_view2.Create(...); m_view2.Create(...); m_Split2.SetSplitterPanes(m_View2,m_View3); m_Split2.SetSplitterPos(Rect.Width()/3); m_Split1.SetSplitterPanes(m_View1,m_Split2); m_Split1.SetSplitterPos(Rect.Width()/3); }​
 

כאגאי

New member
אם הבנתי מה אתה רוצה, אז:

במחלקת המסגרת תיצור 2 משתנים מסוג CSplitterWnd ואז תדרוס את הפונקציה OnCreateClient ותוסיף שם:
if(!m_sp1.CreateStatic(this,1,2) || !m_sp1.CreateView(0,0,RUNTIME_CLASS(HACLASS_SHELCHA), CSize(200,0), pContext) || !m_sp2.CreateStatic(&m_sp1,2,1,WS_CHILD|WS_VISIBLE,m_sp1.IdFromRowCol(0,1)) || !m_sp2.CreateView(0,0,RUNTIME_CLASS(HACLASS_SHELCHA), CSize(0,100), pContext) || !m_sp2.CreateView(1,0,RUNTIME_CLASS(HACLASS_SHELCHA), CSize(0,0), pContext) || ) return FALSE; return TRUE;​
או, משהו כזה. הקלסים שם יכולים להיות מסוג שונה.
 

כאגאי

New member
לא, לא, אז תשים טוב לב למספרים

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

voguemaster

New member
תודה אבל זה לא ממש עוזר...

בכל מקרה, כנראה שיהיה לי יותר נכון לעבוד עם MDI היות והאפליקציה מנהלת כמה מסמכים במקביל. אני אשמור את ההתעסקות של בניית GUI בחלונות לאח"כ. אני מניח שאני אנסה את WTL ואם יתאפשר אני אחקור את הבעיה של ה-splitters יותר לעומק. מה שכן, סמוך על מיקרוסופט שה-framework שלהם יכולה לעשות כל ממשק שהוא אבל רק הם יודעים איך להשתמש בה כמו שצריך
(אם הייתי יודע לבנות ממשק ברמה של VS עם MFC, הייתי הרבה יותר שמח עכשיו
)
 

galh

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

שתי ספריות שעושות לך את החיים הרבה יותר קלים כאשר כותבים GUI. שתיהן כוללות "אשפים" שמאפשרים לך, ע"י לחיצה על ה- Next לקבל ממשק בסגנון VS (אבל ריק
).
 

mag net

New member
ממשק

אין בעיה לעשות חלון MDI מפוצל. בכל מקרה אם תחליט על GUI מבוסס MFC תוכל ללמוד מהדוגמא שנתתי מספר עקרונות תכנות GUI (אין בעיה להגיע גם לממשק ברמה של VS זה כמובן מצריך עבודה).
 

voguemaster

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

אבל עם MDI אני כבר לא לגמרי בטוח שאני צריך את הפיצולים. בכל מקרה, מרגיז אותי ב-MFC ובכלל עם טכנולוגיות של מיקרוסופט זה שהן מנסות בכל הכוח לחסוך לך עבודה אבל ברגע שאתה צריך משהו שהוא קצת שונה ממה שהם חשבו עליו, לך תחפש ת'חברים שלך כדי לגלות איך עושים את זה. מה הקטע בסופו של דבר ? אם הם טוענים בתיעוד של CSplitterWnd שאפשר לשים כל מחלקה שיורשת מ-CWnd בתור אחד ה-Views שלפחות תהיה דוגמא נורמלית (VIEWEX זו לא דוגמא נורמלית!) ושיספרו מה בדיוק צריך לשם כך כי מסתבר שזה לא טריויאלי (עשיתי בדיוק מה שהם עשו בדוגמא וזה לא עבד..).
 

mag net

New member
ממשקים ושאר ירקות

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