想在状态栏里,放置一幅位图(圆圈),来反应数据库连接的状态,红色表示连接失败,绿色表示成功。请问该怎么实现?

解决方案 »

  1.   

    void CMainFrame::OnChange() 
    {
    // TODO: Add your command handler code here
    CRect rect;
    m_wndStatusBar.GetClientRect(rect);
    CDC *pDc=m_wndStatusBar.GetDC();

    pDc->TextOut(rect.left ,rect.top,"X");//实验性的
    你可以pDc->BitBlt( 加上位图)

    }
      

  2.   

    look this:
    http://www.codeguru.com/statusbar/XStatusBar.shtml
      

  3.   

    不会把,我可是测试过才发的哦.你怎么加的?还有一种方法,比较麻烦要改写CStatusBar 类,你可以参考VISUAL C++MFC扩展编程实例 5.7   实例13:在状态栏中添加图标 136
      

  4.   

    在一个AppWizard应用的状态条中加入一个新的方块,在Mainfrm.cpp中加入下列语句 
    //Mainfrm.cppstatic UINT indicators[] =
    {
        ID_SEPARATOR, // status line indicator
        ID_INDICATOR_BITMAP,    // BITMAP状态条
        ID_INDICATOR_CAPS,
        ID_INDICATOR_NUM,
        ID_INDICATOR_SCRL,
    };从CStatusBar派生一个新类(例如CBitmapStatusBar),并且用这个新类取代CMainFrame中的CStatusBar(Mainfrm.h) 
    //Mainfrm.h//CStatusBar m_wndStatusBar;
    CBitmapStatusBar m_wndStatusBar;在新类的.h和.cpp中加入下面两个函数的声明和定义 
    //BitmapStatusBar.hclass CMyStatusBar : public CStatusBar {...
        #if _MFC_VER < 0x400
            virtual void DoPaint(CDC* pDC);
        #else
            virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
        #endif
         ...}//BitmapStatusBar.cpp#if _MFC_VER < 0x400
        void CBitmapStatusBar::DoPaint(CDC* pDC)
        {
            CRect rect;
            GetItemRect(1, &rect); //得到pane的大小
            pDC->ExcludeClipRect(&rect); //创建新的裁剪区域
            CStatusBar::DoPaint(pDC); //描绘状态条(status bar)的其余部分        CRgn paneRgn;
            paneRgn.CreateRectRgnIndirect(rect);
            pDC->SelectClipRgn(&paneRgn); //选择裁剪区域        CBitmap pBitmap;
            //加载位图,使用Import从文件加载资源,可以不受调色板限制
            pBitmap.LoadBitmap(IDB_BITMAP1);        //将当前位图放入兼容CDC
            CDC SourceDC;
            SourceDC.CreateCompatibleDC(NULL);//生成兼容的CDC
            CBitmap* pOldBitmap = SourceDC.SelectObject(&pBitmap);//选择位图
            pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
                       &SourceDC, 0, 0, SRCCOPY);//BitBlt
            SourceDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图
            pBitmap.DeleteObject();//删除位图
        }
    #else
        void CBitmapStatusBar::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
        {
            switch(lpDrawItemStruct->itemID)
            {
            case 1:
                //从资源中选择位图
                CBitmap pBitmap;
                //加载位图,使用Import从文件加载资源,可以不受调色板限制
                pBitmap.LoadBitmap(IDB_BITMAP1);            //将状态条(StatusBar)附加到一个CDC对象
                CDC dc,SourceDC;
                dc.Attach(lpDrawItemStruct->hDC);            //得到pane的大小和坐标
                CRect rect(&lpDrawItemStruct->rcItem);            //将当前位图放入兼容CDC
                SourceDC.CreateCompatibleDC(NULL);//生成兼容的CDC
                CBitmap* pOldBitmap = SourceDC.SelectObject(&pBitmap);//选择位图
                dc.BitBlt(rect].left, rect.top, rect.Width(), rect.Height(),
                         &SourceDC, 0, 0, SRCCOPY);//BitBlt
                SourceDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图
                pBitmap.DeleteObject();//删除位图            //将状态条(StatusBar)与CDC对象分离,否则hDC将会在CDC废弃时被删除
                dc.Detach();            return;
            }
            CStatusBar::DrawItem(lpDrawItemStruct);
        }
    #endif在Mainfrm.cpp的CMainFrame::OnCreate()中加入下面的代码 
    //Mainfrm.cppint CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){...
        if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))){
        TRACE0("Failed to create status bar\n");
        return -1;      // fail to create
        }
       //加入下列代码
       #if _MFC_VER >= 0x400
          UINT nID, nStyle;
          int cxWidth;      m_wndStatusBar.GetPaneInfo(1, nID, nStyle, cxWidth);
          m_wndStatusBar.SetPaneInfo(1, nID, nStyle | SBT_OWNERDRAW, cxWidth);
       #endif
    ...}