第一次写图像程序,怎么在固定大小的窗口(或对话框上)内完整显示图像(BMP、JPG)!最好能给出代码

解决方案 »

  1.   

    LoadImage
    StretchBlt
    http://expert.csdn.net/Expert/topic/2053/2053993.xml?temp=.3165094
      

  2.   

    #define STRECH_1_1 0
    #define STRECH_FULL_X 1
    #define STRECH_FULL_Y   2
    #define STRECH_FULL 3
    #define STRECH_CENTER   4class CImgWnd : public CStatic
    {
    // Construction
    public:
    CImgWnd();
    void SetImage(UINT resID);
    void SetStrechType(int nStrechType);
    // Attributes
    protected:
    CBitmap m_bmpImage;
    int m_nStrechType;
    CRect m_rcSrc;
    CRect m_rcDst;
    // Operations
    public:

    // Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CImgWnd)
    //}}AFX_VIRTUAL// Implementation
    public:
    void SetImage(CString FileName);
    virtual ~CImgWnd(); // Generated message map functions
    protected:
    //{{AFX_MSG(CImgWnd)
    afx_msg void OnPaint();
    //}}AFX_MSG DECLARE_MESSAGE_MAP()
    };#include "stdafx.h"#include "ImgWnd.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CImgWndCImgWnd::CImgWnd()
    {
    m_nStrechType = STRECH_FULL;
    }CImgWnd::~CImgWnd()
    {
    }
    BEGIN_MESSAGE_MAP(CImgWnd, CStatic)
    //{{AFX_MSG_MAP(CImgWnd)
    ON_WM_PAINT()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CImgWnd message handlers
    void CImgWnd::SetImage(UINT resID)
    {
    m_bmpImage.LoadBitmap(resID);
    }void CImgWnd::SetImage(CString FileName)
    {
    HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),FileName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE|LR_DEFAULTSIZE);
    ASSERT(hBitmap!=NULL);

        m_bmpImage.Attach(hBitmap);
    }
    void CImgWnd::SetStrechType(int nStrechType)
    {
    m_nStrechType = nStrechType; //重画
    Invalidate();
    }
    void CImgWnd::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting

    //获得窗口大小
    CRect r;
    GetClientRect(&r); //填充背景
    HBRUSH brush = (HBRUSH)::GetStockObject(GRAY_BRUSH); 
    ::FillRect(dc.m_hDC,&r,brush);
    dc.SetStretchBltMode(HALFTONE); //将位图选进设备场景中
    CDC memdc;
    memdc.CreateCompatibleDC( &dc );
    CBitmap* pOldBmp= memdc.SelectObject(&m_bmpImage);

    //获得位图参数
    BITMAP bmp;
    m_bmpImage.GetBitmap(&bmp); //开始缩放
    switch(m_nStrechType)
    {
    case STRECH_1_1://1:1
    dc.BitBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,SRCCOPY);
    break;
    case STRECH_FULL_X://按宽度
    dc.StretchBlt(r.left,r.top,r.Width(),bmp.bmHeight,&memdc,0,0,
    bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    break;
    case STRECH_FULL_Y://按高度
    dc.StretchBlt(r.left,r.top,bmp.bmWidth,r.Height(),&memdc,0,0,
    bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    break;
    case STRECH_FULL://充满窗口
    dc.StretchBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,
    bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    break;
    case STRECH_CENTER://居中显示,大小为窗口的一半
    dc.StretchBlt(r.Width()/4,r.Height()/4,r.Width()/2,r.Height()/2,&memdc,0,0,
    bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    break;
    }

    //还原
    memdc.SelectObject(pOldBmp);

    }
      

  3.   

    CImgWnd  m_bmpimg; m_bmpimg.SetImage(szPathName);
    m_bmpimg.SetStrechType(STRECH_FULL);我用了一个STATIC控件来显示
      

  4.   

    你用过网上流行的可动态显示gif的PictureEx类吗?你可以在dialog一个静态控件,然后建PictureEx类一个对象,影射到这个控件上就可以了,你要的话可以发信给我[email protected]