חזרה ל CWinApp מCDןשךםע בMFC

frangelico

New member
חזרה ל CWinApp מCDןשךםע בMFC

יש לי תכנית ב MFC שבה יש 2 מחלקות בלבד: אחת CTheApp שיש לה ב m_pMainWnd חלון מסוג Dialog. הייתי רוצה לדעת אם אפשר ואיך לגרום לחלון במצב מסויים להיסגר ולחזור ל ל InitInstance של CWinApp, לבדוק את הערך המוחזר ולפעול בהתאם ?. פונקציית InitInstance מובאת להלן:
#include <afxwin.h> #include "matrixdlg.h" #include "startDialog.h" #include "theapp.h" //#include "resource.h" BOOL CTheApp::InitInstance() { int nResponse; CMatrixDialog MatrixDialog; m_pMainWnd = &MatrixDialog; while( (nResponse = MatrixDialog.DoModal()) == AGAIN); return FALSE; }​
תודה לעונים.
 

vinney

Well-known member
CDialog::EndDialog

הפרמטר של הפונקציה הזאת זה הערך המוחזר.
 

frangelico

New member
עובד תודה אבל עדיין יש

לי בעייה. האם לא ניתן לבצע לפתוח את אותו Dialog שוב בלולאה ? כך:
#include <afxwin.h> #include "matrixdlg.h" #include "startDialog.h" #include "theapp.h" //#include "resource.h" BOOL CTheApp::InitInstance() { int nResponse; do { CMatrixDialog *MatrixDialog = new CMatrixDialog(); m_pMainWnd = MatrixDialog; nResponse = MatrixDialog->DoModal(); delete MatrixDialog; } while (nResponse == 1); return FALSE; }​
כי למרות ש תנאי ה while מתקיים החלון לא נפתח בפעם השנייה.
 

vinney

Well-known member
למה אתה עושה את זה ככה?

כשניסיתי את זה יצא לי LOOP אינסופי, הדיאלוג המשיך כל הזמן לקבל את הMESSAGE האחרון. לא ברור לי למה. בכל מקרה זה לא נראה לי פתרון טוב. מה אתה מנסה להשיג בזה?
 

frangelico

New member
יש לי עוד כמה סוגים של

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

selalerer

New member
באופן כללי:

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

frangelico

New member
כל הרעיון הוא

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

selalerer

New member
קח בחשבון שיש לזה המון תקורה.

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

vinney

Well-known member
למה אתה עובד קשה?

אתה אולי חוסך קוד, אבל בתכל'ס זה ירוץ לאט ומעצבן. במקום זה תשחק כל הזמן עם SHOW וHIDE - הרי פקד יכול להיות בלתי נראה, זה יהיה הרבה הרבה יותר מהר מלהרוס ולהקים את הפקד מחדש. לך זה יוסיף עוד 10 שורות קוד.
 

frangelico

New member
כן ירדתי מהרעיון הנ"ל ואני

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