孙鑫VC++深入详解:Lesson5 Part1 文本插入符Caret,位图插入符,窗口重绘




掌握CDC的文字处理程序的编写,如何产生自定义字体和自定义插入符,熟悉对CString类的使用。通过对卡拉OK程序的编写,讲解定时器的使用和DrawText函数的巧妙运用。讲解如何使用CDC的裁减功能。




1. 创建文本插入符Caret,用函数CreateSolidCaret(),然后ShowCaret();
   CWnd::CreateSolidCaret  
   void CreateSolidCaret( int nWidth, int nHeight );

2. 创建位图资源:要先有一个CBitmap bitmap对象,然后CreateCaret(),然后ShowCaret();


3. 窗口重绘,在Win32中是处理WM_PAINT消息,在MFC中,窗口需要重绘时,应用程序框架调用OnDraw函数来重绘窗口


4. CString类的成员函数LoadString(UINT nID), 用来加载字符串类资源

Lesson4,Lesson5都是在CXXXXView.cpp中干活,实际运行时那肯定得有个CXXXXView的对象来调用这些消息响应函数啊,这个对象在哪里创建的?

//

// TextView.cpp : implementation of the CTextView class
//

#include "stdafx.h"
#include "Text.h"

#include "TextDoc.h"
#include "TextView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CTextView

IMPLEMENT_DYNCREATE(CTextView, CView)

BEGIN_MESSAGE_MAP(CTextView, CView)
	//{{AFX_MSG_MAP(CTextView)
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTextView construction/destruction

CTextView::CTextView()
{
	// TODO: add construction code here

}

CTextView::~CTextView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CTextView drawing

void CTextView::OnDraw(CDC* pDC) // 这个函数传入了一个device context指针,因为在客户区画图不用在定义一个DC了.
{
	CTextDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

//------窗口重绘,在窗口输出一句话,直接用pDC对象的成员函数
	CString cstr("这是一个CString类对象,对象名是cstr");
	pDC->TextOut(0,0,cstr); 

	// 也可以不用传进来的pdc,自己定义一个dc对象
	CClientDC dc(this);
	dc.TextOut(50,50,cstr);

//------CString类的成员函数LoadString(UINT nID), 用来加载字符串类资源(Insert-->Resource-->String table)
	   cstr.LoadString(IDS_STRING61446);
	   pDC->TextOut(50,100,cstr);
	

	
}

/////////////////////////////////////////////////////////////////////////////
// CTextView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CTextView diagnostics

#ifdef _DEBUG
void CTextView::AssertValid() const
{
	CView::AssertValid();
}

void CTextView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CTextView message handlers

int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	// GetSystemMetrics 


//------创建文本插入符
	/*
	CClientDC dc(this);
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);
	CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
	ShowCaret();
	*/



//------创建图形插入符
	/*
	  1. 创建一个位图对象CBitmap bitmap,且应作为全局的成员存在,因此把这个对象作为CTextView类的一个私有成员.
	  2. CreateCare()函数来创建一个插入符
	  3. 发现运行后闪烁的位图背景色和前景色均不是我设计的那个颜色,奇怪了...
	 */

//	CBitmap bitmap; 放在这里没有用,OnCreate消息处理完函数返回(return 0)后,这个临时bitmap资源类对象发生了析构,内存中没有了.
	bitmap.LoadBitmap(IDB_BITMAP1);
	CClientDC dc(this);
	CreateCaret(&bitmap);
	ShowCaret();



//---
	return 0;
}



//

//---孙鑫VC++深入详解:Lesson5 Part1 文本插入符Caret,位图插入符,窗口重绘_第1张图片

你可能感兴趣的:(孙鑫VC++深入详解:Lesson5 Part1 文本插入符Caret,位图插入符,窗口重绘)