启动MDI/SDI程序时,跳出一个登陆对话框窗口,要求输入用户与密码。
用户名将显示在StatusBar上,这个如何实现?比如说,
建立了一个CUsrLogin类,继承CDialog的。CString m_szUsrName用来保存用户名。
如何将m_szUsrName显示在MainFrame的StatusBar上?
===

解决方案 »

  1.   

    用CStatusBar::SetPaneText设置。m_wndStatusBar.SetPaneText(0, m_szUsrName, TRUE);添加宏
    ON_UPDATE_COMMAND_UI(ID_INDICATOR_XXXX, &CMainFrame::OnUpdatePane) // ID_INDICATOR_XXXX为pane的ID实现OnUpdatePane
    void CMainFrame::OnUpdatePane(CCmdUI* pCmdUI)
    {
       pCmdUI->Enable();
    }
      

  2.   

    方法N多种
    你可以在CDialog声明一个变量保存用户名称
    当执行过domodle()后你这个CDialog对象并没有被销毁只不过是HWND销毁而已所以可以得到缓存的用户名称
    也可以通过WM_COPYDATA来实现
    也可以通过命名管道,邮槽,剪贴板,共享内存,实在不行还有dde,rpc
    很多很多中方法,如果上述方法你都不知道那么请用socket
      

  3.   

    domodal之后取dlgXXX.m_UserName(?)然后设置statusbar
      

  4.   

    如果对话框是在InitInstance中显示,可以在InitInstance返回之前设置,将m_pMainWnd强制转换为框架类指针来使用。状态条控件变量应定义为public成员。如果对话框是在框架创建完之后显示,可以在DoModal返回之后设置。设置方法就是用CStatusBar成员的SetPaneText函数。
      

  5.   

    目前的情况:void CMainFrame::OnUpdateIndicatorUsr(CCmdUI* pCmdUI)
    {
    CString szUsrName = "User:";
    szUsrName += m_wndUsrLogin.m_szUsrName;
    pCmdUI->SetText(szUsrName);
    }
    可以将信息显示在StatusBar的某pane中。其中m_wndUsrLogin为CMainFrame的CUsrLogin类成员。不过,在菜单的点击事件处理函数中调用m_wndUsrLogin.DoModal(),仍未实现szUsrName向StatusBar的传送。
      

  6.   

    也就是说,CUsrLogin的m_szUsrName已更新的情况下,如何通知MainFrame更新StatusBar?
    貌似ON_UPDATE_COMMAND_UI只能由key event触发?
      

  7.   

    ((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(……
      

  8.   

    m_wndUsrLogin.DoModal();
    m_wndStatusBar.SetPaneText(0, m_wndUsrLogin.m_szUsrName, TRUE);
    由菜单的点击事件处理函数内,可以了将Dialog窗口的UserName字符串显示在StatusBar上了...而,这样子,将CUsrLogin类成员m_wndUsrLogin放在CMainFrame类内了,
    造成了在SDI/MDI程序启动之前,无法弹出登陆对话框窗口。这如何解决呢?
      

  9.   

    把登陆对话框作为app的第一个窗体
      

  10.   

    void StatusBarMessage(char* fmt, ...)
    {
        if (AfxGetApp() != NULL && AfxGetApp()->m_pMainWnd != NULL)
        {
            char buffer[256];
            CStatusBar* pStatus = (CStatusBar*)
                                  AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);
            va_list argptr;
            va_start(argptr, fmt);
            vsprintf(buffer, fmt, argptr);
            va_end(argptr);
            if (pStatus != NULL)
            {
                pStatus->SetPaneText(0, buffer);
                pStatus->UpdateWindow();
            }
        }
    }
      

  11.   


    在App的InitInstance中添加
    m_wndUsrLogin.DoModal();
    m_cUsrName = (char *)(LPCTSTR)m_wndUsrLogin.m_szUsrName;
    StatusBarMessage(m_cUsrName);实现,OK!
    谢谢各位~~~