如何在CStatic上面的某一个区域显示一个图(图在本地的硬盘上,是一个文件)(急)
如何在CStatic上面的某一个区域显示一个图(图在本地的硬盘上,是一个文件)
就是一个CStatic我要在不同的区域显示不同的图,*.bmp,或者*.jpg图,
请问如何实现,最好能有可实现的例子代码,谢谢
问题点数:20、回复次数:10Top
1 楼JetLuo(JetLuo)回复于 2006-03-02 20:37:38 得分 10
我写的一个派生于CStatic的类,很简单.其中CxImage是另一个显示图片的类;
// CImageFrm window
class CImageFrm : public CStatic
{
// Construction
public:
CImageFrm();
// Attributes
private:
CxImage m_Image;
BOOL m_bPerHWRatio;
// Operations
public:
void SetShowMode(BOOL bPerHWRatio){ m_bPerHWRatio=bPerHWRatio; }
void SetImage(CxImage &Image);
CxImage *GetImage(){return &m_Image;}
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CImageFrm)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CImageFrm();
// Generated message map functions
protected:
//{{AFX_MSG(CImageFrm)
afx_msg void OnPaint();
afx_msg void OnDestroy();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CImageFrm::CImageFrm()
{
m_bPerHWRatio=FALSE;
}
CImageFrm::~CImageFrm()
{
}
BEGIN_MESSAGE_MAP(CImageFrm, CStatic)
//{{AFX_MSG_MAP(CImageFrm)
ON_WM_PAINT()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImageFrm message handlers
void CImageFrm::SetImage(CxImage &Image)
{
m_Image.Copy(Image);
Invalidate(FALSE);
}
void CImageFrm::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rc;
GetClientRect(rc);
if(!m_Image.IsValid())
{
dc.Rectangle(&rc);
return;
}
int nHeight=m_Image.GetHeight();
int nWidth=m_Image.GetWidth();
if(m_bPerHWRatio)
{
CRect rcShow;
double dRatio=nWidth/(double)nHeight;
CSize newSize;
newSize.cy = rc.Height();
newSize.cx=(int)(newSize.cy*dRatio);
if(newSize.cx > rc.Width())
{
newSize.cx = rc.Width();
newSize.cy= (int)(newSize.cy/dRatio);
rcShow.left=0;rcShow.right=newSize.cx;
rcShow.top=(rc.Height()-newSize.cy)/2;
rcShow.bottom=rcShow.top+newSize.cy;
}
else
{
rcShow.top=0;rcShow.bottom=newSize.cy;
rcShow.left=(rc.Width()-newSize.cx)/2;
rcShow.right=rc.left+newSize.cx;
}
dc.Rectangle(&rc);
m_Image.Stretch(dc.m_hDC,rcShow,SRCCOPY);
}
else
{
m_Image.Stretch(dc.m_hDC,rc,SRCCOPY);
}
}
void CImageFrm::OnDestroy()
{
if(m_Image.IsValid())
m_Image.Destroy();
CStatic::OnDestroy();
}
Top
2 楼princesshan(小青蛇)回复于 2006-03-03 16:10:40 得分 0
顶,楼上的CxImage 的源代码没有,怎么用阿?
没有其他的实现方法了吗?谢谢Top
3 楼Snow_Ice11111(雪上加冰)回复于 2006-03-04 01:22:25 得分 5
CxImage用在这里太浪费了,太庞大了,占资源。
http://community.csdn.net/Expert/topic/4505/4505149.xml?temp=.7063867Top
4 楼junliu_0(驴子)回复于 2006-03-04 08:17:57 得分 0
CWnd *pWnd=GetDlgItem(IDC_STATIC);//取得控件句柄
CDC *pDC=pWnd->GetDC();
//加载位图并显示
CBitmap bitmap;
HBITMAP hbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),"C:\\*.bmp",
IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //载入位图
//if(hbmp=NULL) return FALSE;
bitmap.Detach(); //分离关联的位图对
bitmap.Attach(hbmp); //将载入的位图与bitmap关联起来
CRect r;
pDC->GetClientRect(&r);
CDC dcMem;
dcMem.CreateCompatibleDC(pDC); //创建与pDC兼容的设备上下文
dcMem.SelectObject(&bitmap); //将位图对象选入设备上下文
//从源设备上下文复制位图到目标设备上下文
//pDC->BitBlt(0,0,100,100,&dcMem,0,0,SRCCOPY);
BITMAP BM;
bitmap.GetBitmap( &BM );
pDC->StretchBlt(
0,
0,
r.Width(),
r.Height(),
&dcMem,
0,
0,
BM.bmWidth,
BM.bmHeight,
SRCCOPY
);
bitmap.DeleteObject();Top
5 楼JetLuo(JetLuo)回复于 2006-03-04 20:23:01 得分 0
楼上的,人家要能显示JPG
如果要CxImage,发Email给我:jetjsp@126.comTop
6 楼princesshan(小青蛇)回复于 2006-03-07 16:13:34 得分 0
怎么显示一个jpg图阿,没有人会吗?Top
7 楼unionize(同盟会)回复于 2006-03-07 16:15:42 得分 0
先用CImage转成BMP然后BitBltTop
8 楼slayer530(首席看客)回复于 2006-03-07 22:00:52 得分 5
试试CPixtureEx,网上去搜个控件类,很好用,gif动画都可以显示Top
9 楼billy145533($_$)回复于 2006-03-07 22:08:04 得分 0
gdi+Top
10 楼JetLuo(JetLuo)回复于 2006-03-07 22:37:21 得分 0
CxImage 功能很强大,各种格式几乎通吃
// CxImage supported formats
#define CXIMAGE_SUPPORT_BMP 1
#define CXIMAGE_SUPPORT_GIF 1
#define CXIMAGE_SUPPORT_JPG 1
#define CXIMAGE_SUPPORT_PNG 1
#define CXIMAGE_SUPPORT_MNG 0
#define CXIMAGE_SUPPORT_ICO 1
#define CXIMAGE_SUPPORT_TIF 1
#define CXIMAGE_SUPPORT_TGA 1
#define CXIMAGE_SUPPORT_PCX 1
#define CXIMAGE_SUPPORT_WBMP 1
#define CXIMAGE_SUPPORT_WMF 1
#define CXIMAGE_SUPPORT_J2K 0 // Beta, use JP2
#define CXIMAGE_SUPPORT_JBG 0 // GPL'd see ../jbig/copying.txtTop




