前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >VC++6.0入门——第五讲 文本编程

VC++6.0入门——第五讲 文本编程

原创
作者头像
Arya
发布2024-11-18 11:15:46
发布2024-11-18 11:15:46
1370
举报
文章被收录于专栏:后端开发专栏后端开发专栏

文章开始之前,推荐一些别人写的很好的文章!感兴趣的也可以去读一下哦!

今日推荐:Shell编程中,当登录服务器时显示“-bash-4.2$”怎么办?

文章链接:https://cloud.tencent.com/developer/article/2465870

某一天登录远程服务器时,突然没有了登录成功的页面,报错有的时候并不复杂,复杂的是基础知识是否掌握,见到的报错是否多样,如果答案是”是“的话,那么深化下去将会变得容易。

引出


VC++6.0入门——第四讲 简单绘图

第五讲 文本编程

相信大多数读者都有过使用Word和记事本程序的经验,Word和记事本这类文本处理软件可以让我们输入文字,并对文字进行编辑和修改,本章将介绍与文字处理相关的编程操作。

新建项目

输入线的初始化

常用的文本处理程序有Wod、记事本和写字板,我们所使用的VC++集成开发环境也可以看成是一个文本处理程序,在它的源代码编辑窗口中可以输入、编辑和修改代码。不难发现,在这些文本处理程序的编辑窗口中都有一条闪烁的竖线,将之称为插入符(Caet)。插入符可以用于提示用户:你输入的文字信息将在这个插入符所在的位置显示出来。

输入的竖直线,一闪一闪的输入

增加Windows消息处理

根据字体大小定义插入符大小

代码语言:java
复制
int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here

	// 确定符号大小
	CClientDC dc(this); // 当前设备描述表describe
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm); // 取地址符

	// 创建一个插入符号
	CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
	ShowCaret(); // 显示出来

	return 0;
}

创建图形插入符

上面创建的是一般文字处理程序所使用的文本插入符,下面将介绍如何创建图形插入符,这可以利用CWnd类的另一个函数:CreateCaret来实现。该函数的声明形式如下所示: void Createcaret(CBitmap*pBitmap )

文字始终保存在窗口中

CString类

代码语言:java
复制
/////////////////////////////////////////////////////////////////////////////
// CTextView drawing

void CTextView::OnDraw(CDC* pDC)
{
	CTextDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

	// CString
	CString str("pet");
	pDC->TextOut(50,50,str);

}

通过字符串资源

代码语言:java
复制
/////////////////////////////////////////////////////////////////////////////
// CTextView drawing

void CTextView::OnDraw(CDC* pDC)
{
	CTextDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

	// CString
	CString str("pet");
	pDC->TextOut(50,50,str);

	// 使用字符串资源
	str.LoadString(IDS_PET);
	pDC->TextOut(0,200,str);


}

路径层

字符输入的功能

键盘输入消息

鼠标左键消息

代码语言:java
复制
void CTextView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

	// 移动插入符到这里
	SetCaretPos(point);
	m_strLine.Empty(); // 将cstring中保存的内容情空
	CView::OnLButtonDown(nFlags, point);
}
保存点击位置的坐标

输入回车键的处理

删除文字的实现

将文本的颜色设置成和背景色一样

字符输入功能代码

1.鼠标左键定位插入字符位置;

2.特殊字符的处理,回车键,删除键;

3.光标随着输入的字符移动;

代码语言:java
复制
void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default

	// 字体的高度
	CClientDC dc(this);
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);


	printf("%u\n", nChar);

	if(0x0d==nChar) // 输入的是回车
	{
		m_strLine.Empty(); // 清空
		m_ptOrig.y += tm.tmHeight; // 到下一行

	}else if(0x08==nChar) // 输入的是删除
	{
		// 获取背景色,文本颜色设置成背景色
		COLORREF clr = dc.SetTextColor(dc.GetBkColor());
		// 然后输出
		dc.TextOut(m_ptOrig.x,m_ptOrig.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_ptOrig.x + sz.cx;
	pt.y = m_ptOrig.y;
	SetCaretPos(pt);

	dc.TextOut(m_ptOrig.x,m_ptOrig.y,m_strLine);
	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(); // 将cstring中保存的内容情空
	m_ptOrig = point;  // 保存坐标值
	CView::OnLButtonDown(nFlags, point);
}

字体的修改

vc++6.0中的字体

Windows系统中的字体

代码语言:java
复制
	// 定义字体
	CFont font;
	font.CreatePointFont(300, "华文行楷", NULL);
	CFont *pOldFont = dc.SelectObject(&font);

模拟卡拉ok变色字体

读者平时在唱卡拉OK时,应该注意到歌曲字幕会随着曲调的播放而有一个平滑的变色过程。如何在程序中实现这种效果呢?如果我们先把字符串输出到屏幕上,接着把文本的颜色设置为新的颜色,然后一个字符一个字符地输出显示该字符串,也可以达到一种变色效果,但不能达到平滑的变色效果。为了达到卡拉OK字幕那样平滑的变色效果,我们需要利用CDC类提供的另一个输出文字的函数:DrawText来实现。DrawText函数的作用是在指定的矩形范围内输出文字。

该函数的一种声明形式如下所示:

int DrawText const cString&str,LPRECT lpRect,UINT nFormat )

代码语言:java
复制
void CTextView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	
	// 显示大小按5个像素增加
	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_PET);
	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);
}

总结

VC++6.0入门——第四讲 简单绘图

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引出
  • 第五讲 文本编程
    • 新建项目
    • 输入线的初始化
    • 根据字体大小定义插入符大小
    • 创建图形插入符
    • 文字始终保存在窗口中
      • CString类
      • 通过字符串资源
    • 路径层
    • 字符输入的功能
      • 键盘输入消息
      • 鼠标左键消息
      • 输入回车键的处理
      • 删除文字的实现
    • 字符输入功能代码
    • 字体的修改
    • 模拟卡拉ok变色字体
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档