www.pudn.com > Success5.6.rar > StaticWnd.cpp


// StaticWnd.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "StaticWnd.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CStaticWnd 
//设置与窗口相关的静态Control. 
CStaticWnd::CStaticWnd(int IDC) 
{ 
 	 m_IDC=IDC;  
	 m_BK_Color=RGB(128,128,128); 
	 m_pImg=NULL; 
     m_X=m_Y=0; 
} 
 
//按相关静态Control设置窗口大小,创立窗口。 
 
BOOL CStaticWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, 
						DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,  
						UINT nID, CCreateContext* pContext)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
    CRect Origin_Rect; 
	CWnd  *StaticReg; 
 
	StaticReg=pParentWnd->GetDlgItem(m_IDC); 
	if(StaticReg==NULL)throw(0); 
	StaticReg->GetWindowRect(&Origin_Rect); 
    Origin_Rect.DeflateRect(1,1); 
	pParentWnd->ScreenToClient(&Origin_Rect); 
	 
	return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, 
		                Origin_Rect, pParentWnd, nID, pContext); 
} 
 
int CStaticWnd::Set_Image(unsigned char *p_img,unsigned  int X, unsigned int Y) 
{ 
	 int i; 
	 m_X=(X+3)/4*4; 
	 m_Y=Y; 
	 if(m_pImg) 
	 { 
	  delete m_pImg; 
	  m_pImg=NULL; 
	 } 
     if(p_img) 
		{   
		 m_pImg=new unsigned char[m_X*m_Y*3]; 
		 for(i=0;i<(signed)m_Y;i++)memcpy(&m_pImg[i*m_X*3],&p_img[(m_Y-i-1)*X*3],X*3*sizeof(unsigned char)); 
		 Set_BMP_Head(); 
		} 
	 return 1; 
} 
 
int CStaticWnd::Set_GrayImage(unsigned char *p_img,unsigned  int X, unsigned int Y) 
{ 
	 int i,j; 
	 m_X=(X+3)/4*4; 
	 m_Y=Y; 
	 if(m_pImg) 
	 { 
	  delete m_pImg; 
	  m_pImg=NULL; 
	 } 
     if(p_img) 
		{   
		 m_pImg=new unsigned char[m_X*m_Y*3]; 
		 for(i=0;i<(signed)m_Y;i++) 
			 for(j=0;j<(signed)m_X;j++) 
					m_pImg[(i*m_X+j)*3]=m_pImg[(i*m_X+j)*3+1]=m_pImg[(i*m_X+j)*3+2]=p_img[(m_Y-i-1)*X+j]; 
		 Set_BMP_Head(); 
		} 
	 return 1; 
} 
 
int CStaticWnd::Set_BinImage(unsigned char *p_img,unsigned  int X, unsigned int Y,int R, int G, int B) 
{ 
	 int i,j; 
	 m_X=(X+3)/4*4; 
	 m_Y=Y; 
	 if(m_pImg) 
	 { 
	  delete m_pImg; 
	  m_pImg=NULL; 
	 } 
     if(p_img) 
		{ 
		 m_pImg=new unsigned char[m_X*m_Y*3]; 
		 memset(m_pImg,0,m_X*m_Y*3); 
		 for(i=0;i<(signed)Y;i++) 
			for(j=0;j<(signed)X;j++) 
				if(p_img[(Y-1-i)*X+j]) 
				{m_pImg[(i*m_X+j)*3+2]=R; 
				 m_pImg[(i*m_X+j)*3+1]=G; 
				 m_pImg[(i*m_X+j)*3]=B;			 				  
				} 
			      
		Set_BMP_Head(); 
		} 
	 return 1; 
} 
 
int CStaticWnd::Set_BinImage(unsigned char *p_img,unsigned  int X, unsigned int Y,COLORREF fg,COLORREF back) 
{ 
	 int i,j,R,G,B,bR,bG,bB; 
	 unsigned char *p; 
	 R=fg&0xff;	 G=(fg>>8)&0xff; B=(fg>>16)&0xff; 
	 bR=back&0xff;	 bG=(back>>8)&0xff; bB=(back>>16)&0xff;	  
	  
	 m_X=(X+3)/4*4; 
	 m_Y=Y; 
	 if(m_pImg) 
	 { 
	  delete m_pImg; 
	  m_pImg=NULL; 
	 } 
     if(p_img) 
		{ 
		 p=m_pImg=new unsigned char[m_X*m_Y*3]; 
		 for ( i=0;i<(signed)m_X*m_Y;i++) {*p++=bB;*p++=bG;*p++=bR;} 
		 for(i=0;i<(signed)Y;i++) 
			for(j=0;j<(signed)X;j++) 
				if(p_img[(Y-1-i)*X+j]) 
				{m_pImg[(i*m_X+j)*3+2]=R; 
				 m_pImg[(i*m_X+j)*3+1]=G; 
				 m_pImg[(i*m_X+j)*3]=B;			 				  
				} 
			      
		Set_BMP_Head(); 
		} 
	 return 1; 
} 
 
void CStaticWnd :: Clear_Image(void) 
{ 
	 if(m_pImg)  
	 { 
		 delete m_pImg; 
		 m_pImg=NULL; 
	 }     
} 
 
int CStaticWnd::Set_BMP_Head(void) 
{ 
    m_Bitmap.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);  
    m_Bitmap.bmiHeader.biWidth=m_X;  
    m_Bitmap.bmiHeader.biHeight=m_Y; 
    m_Bitmap.bmiHeader.biPlanes=1;  
    m_Bitmap.bmiHeader.biBitCount=24;  
    m_Bitmap.bmiHeader.biCompression=BI_RGB;  
    m_Bitmap.bmiHeader.biSizeImage=0;  
    m_Bitmap.bmiHeader.biXPelsPerMeter=0;  
    m_Bitmap.bmiHeader.biYPelsPerMeter=0;  
    m_Bitmap.bmiHeader.biClrUsed=0; 
	m_Bitmap.bmiHeader.biClrImportant=0; 
	m_ImageSetFlag=1; 
	return 1; 
} 
 
int CStaticWnd::Draw_Wnd(CDC *pDC) 
{ 
/*	CRect rect; 
	GetWindowRect(&rect); 
	ScreenToClient(&rect);		  
	if(m_pImg==NULL) 
		{CBrush bk_brush(m_BK_Color); 
		 pDC->FillRect(&rect ,&bk_brush); 
		} 
	else 
//		::SetDIBitsToDevice(pDC->GetSafeHdc(),0,0,m_X,m_Y,0,0,0,m_Y,(CONST VOID *)m_pImg, (CONST BITMAPINFO *)&m_Bitmap,DIB_RGB_COLORS);  
     
	{ 
	double ratio_x,ratio_y,temp; 
	ratio_x=(rect.right-rect.left)/m_X; 
	ratio_y=(rect.bottom-rect.top)/m_Y; 
	if(ratio_x>ratio_y) temp=ratio_y; 
	else temp=ratio_x; 
    ::StretchDIBits(pDC->GetSafeHdc(),0,0,rect.right-rect.left,rect.bottom-rect.top, 
                    0,0,m_X,m_Y,(CONST VOID *)m_pImg, (CONST BITMAPINFO *)&m_Bitmap,DIB_RGB_COLORS,SRCCOPY); 
	} 
	return 1; 
	*/ 
	CRect rect; 
	GetWindowRect(&rect); 
	ScreenToClient(&rect);		  
	if(m_pImg==NULL) 
		{CBrush bk_brush(m_BK_Color); 
		 pDC->FillRect(&rect ,&bk_brush); 
		} 
	else 
//		::SetDIBitsToDevice(pDC->GetSafeHdc(),0,0,m_X,m_Y,0,0,0,m_Y,(CONST VOID *)m_pImg, (CONST BITMAPINFO *)&m_Bitmap,DIB_RGB_COLORS);  
     
	{ 
	 CBrush bk_brush(RGB(0,0,0)); 
	 pDC->FillRect(&rect ,&bk_brush); 
		 
	double ratio_x; 
	ratio_x=(double)m_Y/(double)m_X; 
   
	//ratio_y=(double)(rect.bottom-rect.top)/(double)m_Y; 
	//if(ratio_x>ratio_y)  
	SetStretchBltMode(pDC->GetSafeHdc(),COLORONCOLOR); 
	if((rect.bottom-rect.top)/(double)(rect.right-rect.left)>ratio_x) 
	 ::StretchDIBits(pDC->GetSafeHdc(),0,0,(rect.right-rect.left),(int)((rect.right-rect.left)*ratio_x), 
                    0,0,m_X,m_Y,(CONST VOID *)m_pImg, (CONST BITMAPINFO *)&m_Bitmap,DIB_RGB_COLORS,SRCCOPY); 
	else 
	 ::StretchDIBits(pDC->GetSafeHdc(),0,0,(int)((rect.bottom-rect.top)/ratio_x),(rect.bottom-rect.top), 
                    0,0,m_X,m_Y,(CONST VOID *)m_pImg, (CONST BITMAPINFO *)&m_Bitmap,DIB_RGB_COLORS,SRCCOPY); 
	 	  
	//else  
	//::StretchDIBits(pDC->GetSafeHdc(),0,0,(rect.right-rect.left),(m_Y)*ratio_y, 
      //              0,0,m_X,m_Y,(CONST VOID *)m_pImg, (CONST BITMAPINFO *)&m_Bitmap,DIB_RGB_COLORS,SRCCOPY);	 
 
    } 
	return 1; 
} 
 
int CStaticWnd::Draw_Fit_Wnd(CDC *pDC) 
{ 
	CRect rect; 
	GetWindowRect(&rect); 
	ScreenToClient(&rect);		  
    CBrush bk_brush(m_BK_Color); 
	pDC->FillRect(&rect ,&bk_brush); 
	if(m_pImg==NULL)return 1; 
	int W,H,sx,sy,w,h; 
	W=rect.right-rect.left; 
	H=rect.bottom-rect.top; 
	if(m_X*H>m_Y*W)//图象对于窗口来说,比较‘胖’ 
	              {h=m_Y*W/m_X;w=W; 
		           sy=(H-h)/2;sx=0; 
	              } 
	         else //图象对于窗口来说,比较‘瘦’ 
			      {w=m_X*H/m_Y;h=H; 
			       sx=(W-w)/2;sy=0; 
			      } 
    ::StretchDIBits(pDC->GetSafeHdc(),sx,sy,w,h, 
                    0,0,m_X,m_Y,(CONST VOID *)m_pImg, (CONST BITMAPINFO *)&m_Bitmap,DIB_RGB_COLORS,SRCCOPY); 
	return 0; 
} 
 
void CStaticWnd::Draw_Center(CDC *pDC) 
{ 
	CRect rect; 
	GetWindowRect(&rect); 
	ScreenToClient(&rect);		  
    CBrush bk_brush(m_BK_Color); 
	if(m_ImageSetFlag){pDC->FillRect(&rect ,&bk_brush);m_ImageSetFlag=0;} 
	if(m_pImg==NULL)return; 
	int W,H,sx,sy; 
	W=rect.right-rect.left; 
	H=rect.bottom-rect.top; 
	sx=(W-m_X)/2; 
	sy=(H-m_Y)/2; 
	::SetDIBitsToDevice(pDC->GetSafeHdc(),sx,sy,m_X,m_Y,0,0,0,m_Y,(CONST VOID *)m_pImg, (CONST BITMAPINFO *)&m_Bitmap,DIB_RGB_COLORS);  
} 
 
void CStaticWnd::Draw_Center2(CDC *pDC) 
{ 
	CRect rect; 
	GetWindowRect(&rect); 
	ScreenToClient(&rect);		  
    CBrush bk_brush(m_BK_Color); 
	pDC->FillRect(&rect ,&bk_brush); 
	if(m_pImg==NULL)return; 
    ::StretchDIBits(pDC->GetSafeHdc(),0,0,m_X*2,m_Y*2, 
                    0,0,m_X,m_Y,(CONST VOID *)m_pImg, (CONST BITMAPINFO *)&m_Bitmap,DIB_RGB_COLORS,SRCCOPY); 
} 
 
void CStaticWnd::Draw_Center1(CDC *pDC) 
{ 
	CRect rect; 
	GetWindowRect(&rect); 
	ScreenToClient(&rect);		  
    CBrush bk_brush(m_BK_Color); 
	pDC->FillRect(&rect ,&bk_brush); 
	if(m_pImg==NULL)return; 
    ::StretchDIBits(pDC->GetSafeHdc(),0,0,m_X,m_Y, 
                    0,0,m_X,m_Y,(CONST VOID *)m_pImg, (CONST BITMAPINFO *)&m_Bitmap,DIB_RGB_COLORS,SRCCOPY); 
} 
 
CStaticWnd::~CStaticWnd() 
{ 
	if(m_pImg!=NULL)delete m_pImg; 
	m_pImg=NULL; 
} 
 
 
BEGIN_MESSAGE_MAP(CStaticWnd, CWnd) 
	//{{AFX_MSG_MAP(CStaticWnd) 
	ON_WM_PAINT() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CStaticWnd message handlers 
 
void CStaticWnd::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
	 
	// TODO: Add your message handler code here 
 
	//Draw_Center(&dc); 
	Draw_Fit_Wnd(&dc); 
	// Do not call CWnd::OnPaint() for painting messages 
} 
 
void CStaticWnd::Draw_Center_() 
{ 
	CPaintDC dc(this); 
	Draw_Center(&dc); 
}