基于对话框的工程OnPaint()函数里:
                  m_StatBar = new CStatusBarCtrl; // 在头文件定义:CStatusBarCtrl* m_StatBar; 
CRect  m_Rect; 
GetClientRect(&m_Rect); 
m_Rect.top=m_Rect.bottom-20; //
if(!m_StatBar->m_hWnd)
{
m_StatBar->Create(WS_BORDER|WS_VISIBLE,m_Rect,this,3);  //创建状态栏
int nParts[4]={100,200,300,-1}; 
m_StatBar->SetParts(4,nParts); 
m_StatBar->SetText(_T("这是第一个指示器"),0,0); 
m_StatBar->SetText(_T("这是第二个指示器"),1,0); 
//m_StatBar->ShowWindow(SW_SHOW);
}
else
{
m_StatBar->MoveWindow(&m_Rect,false);//如果已创建,就把状态栏移到新位置
}
运行时可以看到状态栏,但是拉动改变主对话框的大小时,
会显示出以前的状态栏(即看到很多状态栏),不知我这样表达,大家是否可以理解我的意思
对于这种情况,怎么解决啊???

解决方案 »

  1.   

    不要在OnPaint里创建,把你上面的代码都移到OnInitDialog里去
      

  2.   

    你在onpaint中创建,你只要移动窗口就会重绘,就会创建一个状态栏,所以很多个
      

  3.   

    你在OnInitDialog中创建就可以,
      

  4.   

    只需做一次的工作,放到OnInitDialog中
      

  5.   

    m_StatBar->MoveWindow(&m_Rect,false);还是放到ONPAINT里面,其他的部分当到OnInitDialog中
      

  6.   

    创建放到OnInitDialog里,改变位置和大小的放到OnSize里面。
      

  7.   

    原来我做过的对话框状态栏用的是CStatusBar。改变状态栏的位置是用的RepositionBars,这个函数会自动调整工具栏和状态栏的位置。不知道这么用合不合适,反正我这么用可以,状态栏也不闪,不知道用CStatusBarCtrl可以不。
      

  8.   

    先不说闪烁问题了,
    OnSize(UINT nType, int cx, int cy)
    {
            // 对话框宽度和高度的增量
    int iIncrementX = cx - m_iClientWidth; //m_iClientWidth:对话框原宽度
    int iIncrementY = cy - m_iClientHeight;//m_iClientHeight:对话框原高度                  CRect rectSta;
    m_StatusBar.GetWindowRect(rectSta);
    ScreenToClient(rectSta);
    int iLeft = rectSta.left;
    int iTop = rectSta.top;
    int iWidth = rectSta.Width();
    int iHeight = rectSta.Height();
    iTop+=iIncrementY;            //相应增加
    iWidth+=iIncrementX;          //宽度,随着对话框相应增加
    m_StatusBar.MoveWindow(iLeft, iTop, iWidth, iHeight);
    }问题:拉动主对话框,只改变宽度时,可以显示出状态栏,而只改变高度时(高度和宽度都改变时),状态栏就消失了,是不是这代码    iTop+=iIncrementY;   不对??
    解决问题就结贴
      

  9.   

    BOOL CTestDlg::OnInitDialog()
    {
    // ... // 在类头文件中有声明 CStatusBarCtrl m_wndStatusBar;
    m_wndStatusBar.Create(WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP, 
    CRect(0, 0, 0, 0), this, 5000);
    int nParts[4] = {100, 200, 300, -1}; 
    m_wndStatusBar.SetParts(4, nParts); 
    m_wndStatusBar.SetText(_T("这是第一个指示器"), 0, 0); 
    m_wndStatusBar.SetText(_T("这是第二个指示器"), 1, 0); // ...
    }void CTestDlg::OnSize(UINT nType, int cx, int cy)
    {
    CDialog::OnSize(nType, cx, cy); if (IsWindow(m_wndStatusBar.GetSafeHwnd()))
    {
    m_wndStatusBar.MoveWindow(0, 0, cx, cy);
    }
    }