各位大家好,我做了个软件,出现闪屏的现象。界面类似于放大的360界面,布满整个屏幕,主界面上面是6个按钮,背景是个bmp贴图,点击上面的某个按钮,会生成子界面覆盖在下面。但每次点击按钮切换子界面时,都会短暂的看到主界面再生成子界面。我感觉是在每次调用子界面时调用了OnEraseBKgnd,因为在这里添加了加载主界面背景贴图的代码。另外,我试了把这部分代码放到OnShowWindow或OnCreate中,都会出现显示的问题。不知怎么改,请各位指点,谢谢

解决方案 »

  1.   

    代码如下:
    int CMainFrame:OnCreate(  )
    {   Long nStyle=GetWindowLong(m_hWnd,GWL_STYLE);
        nStyle=nStyle & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX & ~WS_CAPTION & WS_BORDER & ~WS_CLIPCHILDREN;
        SetWindowLong(m_hWnd,GWL_STYLE,nStyle);
        CreateButton();
        return 0;
    }
    BOOL CMainFrame::PreCreateWindow(   )
    {   cs.Menu=NULL;
        cs.cx=GetSystemMetrics(SM_CXSCREEN);
        cs.cy=GetSystemMetrics(SM_CYSCREEN);
        return true;
    }
      

  2.   

    BOOL CMainFrame:OnEraseBKgnd(CDC* pDC)
    {   HBITMAP hbitmap=(HBITMAP)LoadImage(       );
        .........
        pDC->BitBlt(    );
        .......
        return true;
    }
    void CMainFrame::CreateButton ()
    {    for(int i=0;i<6;i++)
         {  m_button[i].Create(      );
    }
    void CMainFrame::OnButtonClick(UINT nCmdID)
    {   RECT r;
        r.left=0; r.right    .......
        CRuntimeClass* pNewViewClass;
        switch(nCmdID)
        {  case IDC_HEADBUTTON:
              pNewViewClass=RUNTIME_CLASS(CRunView);
              m_pRunView=(CRunView*)CreateViewEx(pNewViewClass,r,true);
              m_pRunView->ShowWindow(SW_SHOW);
              m_pRunView->OnInitUpdate();
              ::SetWindowLong(m_pRunView->m_hWnd,GWL_ID,nCmdID);
              break;
           ..    ..........
    .............
    }
      

  3.   

    设置这两个风格看看
    WS_CLIPCHILDREN
    WS_CLIPSIBLINGS
      

  4.   

    http://vckbase.com/document/viewdoc/?id=1811
      

  5.   

    我已经使用了WS_CLIPCHILDREN,上面代码有误,回去再加上WS_CLIPSIBLINGS试试。
    上面的代码中有子界面的切换,就在OnButtonClick中实现的。
    我今天把原来在OnEraseBkgnd中加载主界面背景图的代码放在OnPaint中,效果好了一些,但还是会出现轻微的闪烁现象。都说使用双缓冲,我对其也没怎么理解,感觉就是先放在内存中,再拷贝到界面上。我的代码应该没问题吧:
       HBITMAP hbitmap=(HBITMAP)LoadImage(            );
      CRect rc;
      CBitmap bkBmp;
      bkBmp.Attach(hbitmap);
      GetUpdateRect(&rc);
      CDC srcDC;
      srcDC.CreateCompatibleDC(pDC);
      SrcDC.SelectObject(bkBmp);
      pDC->BitBlt(      );
      srcDC.DeleteDC();
      bkBmp.DeleteObject();
     
      

  6.   

    你最后需要SelectObject先前返回的CBitmap*
      

  7.   

    SrcDC.SelectObject(bkBmp);
    10楼说的是这个问题吗
      

  8.   

    还有这个操作是在MainFrame中做的,在View类中可以吗
      

  9.   

    上面的OnButtonClick中,生成的每个子界面上面都有加载背景贴图的,包括上面的按钮都有,我原来都是放在OnInitUpdate中处理的,是不是也要放在OnPaint中处理呢,
      

  10.   

    OnEraseBKgnd只返回true
    绘图相关操作整理到OnPaint中