MFC

插入符:当我们在某些文本编辑的地方输入文字的时候,一闪一闪的那个光标就被称之为插入符

在程序中想要创建插入符,

可以利用CWnd类的CreateSolidCaret()函数来完成,该函数的原型

void CreateSolidCaret(int nWidth,int nHeight);

nWidth:指定插入符的宽度,如果该参数为0,系统将自动设置

nHeight:指定插入符的高度,如果该参数为0,系统将自动设置

插入符的创建应该在窗口创建之后进行,可以在WM_CREATE消息的响应函数OnCreate中添加创建插入符的代码 CreateSolidCaret(20,100);

但是运行程序后,并没有发现插入符,为什么了,因为插入符初始是隐藏的

我们需要调用ShowCaret()函数来显示它

所以在OnCreate函数中,我们添加如下代码:

CreateSolidCaret(20,100);

ShowCaret();

一般我们都是根据字体大小的不同来设置插入符的大小,那么我们如何获取当前的字体大小了?

调用CDC类的GetTextMetrics成员函数可以得到设备描述表中当前字体的度量信息

函数原型 BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics) const;

现在,我们来根据字体的大小和平均宽度来创建插入符

//创建设备描述表

CClientDC dc(this);

//定义文本信息结构体变量

TEXTMETRIC tm;

//获得设备描述表中的文本信息

dc.GetTextMetrics(&tm);

//根据字体的大小,创建合适的插入符

CreateSolidCaret(tm.tmAveCharWidth/6,tm.tmHeight);

//显示插入符

ShowCaret();

提示:tm是一个存放字体信息的结构体 成员变量 tmAveCharWidth 表示字体的平均宽度 这里除以6只是一个经验问题 只要找到合适的就可以

成员变量 tmHeight 表示字体的高度 有人可能会想 为什么宽度要除以6 高度不用了

这就要关系到字体的高度跟宽度 计算机是怎么记录的

我们这里只简单的说一下

1.字体的高度是一个固定的值

2.但字体的宽度是不固定的 有的字体窄 有的字体宽 例如 W 根 I

所以我们只能取字体的平均宽度 在除以一个其他的数来获得

创建图形插入符:

要创建一个图形插入符,可以利用CWnd类的CreateCaret函数来实现,函数原型:

void CreateCaret(CBitmap* pBitmap);

所以我们可以在OnCreate函数中添加如下代码

bitmap.LoadBitmap(IDB_BITMAP1);

CreateCaret(&bitmap);

ShowCaret();

提示:这里的bitmap没有在此处声明,而是在视图类中的头文件中声明的,这是为什么了,这是因为如果把bitmap定义为一个局部变量,当OnCreate函数执行完后,这个bitmap对象就要发生析构,所以bitmap资源就被销毁了,

将看不到我们的图形插入符了,我们可以把bitmap定义为一个局部变量看一下效果

窗口重绘:

Windows程序运行时候,如果窗口大小发生变化,窗口将会发生重绘,那么窗口中已输入的文字或图形就会被擦除掉,如果希望输入的内容始终保留在窗口上,就要在响应WM_PAINT消息的函数中将内容再次输出,在MFC AppWizard产生的视图类代码中,有一个消息响应函数OnDraw(),当窗口发生重绘时,应用程序框架代码就会调用该函数

所以如果要让一段文字始终显示在窗口上,我们可以在OnDraw函数中添加代码

例如 在OnDraw()函数中添加如下代码:

CString str = "狂人树编程之家--VC++ 深入编程";

pDC->TextOut(50,50,str);

提示:这样,"狂人树编程之家--VC++ 深入编程" 这几个文字将始终显示在窗口上 我们可以把这段代码移动到其他的地方,当窗口大小改变时,可以看下会发生什么效果

此处的pDC是一个CDC对象的指针,这个是应用程序框架窗口自动传过来的,所以我们可以不用声明就直接使用

路径:

路径层:在设备描述表中,有一个路径层的概念 路径层就相当于 把一块区域占领后,给标识起来

裁剪区域:我们可以把裁剪区域理解为一个绘图区域,其大小可以由我们来控制

创建路径层:利用CDC类提供的BeginPath和EndPath这两个函数来实现

前着打开一个路径层 后者关闭一个路劲层

CDC类为我们提供了一个GetTextExtent函数,利用这个函数可以获得一个字符串在屏幕上显示的高度和宽度 函数原型如下:

CSize GetTextExtent(const CString& str) const;

CDC类提供了一个SelectClipPath函数,该函数的作用是把当前这只的路径层和设备描述表中已有的裁剪区域按照一种指定的模式进行一个互操作 函数原型如下:

BOOL SelectClipPath(int nMode);

nMode:用来指定互操作的模式,可以有多种取值

例如RGN_DIFF,该模式的含义是新的裁剪区域包含当前裁剪区域,但排除当前路径层区域 RGN_AND 正好相反

提示:我们可能会想,这里为什么不用GetTextMetrics呢,GetTextMetrics函数获得的是设备描述表中当前字体的度量信息,而GetTextExtent函数则是获得某个特定的字符串在窗口中显示时所占据的宽度和高度

所以我们可以利用这个函数获得的数据画一个矩形,把窗口上的文字框起来

具体代码如下:

CString str = "狂人树编程之家--VC++ 深入编程";

pDC->TextOut(50,50,str);

//获取特定字符串在屏幕上显示的宽度根高度

//返回一个CSize类型变量存储

CSize sz = pDC->GetTextExtent(str);

//pDC->BeginPath();

//创建一个空画刷

CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

CBrush *pOldBrush = pDC->SelectObject(pBrush);

pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);

pDC->SelectObject(pOldBrush);

//pDC->EndPath();

在MFC中常用的文字输出函数有

1.TextOut       2.DrawText

那它们有什么区别呢?

BOOL TextOut (HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString);

  参数:

  hdc:设备环境句柄。

  nXStart:指定用于字符串对齐的基准点的逻辑X坐标。

  nYStart:指定用于字符串对齐的基准点的逻辑Y坐标。

  lpString:指向将被绘制字符串的指针。此字符串不必为以

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值