ושוב MFC

annefan

New member
ושוב MFC

מתוך פונקצית InitInstance של CguiApp (המחלקה המייצגת את האפליקציה ב-MFC):
// This part works!! CguiApp dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); // This part doesn't
CguiApp dlg2; m_pMainWnd = &dlg2; nResponse = dlg2.DoModal();​
החלק הראשון מיוצר כחלק מהאשף של VS, והוא עובד. החלק השני, כלומר יצירת דיאלוג נוסף, אחרי סיום הראשון, לא מצליח. נראה לי שהוא נוצר אבל לא מוצג, או משהו כזה. מה הסיפור? (ולממליצים, התחלתי לקרוא את החלק השני של Prosise (איזה כיף שיש ספריה גדולה בעבודה!). מי המליץ פה פעם על MFC Internals?)
 

selalerer

New member
אני חושב שהעניין הוא כזה....

...אני לא מומחה לMFC אז אל תיקח את זה יותר מידיי ברצינות, אבל מה שנראה לי זה שברגע שאתה קובע Dialog בתור החלון הראשי של התוכנית והוא מסתיים, אז התוכנית מסתיימת ולא רץ יותר שום קוד של התוכנית אח"כ, אבל יכול להיות שאני טועה
.
 

annefan

New member
מה זה, כישוף??

יש יצירת דיאלוג, השמה ל-member והפעלת פונקציה (שעקבתי אחריה ולא ראיתי פעולה מיוחדת כזו). למה אי אפשר ליצור דיאלוג חדש, והפעלת פונקציה עליו?
 

voguemaster

New member
אהמ אהמ

ליצור דיאלוג ע"י ירושה מ-CDialog זה סבבה. אבל דברים מוזרים יקרו אם תנסה ליצור יותר מ-instance אחד של מחלקת האפליקציה הראשית שלך!
 

annefan

New member
התבלבתי

ה-InitInstance הוא של Cguiapp, ו-dlg הם של Cguidlg (בדיוק כמו ב-wizard):
BOOL CMyguiApp::InitInstance() { InitCommonControls(); CWinApp::InitInstance(); AfxEnableControlContainer(); SetRegistryKey(_T("Local AppWizard-Generated Applications")); CMyguiDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); CMyguiDlg dlg2; m_pMainWnd = &dlg2; nResponse = dlg2.DoModal(); ... }​
זה הקוד, והשאלה המקורית אקטואלית.
 

david o

New member
הבעיה היא בהודעה WM_QUIT

נסה לשים את הקוד הבא בין שני הדיאלוגים:
MSG msg; while :):peekMessage( &msg, NULL, 0, 0, PM_REMOVE )) if ( msg.message == WM_QUIT ) break;​
נלקח מפה.
 

david o

New member
שווה להירשם ../images/Emo45.gif

אך לטובת העצלנים (
), להלן השרשור המלא (בעריכה קלה):
the problem seems to be the expression 'm_pMainWnd = &dlg;'. I think because the application sees the first dialog as main window a WM_QUIT message is posted when it is destroyed. Just remove this line and it works without problems. ---- This works! But do you know the purpose of this main window? Cause if I change my code like this (see below) m_pMainWnd will never be assigned when the user presses "Cancel". CTestdlgDlg dlg; if (dlg.DoModal() == IDOK) { CTestdlgDlg dlg2; m_pMainWnd = &dlg2; dlg2.DoModal(); } ----- there's another way for this without changing the m_pMainWnd pointer. You can catch the WM_QUIT message before showing the second dialog with something like this: CTestdlgDlg dlg; int result = dlg.DoModal(); // remove WM_QUIT message from queue MSG msg; while :):peekMessage( &msg, NULL, 0, 0, PM_REMOVE )) if ( msg.message == WM_QUIT ) break; // process dialogs return value if (result == IDOK) { CTestdlgDlg dlg2; m_pMainWnd = &dlg2; dlg2.DoModal(); }​
גם בתשובה האחרונה מושמטת ההשמה, אבל נראה לי שזו שגיאה (לא בדקתי).
 

david o

New member
זה חינם אם נרשמים כמומחה

בדף הרישום יש את האפשרות Earn Your Membership - זה מה שאתה מחפש.
 

selalerer

New member
BLACK MAGIC.

נראה לי הגיוני שאם עושים member בשם mainWin אז שהוא מסתיים המחלקה מניחה שהתוכנית הסתיימה.
 

DadleFish

New member
אני ממליץ על MFC Internals,

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

annefan

New member
התחלתי לקרוא אותו

(כבר אמרתי שזה כיף שיש ספריה גדולה בעבודה?)
 
למעלה