Как сделать ребенка переключателем?

#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