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