正文

如何在状态条中(CStatusbar Pane)加入Bitmap图2006-09-24 12:55:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/embed/18750.html

分享到:

如何在状态条中(CStatusbar Pane)加入Bitmap图   来自未知  作者佚名         以下的代码将演示如何在状态条的第一个方块中显示Bitmap图。Visual C++ 4.0以后的MFC的CStatusBar使用状态窗口通用控制,所以代码与早期版本有所不同。在一个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...}

阅读(373) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册