掌握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;
}
//
//---