如题!请赐教!

解决方案 »

  1.   

    先导入一张BMP图片,生成ID标识IDB_BITMAP
    再设置Static控件的属性General - type - bitmap,image - IDB_BITMAP
      

  2.   

    //读位图数据,并创建位图
    BOOL CBmpFieldDlg::ReadFromBLOB(CByteArray & DBArray)
    {
    CByteArray Array;
    Array.Copy( DBArray); 

    //获得位图文件头信息长度
    int HeaderLen =   78 + sizeof(BITMAPFILEHEADER); 
    Array.RemoveAt( 0, HeaderLen ); // I cut all Headers 
        
    //获得位图信息  
    BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)
    Array.GetData() ;
        BITMAPINFO &bmInfo = *(LPBITMAPINFO)Array.GetData() ;

    //获得位图颜色数
        int nColors = bmiHeader.biClrUsed ?
    bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount; //获得位图数据
        LPVOID lpDIBBits;
        if( bmInfo.bmiHeader.biBitCount > 8 )
           lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors 
       + bmInfo.bmiHeader.biClrUsed) + 
           ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ?
       3 : 0));
         else
            lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);     CClientDC dc(NULL);  //创建位图
     HBITMAP hBmp = CreateDIBitmap( dc.m_hDC,   
                        &bmiHeader,     
                                    CBM_INIT,       
                                    lpDIBBits,      
                                    &bmInfo,        
                                    DIB_RGB_COLORS);
         
    OleBmp.Attach( hBmp ); //清除临时数组
    Array.RemoveAll(); return TRUE;
    }
      

  3.   

    HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance, "C:\\test.bmp", 
    IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    HDC hDC;
    CStatic *ps = (CStatic *)GetDlgItem(IDC_TEXT);//IDC_TEXT是Static控件的ID
    CDC *pDC = ps->GetDC();
    hDC = CreateCompatibleDC(pDC->GetSafeHdc());
    SelectObject(hDC, hBitmap);
    CRect r;
    ps->GetClientRect(&r);
    BitBlt(pDC->GetSafeHdc(), 0, 0, r.Width(), r.Height(), hDC, 0, 0, SRCCOPY);
      

  4.   

    CBitmap m_mapstore;

    m_mapstore.LoadBitmap(IDB_BITMAP1);
    m_Map.SetBitmap(m_mapstore);这样就可以了,m_Map 是Static里的CStatic类型变量
      

  5.   

    BOOL CTtDlg::SetBkndBMP(HWND hwnd,LPCTSTR szName)
    {
    HDC hDesDC =::GetDC(hwnd);
    BITMAP bm;
    RECT rect;
    HDC hSrcDC = ::CreateCompatibleDC(hDesDC);
    HBITMAP hBitMap;
    HBITMAP hOldBitMap; hBitMap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),szName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); ::GetObject(hBitMap,sizeof(BITMAP),&bm);
    ::GetClientRect(hwnd,&rect); ::SetStretchBltMode(hDesDC,
    COLORONCOLOR
    ); hOldBitMap = (HBITMAP)::SelectObject(hSrcDC,hBitMap);
    ::StretchBlt(hDesDC,rect.left,rect.top,rect.right,rect.bottom,hSrcDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
    ::SelectObject(hSrcDC,hOldBitMap);
    ::InvalidateRect(hwnd,&rect,FALSE); ::ReleaseDC(hwnd,hDesDC);
    ::DeleteDC(hSrcDC);
    ::DeleteObject(hOldBitMap);
    ::DeleteObject(hBitMap); return TRUE;
    }但是有个问题,控件被覆盖了图像不能刷新,不知道怎么解决?我使用hBitmap为全局变量,又出现新得问题:显示多个图像会造成内存泄漏,大家探讨探讨
      

  6.   

    给你一个我的工程里的代码片段,
    不过要使用GDIPLUS// CStaticPic windowclass CStaticPic : public CStatic
    {
    // Construction
    public:
    CStaticPic();
    CString m_szFile;
    // Attributes
    public:// Operations
    public:// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CStaticPic)
    //}}AFX_VIRTUAL// Implementation
    public:
    virtual ~CStaticPic(); // Generated message map functions
    protected:
    //{{AFX_MSG(CStaticPic)
    afx_msg void OnPaint();
    //}}AFX_MSG DECLARE_MESSAGE_MAP()
    };/////////////////////////////////////////////////////////////////////////////
    // CStaticPicCStaticPic::CStaticPic()
    {
    m_szFile.Empty();
    }CStaticPic::~CStaticPic()
    {
    }
    BEGIN_MESSAGE_MAP(CStaticPic, CStatic)
    //{{AFX_MSG_MAP(CStaticPic)
    ON_WM_PAINT()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CStaticPic message handlersvoid CStaticPic::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting

    // TODO: Add your message handler code here
    CRect rect;
    GetClientRect(&rect);
    // dc.FillSolidRect(&rect,RGB(0,0,0));

    if(m_szFile.IsEmpty())
    {
    return;
    }
    rect.DeflateRect(1,1,2,2);
    CString szBmpFile=g_GetHomeDirectory();
    szBmpFile+="system\\";
    m_szFile.TrimRight();
    szBmpFile+=m_szFile; Graphics graphics(dc.m_hDC); Image* pImage=g_MyImgae.Get(szBmpFile); graphics.DrawImage(pImage,rect.left,rect.top,rect.right,rect.bottom); // Do not call CStatic::OnPaint() for painting messages
    }
      

  7.   

    LoadImage函数得到文件位图句柄,然后画位图在相应的dc上
      

  8.   

    void DrawBMP(CDC* pDC,int iLogPixelX,int iLogPixelY,const char *strFileName)
    {
    CDC MemDC; // 内存设备环境指针,在视的整个存在过程都将存在
    CBitmap Bitmap,*pOldBmp;  
    CRect Source, Dest; // 记录源位图尺寸和最终显示尺寸
    BITMAP bm;
    if(MemDC.GetSafeHdc() == NULL)
    {
    HBITMAP hbitmap=(HBITMAP)LoadImage(0,strFileName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
    Bitmap.Attach(hbitmap);
    MemDC.CreateCompatibleDC(pDC);
    Bitmap.GetObject(sizeof(bm),&bm);
    pOldBmp=MemDC.SelectObject(&Bitmap);
    Source.top=0;
    Source.left=0;
    Source.right= bm.bmWidth;
    Source.bottom = bm.bmHeight;
    Dest = Source;
    }
    pDC->DPtoLP(&Dest);
    if(pDC->IsPrinting())
    {
    Dest.left=(int)(Dest.left*((double)pDC->GetDeviceCaps(LOGPIXELSX))/iLogPixelX);
    Dest.right=(int)(Dest.right*((double)pDC->GetDeviceCaps(LOGPIXELSX))/iLogPixelX);
    Dest.top=(int)(Dest.top*((double)pDC->GetDeviceCaps(LOGPIXELSY))/iLogPixelY);
    Dest.bottom=(int)(Dest.bottom*((double)pDC->GetDeviceCaps(LOGPIXELSY))/iLogPixelY);
    }
    pDC->StretchBlt(Dest.left, Dest.top, Dest.right, Dest.bottom,
    &MemDC, Source.left, Source.top, Source.right,Source.bottom, SRCCOPY);
    MemDC.SelectObject(pOldBmp);
    Bitmap.DeleteObject();
    MemDC.DeleteDC();
    return;
    }