📄 imagewnd.cpp
字号:
// ImageWnd.cpp: implementation of the CImageWnd class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DetectAndTrack.h"
#include "ImageWnd.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CImageWnd::CImageWnd()
{
m_nHScrollPos=0;
m_nHCurPos=0;
m_nHScrollMax=0;
m_nVScrollPos=0;
m_nVCurPos=0;
m_nVScrollMax=0;
m_pbtBits=0;
}
CImageWnd::~CImageWnd()
{
if (m_pbtBits)
{
delete m_pbtBits;
}
}
BEGIN_MESSAGE_MAP(CImageWnd, CWnd)
//{{AFX_MSG_MAP(CImageWnd)
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_WM_PAINT()
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//处理水平滚动条
void CImageWnd::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
switch(nSBCode)
{
case SB_LINEDOWN:
m_nHScrollPos+=5;
break;
case SB_LINEUP:
m_nHScrollPos-=5;
break;
case SB_PAGEDOWN:
m_nHScrollPos+=302;
break;
case SB_PAGEUP:
m_nHScrollPos-=302;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
m_nHScrollPos=nPos;
break;
}
if (m_nHScrollPos<0) m_nHScrollPos=0;
if (m_nHScrollPos>m_nHScrollMax) m_nHScrollPos=m_nHScrollMax;
SetScrollPos(SB_HORZ,m_nHScrollPos);
if (m_nHCurPos!=m_nHScrollPos)
{
ScrollWindow((m_nHCurPos-m_nHScrollPos),0);
m_nHCurPos=m_nHScrollPos;
}
CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
}
//处理垂直滚动条
void CImageWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
switch(nSBCode)
{
case SB_LINEDOWN:
m_nVScrollPos+=5;
break;
case SB_LINEUP:
m_nVScrollPos-=5;
break;
case SB_PAGEDOWN:
m_nVScrollPos+=222;
break;
case SB_PAGEUP:
m_nVScrollPos-=222;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
m_nVScrollPos=nPos;
break;
}
if (m_nVScrollPos<0) m_nVScrollPos=0;
if (m_nVScrollPos>m_nVScrollMax) m_nVScrollPos=m_nVScrollMax;
SetScrollPos(SB_VERT,m_nVScrollPos);
if (m_nVCurPos!=m_nVScrollPos)
{
ScrollWindow(0,(m_nVCurPos-m_nVScrollPos));
m_nVCurPos=m_nVScrollPos;
}
CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}
//绘图函数
void CImageWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
if (m_pbtBits)
{
int nX,nY;
nX=-m_nHScrollPos;
nY=-m_nVScrollPos;
if (m_nWidth<320) nX=(320-m_nWidth)/2;
if (m_nHeight<300) nY=(300-m_nHeight)/2;
BITMAPINFOHEADER bmi;
bmi.biSize=sizeof(BITMAPINFOHEADER);
bmi.biWidth=m_nWidth;
bmi.biHeight=m_nHeight;
bmi.biPlanes=1;
bmi.biBitCount=24;
bmi.biCompression=BI_RGB;
bmi.biSizeImage=0;
bmi.biXPelsPerMeter=0;
bmi.biYPelsPerMeter=0;
bmi.biClrUsed=0;
bmi.biClrImportant=0;
StretchDIBits(dc.m_hDC,nX,nY,m_nWidth,m_nHeight,0,0,m_nWidth,m_nHeight,
m_pbtBits, (BITMAPINFO *)&bmi, DIB_RGB_COLORS, SRCCOPY);
}
}
//预处理图像数据
void CImageWnd::SetImage(int nX, int nY, const void *pBits)
{
m_nWidth=nX;
m_nHeight=nY;
m_nByteWidth=m_nWidth*3;
if (m_nByteWidth%4)
{
m_nByteWidth+=4-(m_nByteWidth%4);
}
if (m_pbtBits)
{
delete m_pbtBits;
}
m_pbtBits=new BYTE[m_nByteWidth*m_nHeight];
memcpy(m_pbtBits,pBits,m_nByteWidth*m_nHeight);
if (nX>320 || nY>300)
{
SetScroll(nX,nY);
}
else
SetScroll(0,0);
Invalidate();
}
void CImageWnd::SetScroll(int nX, int nY)
{
m_nHScrollPos=0;
m_nHCurPos=0;
m_nVScrollPos=0;
m_nVCurPos=0;
SetScrollPos(SB_HORZ,0);
SetScrollPos(SB_VERT,0);
SCROLLINFO sinfo;
sinfo.cbSize=sizeof(SCROLLINFO);
sinfo.fMask=SIF_PAGE|SIF_RANGE;
sinfo.nMin=0;
//HScroll
sinfo.nMax=nX-1;
sinfo.nPage=302;
SetScrollInfo(SB_HORZ,&sinfo);
m_nHScrollMax=nX-302;
//VScroll
sinfo.nMax=nY-1;
sinfo.nPage=222;
SetScrollInfo(SB_VERT,&sinfo);
m_nVScrollMax=nY-222;
}
int CImageWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -