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

📄 chapter13view.cpp

📁 精通MFC程序 设计
💻 CPP
字号:
// Chapter13View.cpp : implementation of the CChapter13View class
//

#include "stdafx.h"
#include "Chapter13.h"

#include "Chapter13Doc.h"
#include "Chapter13View.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CChapter13View

IMPLEMENT_DYNCREATE(CChapter13View, CScrollView)

BEGIN_MESSAGE_MAP(CChapter13View, CScrollView)
	//{{AFX_MSG_MAP(CChapter13View)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CChapter13View construction/destruction

CChapter13View::CChapter13View()
{
	// TODO: add construction code here
	
}

CChapter13View::~CChapter13View()
{
}

BOOL CChapter13View::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CChapter13View drawing

void CChapter13View::OnDraw(CDC* pDC)
{
	CChapter13Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	HGLOBAL hDIB = pDoc->m_dib.m_hDib;		
	if (hDIB != NULL)
	{
		//图象的宽度和高度
		long	lSrcWidth;
		long	lSrcHeight;
		//指向源图象的指针
		LPSTR	lpSrcDib;
		//指向源图象起始的指针
		LPSTR	lpSrcStartBits;
		// 指向BITMAPINFO结构的指针
		LPBITMAPINFO lpbmi;
		lpSrcDib= (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_dib.m_hDib);
		// 获取图象的宽度高度
		lSrcWidth= pDoc->m_dib.GetWidth(lpSrcDib);		
		lSrcHeight= pDoc->m_dib.GetHeight(lpSrcDib);
		// 获取指针
		lpbmi = (LPBITMAPINFO)lpSrcDib;
		// 找到DIB图象像素起始位置
		lpSrcStartBits=pDoc->m_dib.GetBits(lpSrcDib);		
		// 创建新调色板
		CPalette * pPal=new CPalette;
		pDoc->m_dib.ConstructPalette(pDoc->m_dib.m_hDib,pPal);
		//将新调色板选进内存设备环境
		CPalette * pOldPal=pDC->SelectPalette(pPal, TRUE);
		pDC->RealizePalette();
		//画图
		::StretchDIBits(pDC->GetSafeHdc(),0,0, lSrcWidth, lSrcHeight,
			0, 0, lSrcWidth , lSrcHeight ,
			lpSrcStartBits, lpbmi,
			DIB_RGB_COLORS, SRCCOPY);
		//恢复旧的(应该是系统)调色板
		pDC->SelectPalette(pOldPal, TRUE);
		delete pPal;
	}

	//例子2
	/*	//定义图形对象-构造
	CBrush blackBrush;
	//创建图形对象-初始化
	if(!blackBrush.CreateSolidBrush(RGB(0,0,0)))
	{
		return;
	}
	//将新建图形对象选入设备上下文,并保存原来的图形对象
	CBrush* pOldBrush=pDC->SelectObject(&blackBrush);
	//执行绘制操作
	//恢复原来的图形对象
	pDC->SelectObject(pOldBrush);
//	blackBrush.DeleteObject();*/
	//例子3
/*	CRect client;
	GetClientRect(&client);
	pDC->SetViewportOrg(client.right/2,client.bottom/2);
	pDC->TextOut(-client.right/2,-client.bottom/2,"hello");
	pDC->SetWindowOrg(-client.right/2,-client.bottom/2);
	pDC->TextOut(-client.right/2,-client.bottom/2,"hello");
//	pDC->TextOut(0,0,"hello,Girl");

	
	pDC->SetMapMode(MM_LOENGLISH);
//	pDC->TextOut(100,-100,"hello,Girl");

	pDC->SetViewportOrg(0,client.bottom);
//	pDC->DPtoLP(&client);
//	pDC->TextOut(100,100,"hello,boy");*/
	//例子4
/*	LOGFONT lf;
	pDC->GetCurrentFont()->GetLogFont(&lf);
	CFont font;
	CFont * pOldFont;
	lf.lfCharSet=134;
	lf.lfHeight=100;
	lf.lfWidth=0;
	strcpy(lf.lfFaceName,"华文行楷");
	font.CreateFontIndirect(&lf);
	pOldFont=pDC->SelectObject(&font);
	pDC->SetBkMode(TRANSPARENT);
	
	CPen pen(PS_SOLID,1,RGB(255,0,0));
	CPen* pOldPen;
	pOldPen=pDC->SelectObject(&pen);
	
	CBrush brush(HS_DIAGCROSS,RGB(0,255,0));
	CBrush* pOldBrush;
	pOldBrush=pDC->SelectObject(&brush);

	pDC->BeginPath();
	pDC->TextOut(0,10,"hello,第二炮兵");
	pDC->EndPath();
//	pDC->StrokePath();
	pDC->StrokeAndFillPath();
	
	
	pDC->SelectClipPath(RGN_COPY);
	for(int i=255;i>0;i--)
	{
		int ir=(1000*i)/255;
		pDC->SelectObject(pOldBrush);
		brush.DeleteObject();
		brush.CreateSolidBrush(RGB(255,i,0));
		pDC->SelectObject(&brush);
		pDC->Ellipse(-ir,-ir/3,ir,ir/3);
	}
	
	
	pDC->SelectObject(pOldFont);
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);*/

}


/////////////////////////////////////////////////////////////////////////////
// CChapter13View printing

BOOL CChapter13View::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CChapter13View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CChapter13View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CChapter13View diagnostics

#ifdef _DEBUG
void CChapter13View::AssertValid() const
{
	CScrollView::AssertValid();
}

void CChapter13View::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CChapter13Doc* CChapter13View::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CChapter13Doc)));
	return (CChapter13Doc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CChapter13View message handlers

void CChapter13View::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	
	CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = sizeTotal.cy = 100;
	SetScrollSizes(MM_TEXT, sizeTotal);
}


void CChapter13View::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	SetCapture();//捕获鼠标消息
	m_ptLast=point;
//	SetCursor(LoadCursor(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_CURSOR_DOWN)));
	CScrollView::OnLButtonDown(nFlags, point);
}

void CChapter13View::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	ReleaseCapture();
/*	CRect rcClient;
	GetClientRect(&rcClient);
	//根据移动的位置更改鼠标形状
	
	if(PtInRect(&rcClient,point))
		{
			SetCursor(LoadCursor(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_HAND)));
		}*/
	
	
	CScrollView::OnLButtonUp(nFlags, point);
	
}

void CChapter13View::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CRect rcClient;
	GetClientRect(&rcClient);
	if (nFlags & MK_LBUTTON)
	{
		SCROLLINFO siVert, siHorz;
		//取得滚动框的初始信息 包括位置
		GetScrollInfo(SB_VERT, &siVert);
		GetScrollInfo(SB_HORZ, &siHorz);
		CSize sizeDelta;
		//滚动的距离
		sizeDelta = point - m_ptLast;
		//滚动时发送此消息,siVert - sizeDelta的值表示滚动框应该在的位置
		SendMessage(WM_VSCROLL, MAKELONG(SB_THUMBTRACK, siVert.nPos - sizeDelta.cy), NULL);
		SendMessage(WM_HSCROLL, MAKELONG(SB_THUMBTRACK, siHorz.nPos - sizeDelta.cx), NULL);
		m_ptLast = point;
	}
/*
	//根据移动的位置更改鼠标形状
	else if(PtInRect(&rcClient,point))
	{
		SetCursor(LoadCursor(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_HAND)));
	}*/

	
	CScrollView::OnMouseMove(nFlags, point);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -