none
在VS2005中使用CStatusBarCtrl碰到的奇怪问题 RRS feed

  • 常规讨论

  •        各位大虾,最近碰到一个奇怪的问题,请各位指点一下。
           先说下问题所在吧。首先,创建主工程MFC(Based Dialog),在主工程中调用一个对话框,该对话框在OnInitDialog中利用CStatusBarCtrl创建一个状态栏,可以正常显示,使用;其次,再创建一个工程DLL(MFC),添加对话框,在对话框中按照第一步的方式创建再创建一个状态栏;然后,在主工程中调用第二步创建的DLL,调用其中的对话框,却发现DLL中对话框中状态栏无法显示,调试过程中一切正常,利用GetLastError(),也未发现异常。
          注:1 如果在主工程中,先调用DLL中的对话框,可以看到状态栏,然后再调用主工程中的对话框,则同样看不到状态栏。 反正先调用哪个对话框,就可以正常显示状态栏,后调用的无法显示。
                2 如果在主工程中,先调用主工程的对话框,正确显示状态栏后,再在主工程调用其它类似含有状态栏的对话框,都是可以显示的。

    测试环境如下:
    工具:VS2005+ Sp1,SDK: WM5.0 Pocket SDk
    OS :XP + sp3

    相关代码如下:
      在Dialog初始化时创建StatusBar,具体代码如下:

    主工程,被调用对话框的创建状态栏代码

     CStatusBarCtrl  m_LocalStatus;   //成员变量,头文件中声明

       BOOL bRet = m_LocalStatus.Create(WS_CHILD|WS_VISIBLE|CBRS_BOTTOM, CRect(0,0,0,0), this, 1234);

    if (bRet)
    {
    CRect rect;
    GetClientRect(&rect);
    int widths[STATUSBAR_PART] = { rect.right*9/16, -1};

    m_LocalStatus.SetParts(STATUSBAR_PART, widths);

    m_LocalStatus.SetText(_T("Local Status OK"),0,0);
    }

    DLL中对话框创建状态栏代码:
    CStatusBarCtrl  m_RemoteStatus; //成员变量,头文件中声明

      BOOL bRet = m_RemoteStatus.Create(WS_CHILD|WS_VISIBLE|CBRS_BOTTOM, CRect(0,0,0,0), this, 4321);

      if (bRet)
      {
     CRect rect;
     GetClientRect(&rect);
     int widths[STATUSBAR_PART] = { rect.right*9/16, -1};

      m_RemoteStatus.SetParts(STATUSBAR_PART, widths);

     m_RemoteStatus.SetText(_T("Remote Status OK"),0,0);
      }

        还望各位大侠指点一下!
    2010年1月19日 4:05

全部回复

  • 补充下: 这种方式在EVC4.0 + PPC2003下,编译出的程序经过测试是正常的

    2010年1月19日 5:12
  • MFC DLL 的导出函数第一行加入了
    AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
    宏了吗?
    2010年1月19日 5:20
    版主
  • 首先,谢谢Michael Lee2回答!这个我加啦,现在DLL中对话框是能够正常显示。
    问题是:启动测试程序后,如果首先调用DLL中的对话框(含创建StatusBar)的话,是可以正常显示状态栏的;然后再调用主工程中的对话框(含创建StatusBar),则无法显示状态栏。反之亦然。总之,前后两个步骤,无论先调用哪一个对话框(含创建StatusBar),都是可以正确显示状态栏,后调用的那一个是无法显示状态栏。
         不知道,我描述的清楚不。用个简单的图来表示吧
          
                                     | Button1 ------->调用Dialog, 在OninitDialog中创建状态栏
          Main Dialog ------
                                     | Button2  ------->调用DLL中的Dialog,在OninitDialog中创建状态栏

         测试程序运行后,无论首先点击哪一个Button,都是可以正常显示状态栏的;后点击的,则无法显示状态栏

    2010年1月19日 5:35
  • 怎么上传代码呀?
    如果可以的话,我想把整个测试工程上传
    2010年1月19日 6:34
  • 这个问题很难么?怎么没有人回答?
    2010年1月20日 10:48