#c #winapi #mfc
Вопрос:
Я создаю фрейм входа в систему, который может переключаться, как обычно, в зависимости от ситуации, например, успешный вход в систему, смена ребенка. и выйдите из системы тоже. но мой переключатель застрял в этом процессе. вход-gt;выход-gt;gt;вход. после 2-го входа в систему. ребенок не хочет возвращаться к выходу из системы. он застрял. Я проверил это несколько раз и попробовал все, например, добавить окно обновления, установить окна
#define LOGIN_BTN 1 #define LOGOUT_BTN 2 class CMainFrame: public CFrameWnd { public: CMainFrame() { Create( NULL, "Learn MFC", WS_OVERLAPPEDWINDOW, CRect(CPoint(100, 100), CSize(640, 360))); }; protected: afx_msg int OnCreate(LPCREATESTRUCT); afx_msg void login(); afx_msg void logout(); DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_CREATE() ON_COMMAND(LOGIN_BTN, amp;CMainFrame::login) ON_COMMAND(LOGOUT_BTN, amp;CMainFrame::logout) END_MESSAGE_MAP() int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { CButton* loginBtn = new CButton(); loginBtn-gt;Create( "Login", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(CPoint(100, 60), CSize(150, 25)), this, LOGIN_BTN); return 0; }; void CMainFrame::login() { std::string resServer = "token"; if(resServer == "token") { // Destroy all childs window while(GetWindow(GW_CHILD)) { CWnd* pChild = GetWindow(GW_CHILD); pChild-gt;DestroyWindow(); } CButton* logoutBtn = new CButton; logoutBtn-gt;Create( "Logout", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(CPoint(100, 60), CSize(150, 25)), this, LOGOUT_BTN); }; } void CMainFrame::logout() { CButton* loginBtn = new CButton(); loginBtn-gt;Create( "Login", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(CPoint(100, 60), CSize(150, 25)), this, LOGIN_BTN); }; class CApplication : public CWinApp { BOOL InitInstance() { CMainFrame* mainWnd = new CMainFrame(); m_pMainWnd = mainWnd; mainWnd-gt;ShowWindow(SW_NORMAL); mainWnd-gt;UpdateWindow(); return TRUE; } }; CApplication app;
Комментарии:
1. Этот код содержит утечки памяти — кнопки создаются, но не освобождаются. Упростите его, имея только одну кнопку, которая изменяет свой текст на «вход» и «выход» в зависимости от текущего состояния. Добавьте также логический флаг, который является истинным, если пользователь вошел в систему.
2. @AlexF мой реальный код так длинен, что кнопки выхода из позиции там точно нет. но в середине. хорошо, я исправляю утечку памяти, вместо этого вызываю DestroyWindow. Я просто удаляю дескриптор объекта. удалите ребенка. Но все равно застрял.
3. @AlexF Спасибо, я исправляю это сейчас, кстати, как вызвать onCreate, который уже определяет метод выхода из системы? Мой настоящий код в onCreate так долго. Если я скопирую его для выхода из системы. это дублирует реализацию в моем коде.
4. @AlexF Подумав, я просто переворачиваю свою реализацию on create в метод представления. так что я могу вызвать это позже внутри метода выхода из системы. ty