掌握CDC的文字处理程序的编写,如何产生自定义字体和自定义插入符,熟悉对CString类的使用。通过对卡拉OK程序的编写,讲解定时器的使用和DrawText函数的巧妙运用。讲解如何使用CDC的裁减功能。
1,创建插入符:
void CreateSolidCaret( int nWidth, int nHeight );//创建插入符
void CreateCaret( CBitmap* pBitmap );//创建位图插入符
void ShowCaret( );//显示插入符
void HideCaret( );//隐藏插入符
static void PASCAL SetCaretPos( POINT point );//移动插入符号
说明:
1)创建插入符要在窗口创建完成之后,CreateSolidCaret函数创建的插入符被初始化为隐藏,所以需要调用ShowCaret()将其显示。
2)使用CreateCaret函数创建位图插入符的时候,不能使用局部的位图对象关联位图资源。(与资源相关联的C++对象,当它析构的时候会同时把与它相关联的资源销毁。)
2,获取当前字体信息的度量:CDC::GetTextMetrics
BOOL GetTextMetrics( LPTEXTMETRIC lpMetrics ) const;
说明:
typedef struct tagTEXTMETRIC {
int tmHeight;//字体高度。Specifies the height (ascent + descent) of characters.
int tmAscent;//基线以上的字体高度
int tmDescent;//基线以下的字体高度
int tmInternalLeading;
int tmExternalLeading;
int tmAveCharWidth;//字符平均宽度
int tmMaxCharWidth;
int tmWeight;
BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut;
BYTE tmFirstChar;
BYTE tmLastChar;
BYTE tmDefaultChar;
BYTE tmBreakChar;
BYTE tmPitchAndFamily;
BYTE tmCharSet;
int tmOverhang;
int tmDigitizedAspectX;
int tmDigitizedAspectY;
} TEXTMETRIC;
3,OnDraw函数:
virtual void OnDraw( CDC* pDC )
当窗口(从无到有或尺寸大小改变等)要求重绘的时候,会发送WM_PAIN消息,调用OnDraw函数进行重绘。
4,获取字符串的高度和宽度(区别字符串的长度):
CDC::GetTextExtent
CSize GetTextExtent( LPCTSTR lpszString, int nCount ) const;
CSize GetTextExtent( const CString& str ) const;
说明:
The CSize class is similar to the Windows SIZE structure。
typedef struct tagSIZE {
int cx;//the x-extent
int cy;//the y-extent
} SIZE;
5,路径层:
BOOL BeginPath( );
//在这作图定义路径层剪切区域
BOOL EndPath( );
BOOL SelectClipPath( int nMode );//调用这个函数来使当前路径层剪切区域与新剪切区域进行互操作。
//在这覆盖作图(包含前定义的路径层区域)定义新的剪切区域
说明:
1)SelectClipPath Selects the current path as a clipping region for the device context, combining the new region with any existing clipping region by using the specified mode. The device context identified must contain a closed path.
////
nMode:RGN_AND,RGN_COPY,RGN_DIFF,RGN_OR,RGN_XOR
RGN_AND The new clipping region includes the intersection (overlapping areas) of the current clipping region and the current path.
RGN_COPY The new clipping region is the current path.
RGN_DIFF The new clipping region includes the areas of the current clipping region, and those of the current path are excluded.
RGN_OR The new clipping region includes the union (combined areas) of the current clipping region and the current path.
RGN_XOR The new clipping region includes the union of the current clipping region and the current path, but without the overlapping areas.
2)应用:当作图的时候,如果想要在整幅图形其中的某个部分和其它部分有所区别,我们可以把这部分图形放到路径层当中,然后指定调用指定互操作模式调用SelectClipPath( int nMode )函数来使路径层和覆盖在其上新绘图剪切区域进行互操作,达到特殊效果。
6,关于文本字符串一些函数:
COLORREF GetBkColor( ) const;//得到背景颜色
virtual COLORREF SetBkColor( COLORREF crColor );//设置背景颜色
BOOL SetTextBkColor( COLORREF cr );//设置文本背景颜色
virtual COLORREF SetTextColor( COLORREF crColor );//设置文本颜色
virtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount );//输出文本
BOOL TextOut( int x, int y, const CString& str );
CString Left( int nCount ) const;//得到字符串左边nCount个字符
int GetLength( ) const;//得到字符串长度
7,字体CFont::CFont
CFont( );//构造函数
//Constructs a CFont object. The resulting object must be initialized with CreateFont, CreateFontIndirect, CreatePointFont, or CreatePointFontIndirect before it can be used.
选用字体事例代码组:
CClientDC dc(this);
CFont font;//构造字体对象
font.CreatePointFont(300,"华文行楷",NULL);//初始化字体对象,与字体资源相关联
CFont *pOldFont=dc.SelectObject(&font);//将新字体选入DC
...
dc.SelectObject(pOldFont);//恢复原字体
说明:
1)构造字体对象时候,必须初始化。(初始化是将字体对象与字体资源相关联)。
2)初始化对象时候,选用的字体也可以是系统字体,但不一定都有效,据测试选用。
8,在MFC中CEditView 和 cRichEditView类已经完成了初步的文字处理。可以让应用程序的View类以CEditView 和 cRichEditView类为基类。
9,平滑变色
CDC::TextOut()是一个字母一个字母的输出,达不到平滑效果。
CDC::DrawText():将文字的输出局限于一个矩形区域,超出矩形区域的文字都被截断。利用这一特点,可每隔些时间增加矩形大小,从而可实现人眼中的平滑效果。
CWnd::SetTimer():设置定时器。按设定的时间定时发送WM_TIMER消息。
说明:
UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );
//nIDEvent定时器标示,nElapse消息发送间隔时间,void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD)设置回调函数,如果设置则由设置的回调函数处理WM_TIMER消息,如果没有设置回调函数设为NULL,这发送的WM_TIMER消息压入消息队列,交由相关联的窗口处理(添加WM_TIMER消息处理函数OnTimer())。
afx_msg void OnTimer( UINT nIDEvent );
//响应WM_TIMER消息,nIDEvent为消息对应定时器标示(可以设置不同的定时器发送WM_TIMER消息)
问题:
1,在CCareView类中添加WM_CREATE消息响应函数OnCreate(),WM_CREATE消息是在什么时候被检查到而被响应的呢?
(猜测:添加WM_CREATE消息后,消息被压入消息队列,然后经过消息循环进行分发到具体窗口,从而进行响应)
2,现有一文本文件内容已经读入串STR中,要求在视图客户区按原先文本文件中的格式输出。
问题是,利用CDC的TextOut()来在CView类派生类窗口中输出串时,忽略了串中的TAB、回车换行等格式,无论串有多长均在一行上输出。
这其中是CDC类成员函数TextOut()忽略串中格式的,还是CView类派生类窗口设置从中做怪呢?怎么解决?
// 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()
ON_WM_CHAR()
ON_WM_LBUTTONDOWN()
ON_WM_TIMER()
//}}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
m_strLine="";
m_ptOrigin=0;
m_nWidth=0;
}
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)
{
CTextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//CString str("维新科学技术培训中心");
CString str;
str="维新科学技术培训中心";
pDC->TextOut(50,50,str);
CSize sz=pDC->GetTextExtent(str);
str.LoadString(IDS_WEIXIN);
pDC->TextOut(0,200,str);
pDC->BeginPath();
pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);
pDC->EndPath();
pDC->SelectClipPath(RGN_DIFF);
for(int i=0;i<300;i+=10)
{
pDC->MoveTo(0,i);
pDC->LineTo(300,i);
pDC->MoveTo(i,0);
pDC->LineTo(i,300);
}
}
/////////////////////////////////////////////////////////////////////////////
// CTextView printing
BOOL CTextView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CTextView::OnBeginPrinting(CDC* , CPrintInfo* )
{
// TODO: add extra initialization before printing
}
void CTextView::OnEndPrinting(CDC* , CPrintInfo* )
{
// 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
CClientDC dc(this);//构造一个DC
TEXTMETRIC tm;//
dc.GetTextMetrics(&tm);//利用dc调用其成员函数
// CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
//CBitmap bitmap;//放头文件中了,因为全局要析构的
bitmap.LoadBitmap(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();
SetTimer(1,100,NULL);
return 0;
}
void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CFont font;
font.CreatePointFont(300,"华文行楷",NULL);
CFont *pOldFont=dc.SelectObject(&font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
if(0x0d==nChar)
{
m_strLine.Empty();
m_ptOrigin.y+=tm.tmHeight;
}
else if(0x08==nChar)
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor());
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
}
else
{
m_strLine+=nChar;
}
CSize sz=dc.GetTextExtent(m_strLine);
CPoint pt;
pt.x=m_ptOrigin.x+sz.cx;
pt.y=m_ptOrigin.y;
SetCaretPos(pt);
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
dc.SelectObject(pOldFont);
CView::OnChar(nChar, nRepCnt, nFlags);
}
void CTextView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetCaretPos(point);
m_strLine.Empty();
m_ptOrigin=point;
CView::OnLButtonDown(nFlags, point);
}
void CTextView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
m_nWidth+=5;
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CRect rect;
rect.left=0;
rect.top=200;
rect.right=m_nWidth;
rect.bottom=rect.top+tm.tmHeight;
dc.SetTextColor(RGB(255,0,0));
CString str;
str.LoadString(IDS_WEIXIN);
dc.DrawText(str,rect,DT_LEFT);
rect.top=150;
rect.bottom=rect.top+tm.tmHeight;
dc.DrawText(str,rect,DT_RIGHT);
CSize sz=dc.GetTextExtent(str);
if(m_nWidth>sz.cx)
{
m_nWidth=0;
dc.SetTextColor(RGB(0,255,0));
dc.TextOut(0,200,str);
}
CView::OnTimer(nIDEvent);
}
分享到:
相关推荐
在本课程"第五课 掌握CDC的文字处理程序的编写 2"中,我们将深入学习如何利用CDC(Complex Device Class)技术来开发高效且功能丰富的文字处理程序。CDC是Microsoft Windows操作系统中的一个类库,它为设备驱动程序...
在编写CDC文字处理程序时,我们需要关注以下几个关键知识点: 1. **设备文件**:在Linux中,字符设备会被映射为文件,我们可以通过open、close、read、write等函数进行操作。理解设备文件的使用是编写驱动程序的...
在课程中,53.swf、54.swf、51.swf、52.swf这些文件可能包含了逐步的教学演示,通过动态的方式展示CDC文字处理程序的编写过程。这些SWF文件通常包含交互式教程或动画,帮助学习者更直观地理解CDC的使用方法和步骤。 ...
本教程将重点讲解如何利用CDC来编写文字处理程序,包括创建自定义字体、自定义插入符,以及熟练运用CString类。同时,我们还将通过实例——卡拉OK程序,学习如何设置定时器和使用DrawText函数,最后介绍CDC的裁减...
掌握CDC的文字处理程序的编写,如何产生自定义字体和自定义插入符,熟悉对CString类的使用。通过对卡拉OK程序的编写,讲解定时器的使用和DrawText函数的巧妙运用。讲解如何使用CDC的裁减功能。
内容索引:VC/C++源码,其它分类,文字处理,CDC 用VC++编写一个CDC文字处理程序的代码,通过本程序大家可掌握如何产生自定义字体和自定义插入符,熟悉对CString类的使用。讲解定时器的使用和DrawText函数的巧妙运用...
摘要:VC/C++源码,字符处理,CDC,文字处理程序 掌握CDC的文字处理程序的编写,此为一个示例源码,演示如何产生自定义字体和自定义插入符,熟悉对CString类的使用。通过对卡拉OK程序的编写,讲解定时器的使用和...
这通常涉及到字符串格式化,例如使用`strftime`函数可以将时间转换为用户友好的字符串。在VC中,我们还可以利用MFC(Microsoft Foundation Classes)库,它提供了丰富的控件和类来简化界面设计。比如,可以使用...
总结,"VC编写的查看图形小程序"是一个理想的实践项目,它涵盖了C++编程、Windows GUI开发、图形处理等多个重要知识点。无论是初学者还是有一定经验的开发者,都能从中获益,提升自己的编程技能。
掌握CDC的文字处理程序的编写,如何产生自定义字体和自定义插入符,熟悉对CString类的使用。通过对卡拉OK程序的编写,讲解定时器的使用和DrawText函数的巧妙运用。讲解如何使用CDC的裁减功能。
这个“VC++编写的适时绘图源程序”是一个专门用于实时图形绘制的软件开发项目,它可以实现动态地在屏幕上绘制图形,如图例、网格等,这对于数据分析、科学计算、工程应用等领域非常实用。 VC++中进行实时绘图通常...
开发者可能会用到CDC类来创建设备上下文,然后利用CPen、CBrush等类来设置线条和填充颜色,以及TextOut函数来输出文字。 在俄罗斯方块的实现中,关键部分是游戏逻辑的处理。这包括方块的生成、旋转、移动、消除行...
你可以利用C语言的字符串处理功能来构建浪漫的诗句,或者使用MFC的图形函数来绘制定制的图形和动画。总之,这是一个很好的实践项目,可以让你在学习C语言的同时,也展现出你的创意和情感。祝你好运,愿你的表白程序...
- 可以使用`std::istringstream`类将字符串分割成各个部分,以便更方便地处理包含数字的字符串。 2. **解一元二次方程**: - 一元二次方程的通用形式为ax² + bx + c = 0。C++中,我们可以定义一个函数,接受a、b...
- 包括但不限于:连接字符串配置、日志设置、性能优化等方面的内容。 - 文档还涵盖了监控和管理工具的使用方法,以确保CDC操作的顺利进行。 5. **安全性和合规性**: - 强调了安全性和合规性的重要性,特别是在...
字符串长度的控制、位置指针的管理以及空格符的处理等都体现了计算机程序员在编写程序时对存储效率的追求和对数据处理的精细控制。 总而言之,这篇论文在1985年探讨了大型计算机上字符串处理的基本方法,从存储单元...
8. **应用示例**:该驱动程序可能附带了一些示例代码或应用程序,帮助开发者快速理解如何使用STM32的串口功能,例如发送和接收字符串、数据帧等。 9. **错误处理**:为了确保可靠的数据传输,驱动程序通常会包含...
MFC提供了对资源(如图标、菜单、字符串表等)的管理,使得资源可以在多个地方复用,提高代码的可维护性。 10. **调试与优化**: 对于初学者来说,调试技巧和性能优化也是学习的重点。学会使用Visual Studio的...
开发者可能会使用MFC的 CString 类来处理字符串,CArray 或 CList 来存储学生的成绩,然后提供功能计算平均值。文件操作可以通过CFile类实现,读写成绩数据到磁盘。此外,可能还有用户界面用于输入和显示成绩,这...
掌握CDC的文字处理程序的编写,如何产生自定义字体和自定义插入符,熟悉对CString类的使用。通过对卡拉OK程序的编写,讲解定时器的使用和DrawText函数的巧妙运用。讲解如何使用CDC的裁减功能。