📄 showbmp~.cpp
字号:
// ShowBMP.cpp : implementation file
//
#include "stdafx.h"
#include "ShowBMP.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CShowBMP
CShowBMP::CShowBMP()
{
}
CShowBMP::~CShowBMP()
{
m_dcMem.DeleteDC();
}
BEGIN_MESSAGE_MAP(CShowBMP, CWnd)
//{{AFX_MSG_MAP(CShowBMP)
ON_WM_PAINT()
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CShowBMP message handlers
//////////////////////////////////////////////////////////////////////////////
//functions
void CShowBMP::Init()
{
CClientDC dc(this);
//创建位图显示内存环境变量
m_dcMem.CreateCompatibleDC( &dc );
CRect tmpRect;
GetClientRect(&tmpRect);
CString aa;
aa.Format(_T("%d %d %d %d"), tmpRect.left,tmpRect.top,tmpRect.right, tmpRect.bottom);
AfxMessageBox(aa);
//创建位图显示控件底部滚动条
m_hbar.Create(SBS_HORZ | WS_CHILD | WS_VISIBLE,
CRect(tmpRect.left,tmpRect.bottom-10,tmpRect.right, tmpRect.bottom), this, 100);
//创建位图显示控件右边滚动条
m_vbar.Create(SBS_VERT | WS_CHILD | WS_VISIBLE,
CRect(tmpRect.right-10,tmpRect.top,tmpRect.right, tmpRect.bottom-10), this, 101);
m_hbar.ShowWindow(false);
m_vbar.ShowWindow(false);
::SetBkColor(dc, RGB(255, 0, 0));
/*
tmpbtn.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,30), this, 1);
tmpbtn.MoveWindow(0, 580, 20, 20);
tmpbtn.ShowWindow(true);
*/
}
BOOL CShowBMP::LoadBMP(HBITMAP hbmp)
{
// if(hbmp != NULL )
// DeleteObject(hbmp);
// hbmp= SHLoadDIBitmap(strFileName);
// hbmp = m_ImageViewerCtrl.DecompressImage(strFileName,NULL,NULL,FALSE);
ASSERT( hbmp != NULL );
//加载BMP到控件
BITMAP bmInfo; // bmp位图信息结构
CPoint pt;
SCROLLINFO horz,vert; // 滚动条参数
m_sourceX=m_sourceY=0;
//得到滚动位图显示控件大小
GetClientRect( &m_rectStaticClient );
m_rectStaticClient.NormalizeRect();
pt.x = m_rectStaticClient.left;
pt.y = m_rectStaticClient.top;
//得到位图信息,存储到bmInfo
HBITMAP hbmpOld;
GetObject(hbmp , sizeof(BITMAP), &bmInfo );
VERIFY(hbmpOld = (HBITMAP)SelectObject(m_dcMem, hbmp ) );
m_offsetX = pt.x;
m_offsetY = pt.y;
// 设置滚动条参数
horz.cbSize = sizeof(SCROLLINFO);
horz.fMask = SIF_ALL;
horz.nMin = 0;
horz.nMax = bmInfo.bmWidth-m_rectStaticClient.Width();
horz.nPage =0;
horz.nPos = 0;
horz.nTrackPos=0;
//设置底部和右边滚动条
if(bmInfo.bmWidth <= m_rectStaticClient.Width())
{
if((m_rectStaticClient.Width()-bmInfo.bmWidth)==0)
m_offsetX= pt.x;
else
m_offsetX= pt.x+((m_rectStaticClient.Width()-bmInfo.bmWidth)/2);
m_vbar.MoveWindow(m_offsetX+bmInfo.bmWidth,m_offsetY,18,m_rectStaticClient.Height());
// m_vbar.MoveWindow(SCREENFULLWIDTH - 20,m_offsetY,18,m_rectStaticClient.Height());
m_hbar.ShowWindow(false);
}
else
m_hbar.ShowWindow(true);
m_hbar.SetScrollInfo(&horz);
vert.cbSize = sizeof(SCROLLINFO);
vert.fMask = SIF_ALL;
vert.nMin = 0;
vert.nMax = bmInfo.bmHeight-(m_rectStaticClient.Height());
vert.nPage = 0;
vert.nPos = 0;
vert.nTrackPos= 0;
if(bmInfo.bmHeight<=m_rectStaticClient.Height())
{
if((m_rectStaticClient.Height()-bmInfo.bmHeight)==0)
m_offsetY= pt.y;
else
m_offsetY= pt.y+((m_rectStaticClient.Height()-bmInfo.bmHeight)/2);
m_hbar.MoveWindow(m_offsetX,m_offsetY+bmInfo.bmHeight,m_rectStaticClient.Width(),18);
// m_hbar.MoveWindow(m_offsetX,SCREENFULLHEIGHT - 20,m_rectStaticClient.Width(),18);
m_vbar.ShowWindow(false);
}
else
m_vbar.ShowWindow(true);
m_vbar.SetScrollInfo(&vert);
//更新显示
InvalidateRect(&m_rectStaticClient);
// CString aa;
// aa.Format(_T("%d %d %d %d"), m_rectStaticClient.top, m_rectStaticClient.left, m_rectStaticClient.Width, m_rectStaticClient.Height);
// AfxMessageBox(aa);
return TRUE;
}
void CShowBMP::RefreshShow(HBITMAP hbmp)
{
m_dcMem.DeleteDC();
ASSERT( hbmp != NULL );
//加载BMP到控件
BITMAP bmInfo; // bmp位图信息结构
CPoint pt;
SCROLLINFO horz,vert; // 滚动条参数
m_sourceX=m_sourceY=0;
//得到滚动位图显示控件大小
GetClientRect( &m_rectStaticClient );
m_rectStaticClient.NormalizeRect();
pt.x = m_rectStaticClient.left;
pt.y = m_rectStaticClient.top;
ASSERT( hbmp != NULL);
//得到位图信息,存储到bmInfo
HBITMAP hbmpOld;
GetObject(hbmp , sizeof(BITMAP), &bmInfo );
CString aa;
aa.Format(_T("%d"),bmInfo.bmWidth);
AfxMessageBox(aa);
// VERIFY(hbmpOld = (HBITMAP)SelectObject(m_dcMem, hbmp ) );
hbmpOld = (HBITMAP)SelectObject(m_dcMem, hbmp );
m_offsetX = pt.x;
m_offsetY = pt.y;
// 设置滚动条参数
horz.cbSize = sizeof(SCROLLINFO);
horz.fMask = SIF_ALL;
horz.nMin = 0;
horz.nMax = bmInfo.bmWidth-m_rectStaticClient.Width();
horz.nPage =0;
horz.nPos = 0;
horz.nTrackPos=0;
//设置底部和右边滚动条
if(bmInfo.bmWidth <= m_rectStaticClient.Width())
{
if((m_rectStaticClient.Width()-bmInfo.bmWidth)==0)
m_offsetX= pt.x;
else
m_offsetX= pt.x+((m_rectStaticClient.Width()-bmInfo.bmWidth)/2);
m_vbar.MoveWindow(m_offsetX+bmInfo.bmWidth,m_offsetY,18,m_rectStaticClient.Height());
// m_vbar.MoveWindow(SCREENFULLWIDTH - 20,m_offsetY,18,m_rectStaticClient.Height());
m_hbar.ShowWindow(false);
}
else
m_hbar.ShowWindow(true);
m_hbar.SetScrollInfo(&horz);
vert.cbSize = sizeof(SCROLLINFO);
vert.fMask = SIF_ALL;
vert.nMin = 0;
vert.nMax = bmInfo.bmHeight-(m_rectStaticClient.Height());
vert.nPage = 0;
vert.nPos = 0;
vert.nTrackPos= 0;
if(bmInfo.bmHeight<=m_rectStaticClient.Height())
{
if((m_rectStaticClient.Height()-bmInfo.bmHeight)==0)
m_offsetY= pt.y;
else
m_offsetY= pt.y+((m_rectStaticClient.Height()-bmInfo.bmHeight)/2);
m_hbar.MoveWindow(m_offsetX,m_offsetY+bmInfo.bmHeight,m_rectStaticClient.Width(),18);
// m_hbar.MoveWindow(m_offsetX,SCREENFULLHEIGHT - 20,m_rectStaticClient.Width(),18);
m_vbar.ShowWindow(false);
}
else
m_vbar.ShowWindow(true);
m_vbar.SetScrollInfo(&vert);
//更新显示
InvalidateRect(&m_rectStaticClient);
}
void CShowBMP::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
dc.BitBlt(m_offsetX,m_offsetY,m_rectStaticClient.Width()-10,m_rectStaticClient.Height()-10,
&m_dcMem, m_sourceX, m_sourceY,SRCCOPY);
// Do not call CWnd::OnPaint() for painting messages
}
void CShowBMP::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
switch (nSBCode)
{
case SB_TOP:
m_sourceX = 0;
break;
case SB_BOTTOM:
m_sourceX = INT_MAX;
break;
case SB_THUMBTRACK:
m_sourceX= nPos;
break;
}
m_hbar.SetScrollPos(m_sourceX);
InvalidateRect(&m_rectStaticClient);
CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CShowBMP::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
switch (nSBCode)
{
case SB_TOP:
m_sourceY = 0;
break;
case SB_BOTTOM:
m_sourceY = INT_MAX;
break;
case SB_THUMBTRACK:
m_sourceY = nPos;
break;
}
m_vbar.SetScrollPos(m_sourceY);
InvalidateRect(&m_rectStaticClient);
CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}
BOOL CShowBMP::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
// 设置背景画刷颜色
CBrush backBrush(RGB(255, 255, 255));
// 保存旧画刷
CBrush* pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
pDC->GetClipBox(&m_rectStaticClient); // 擦掉所要画的区域
pDC->PatBlt(m_rectStaticClient.left, m_rectStaticClient.top, m_rectStaticClient.Width(),
m_rectStaticClient.Height(), PATCOPY);
pDC->SelectObject(pOldBrush);
//return TRUE;
return CWnd::OnEraseBkgnd(pDC);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -