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);
}