⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitmapwnd.cpp

📁 进程的调度
💻 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 + -