插入符:
在程序中想要创建插入符,
可以利用CWnd类的CreateSolidCaret()函数来完成,该函数的原型
void CreateSolidCaret(int nWidth,int nHeight);
nWidth:指定插入符的宽度,如果该参数为0,系统将自动设置
nHeight:指定插入符的高度,如果该参数为0,系统将自动设置
插入符的创建应该在窗口创建之后进行,可以在WM_CREATE消息的响应函数On
但是运行程序后,并没有发现插入符,为什么了,因为插入符初始是隐藏的
我们需要调用ShowCaret()函数来显示它
所以在On
CreateSolidCaret(20,100);
ShowCaret();
一般我们都是根据字体大小的不同来设置插入符的大小,那么我们如何获取当前的字体大小了?
调用CDC类的
函数原型 BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics) const;
现在,我们来根据字体的大小和平均宽度来创建插入符
//创建设备描述表
CClientDC dc(this);
//定义文本信息结构体变量
TEXTMETRIC tm;
//获得设备描述表中的文本信息
dc.GetTextMetrics(&tm);
//根据字体的大小,创建合适的插入符
CreateSolidCaret(tm.tmAveCharWidth/6,tm.tmHeight);
//显示插入符
ShowCaret();
提示:tm是一个存放字体信息的结构体 成员变量 tmAveCharWidth 表示字体的平均宽度
成员变量 tmHeight 表示字体的高度
这就要关系到字体的高度跟宽度 计算机是怎么记录的
我们这里只简单的说一下
1.字体的高度是一个固定的值
2.但字体的宽度是不固定的 有的字体窄 有的字体宽 例如 W 根 I
所以我们只能取字体的平均宽度 在除以一个其他的数来获得
创建
要创建一个图形插入符,可以利用CWnd类的CreateCaret函数来实现,函数原型:
void CreateCaret(CBitmap* pBitmap);
所以我们可以在On
bitmap.LoadBitmap(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();
提示:这里的bitmap没有在此处声明,而是在视图类中的头文件中声明的,这是为什么了,这是因为如果把bitmap定义为一个局部变量,当On
将看不到我们的图形插入符了,我们可以把bitmap定义为一个局部变量看一下效果
Windows程序运行时候,如果窗口大小发生变化,窗口将会发生重绘,那么窗口中已输入的文字或图形就会被擦除掉,如果希望输入的内容始终保留在窗口上,就要在响应WM_PAINT消息的函数中将内容再次输出,在MFC AppWizard产生的视图类代码中,有一个消息响应函数On
所以如果要让一段文字始终显示在窗口上,我们可以在On
例如 在On
CString str = "狂人树编程之家--VC++ 深入编程";
pDC->TextOut(50,50,str);
提示:这样,"狂人树编程之家--VC++ 深入编程" 这几个文字将始终显示在窗口上 我们可以把这段代码移动到其他的地方,当窗口大小改变时,可以看下会发生什么效果
此处的pDC是一个CDC对象的指针,这个是应用程序框架窗口自动传过来的,所以我们可以不用声明就直接使用
路径:
裁剪区域:我们可以把裁剪区域理解为一个绘图区域,其大小可以由我们来控制
创建路径层:利用CDC类提供的BeginPath和EndPath这两个函数来实现
前着打开一个路径层 后者关闭一个路劲层
CDC类为我们提供了一个
CSize GetTextExtent(const CString& str) const;
CDC类提供了一个
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中常用的文字输出函数有
BOOL TextOut (HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString);
参数:
hdc:设备环境句柄。
nXStart:指定用于字符串对齐的基准点的逻辑X坐标。
nYStart:指定用于字符串对齐的基准点的逻辑Y坐标。
lpString:指向将被绘制字符串的指针。此字符串不必为以