📄 bitmapwnd.cpp
字号:
// BitMapWnd.cpp : implementation file
//
#include "stdafx.h"
#include "EDFSchedule.h"
#include "BitMapWnd.h"
// CBitMapWnd
IMPLEMENT_DYNAMIC(CBitMapWnd, CWnd)
CBitMapWnd::CBitMapWnd()
{
m_nHScrollPos=0;
m_nVScrollPos=0;
}
CBitMapWnd::~CBitMapWnd()
{
}
BEGIN_MESSAGE_MAP(CBitMapWnd, CWnd)
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_WM_PAINT()
ON_WM_CREATE()
END_MESSAGE_MAP()
// CBitMapWnd message handlers
BOOL CBitMapWnd::Create(const RECT& rect, CWnd* pParentWnd, UINT nID)
{
m_nHPageSize=rect.right-rect.left;
m_nVPageSize=rect.bottom-rect.top;
m_nViewWidth=m_nHPageSize;
m_nViewHeight=m_nVPageSize;
return CWnd::CreateEx(WS_EX_CLIENTEDGE, NULL, _T(""), WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL ,
rect, pParentWnd, nID, NULL);
}
int CBitMapWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
ReSetScroll();
return 0;
}
BOOL CBitMapWnd::ReSetBitmap(CBitmap& bitmap)
{
if (HBITMAP(bitmap)==NULL)
return FALSE;
if ( HBITMAP(m_ViewBitmap)!= NULL)
m_ViewBitmap.DeleteObject();
BITMAP bm;
bitmap.GetBitmap(&bm);
HBITMAP hBitmap=CopyBitmap(HBITMAP(bitmap));
m_ViewBitmap.Attach(hBitmap);
m_nViewWidth=max(bm.bmWidth,m_nHPageSize);
m_nViewHeight=max(bm.bmHeight,m_nVPageSize);
ReSetScroll();
Invalidate();
return TRUE;
}
void CBitMapWnd::ReSetScroll()
{
SCROLLINFO si;
si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
si.nMin = 0;
si.nMax = m_nViewWidth;
si.nPos = m_nHScrollPos;
si.nPage = m_nHPageSize;
SetScrollInfo (SB_HORZ, &si, TRUE);//设置横向进度条
si.nMax = m_nViewHeight;
si.nPos = m_nVScrollPos;
si.nPage = m_nVPageSize;
SetScrollInfo (SB_VERT, &si, TRUE);//设置纵向进度条
}
void CBitMapWnd::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
int nDelta;
// Compute the horizontal scroll distance, or "delta."
switch (nSBCode)
{
case SB_LINELEFT:
nDelta = -LINESIZE;
break;
case SB_PAGELEFT:
nDelta = -m_nHPageSize;
break;
case SB_THUMBTRACK:
nDelta = (int) nPos - m_nHScrollPos;
break;
case SB_PAGERIGHT:
nDelta = m_nHPageSize;
break;
case SB_LINERIGHT:
nDelta = LINESIZE;
break;
default: // Ignore other scroll bar messages
return;
}
int nScrollPos = m_nHScrollPos + nDelta;
int nMaxPos = m_nViewWidth - m_nHPageSize;
if (nScrollPos < 0)
nDelta = -m_nHScrollPos;
else if (nScrollPos > nMaxPos)
nDelta = nMaxPos - m_nHScrollPos;
// Update the scroll position and scroll the window.
if (nDelta != 0) {
m_nHScrollPos += nDelta;
SetScrollPos (SB_HORZ, m_nHScrollPos, TRUE);
ScrollWindow (-nDelta, 0);
}
//CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CBitMapWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
int nDelta;
// Compute the vertical scroll distance, or "delta."
switch (nSBCode){
case SB_LINEUP:
nDelta = -LINESIZE;
break;
case SB_PAGEUP:
nDelta = -m_nVPageSize;
break;
case SB_THUMBTRACK:
nDelta = (int) nPos - m_nVScrollPos;
break;
case SB_PAGEDOWN:
nDelta = m_nVPageSize;
break;
case SB_LINEDOWN:
nDelta = LINESIZE;
break;
default: // Ignore other scroll bar messages
return;
}
// Adjust the delta if adding it to the current scroll position would
// cause an underrun or overrun.
int nScrollPos = m_nVScrollPos + nDelta;
int nMaxPos = m_nViewHeight - m_nVPageSize;
if (nScrollPos < 0)
nDelta = -m_nVScrollPos;
else if (nScrollPos > nMaxPos)
nDelta = nMaxPos - m_nVScrollPos;
// Update the scroll position and scroll the window.
if (nDelta != 0) {
m_nVScrollPos += nDelta;
SetScrollPos (SB_VERT, m_nVScrollPos, TRUE);
ScrollWindow (0, -nDelta);
}
//CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CBitMapWnd::OnPaint()
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CBrush brush(RGB(255,255,255));
dc.FillRect(&rect,&brush);
if (HBITMAP(m_ViewBitmap)!=NULL)
{
dc.SetWindowOrg (m_nHScrollPos, m_nVScrollPos);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap* pOldBitmap = memDC.SelectObject(&m_ViewBitmap);
dc.BitBlt (0, 0, m_nViewWidth, m_nViewHeight, &memDC,0, 0, SRCCOPY);
memDC.SelectObject (pOldBitmap);
}
}
HBITMAP CBitMapWnd::CopyBitmap(HBITMAP hSourceHbitmap)
{
CDC sourceDC;
CDC destDC;
sourceDC.CreateCompatibleDC(NULL);
destDC.CreateCompatibleDC(NULL);
//The bitmap information.
BITMAP bm={0};
//Get the bitmap information.
::GetObject(hSourceHbitmap,sizeof(bm),&bm);
//Create a bitmap to hold the result
HBITMAP hbmResult=::CreateCompatibleBitmap(CClientDC(NULL),bm.bmWidth,bm.bmHeight);
HBITMAP hbmOldSource=(HBITMAP)::SelectObject(sourceDC.m_hDC,hSourceHbitmap);
HBITMAP hbmOldDest=(HBITMAP)::SelectObject(destDC.m_hDC,hbmResult);
destDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&sourceDC,0,0,SRCCOPY);
//Restore DCs
::SelectObject(sourceDC.m_hDC,hbmOldSource);
::SelectObject(destDC.m_hDC,hbmOldDest);
::DeleteObject(sourceDC.m_hDC);
::DeleteObject(destDC.m_hDC);
return hbmResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -