VC++6简明教程
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here CString str;
str.Format(“鼠标左键双击的位置是[%d,%d]”,m_LPoint.x,m_LPoint.y); pDC->TextOut(0,0,str); }
4. 在视图类增加鼠标左键双击的消息映射,修改成员变量,更新视图
(1) 打开ClassWizard,选择Message Map标签,Class Name列表中选择CExam5_1View,Object IDS
列表中选择CExam5_1View,Messages列表中选择WM_LBUTTONDBLCLK,单击“Add Function”按钮,添加鼠标左键双击消息映射。
(2) 单击“Edit Code”按钮,添加处理代码,用当前鼠标位置Point值替换m_LPoint的值,并设置
无效区域,刷新视图。
程序清单5-6:产生重绘消息的鼠标消息处理函数
void CExam5_1View:: OnLButtonDblClk(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or call default m_LPoint=point; Invalidate(TRUE); CView::OnLButtonDblClk(nFlags, point); }
5. 编译、链接、执行,可得到如图5-3所示的结果
5.2 处理文本
在窗口应用程序中经常使用GDI处理文本输出,文本的输出过程包括文本的属性设置、字体设置、文本格式化、调用文本输出函数输出文本等具体的过程,下面将分别讲述。
5.2.1设置文本颜色
在窗口操作系统中采用32位来表示颜色,MFC和SDK采用COLORREF数据结构表示颜色,COLORREF的结构如图5-4所示,采用8位(值域范围为0-255)分别表示红、蓝、绿三色。定义颜色的最简单的方法是使用RGB()宏,它采用三个参数,用0-255的值来表示红色、蓝色、绿色。同样使用宏GetRValue(),GetGValue(),GetBValue()可以从一个COLORREF类型的变量中分离三元色。 .
6
第5章 图形与文本输出
图5-4 颜色的表示
常用设备颜色清单
//基本三元色
COLORREF crRed=RGB(255,0,0); COLORREF crGreen=RGB(0,255,0); COLORREF crBlue=RGB(0,0,255) // 16-color设备支持颜色
const COLORREF g_crBlack = RGB(0,0,0);
const COLORREF g_crYellow = RGB(255,255,0); const COLORREF g_crDkYellow = RGB128,128,0); const COLORREF g_crRed = RGB(255,0,0); const COLORREF g_ crDkRed = RGB(128,0,0); const COLORREF g_crMagenta = RGB(255,0,255); const COLORREF g_ crDkMagenta = RGB128,0,128); const COLORREF g_crBlue= RGB(0,0,255); const COLORREF g_ crDkBlue = RGB(0,0,128); const COLORREF g_crCyan = RGB(0,255,255); const COLORREF g_ crDkCyan = RGB(0,128,128); const COLORREF g_crGreen = RGB(0,255,0); const COLORREF g_ crDkGreen = RGB(0,128,0); const COLORREF g_crGray = RGB(192,192, 192); const COLORREF g_ crDkGray = RGB(128, 128, 128); const COLORREF g_crWhite = RGB(255,255,255); // 256色设备支持的颜色举例
const COLORREF g_crLtYellow = RGB(255,251,240); const COLORREF g_crLtGreen = RGB(192,220,192); const COLORREF g_crLtBlue = RGB(166,202,240); const COLORREF g_crMedGreen = RGB(160,160,164);
设置颜色的场合有设置文本颜色、设置画笔和画刷的颜色。设置画笔和画刷的颜色的方法我们将在介绍GDI对象时讲述,设置文本颜色包括设置前景色和背景色。
(1) 为了设置在绘制文本的前景像素时使用的颜色,调用CDC::SetTextColor(),函数定义如下:
COLORREF SetTextColor(COLORREF crColor);
(2) 为了设置在绘制文本的背景像素时使用的颜色,调用CDC::SetBkColor(),函数定义如下:
COLORREF SetBkColor(COLORREF crColor);
7
VC++6简明教程
对Exam5_1程序增加实现产生黑色背景,红色文本的视图。程序清单见下面粗体部分: 程序清单5-7:在视图中设置颜色的OnDraw()函数
void CExam5_1View::OnDraw(CDC* pDC) { CExam5_1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->SetTextColor (RGB(255,0,0)); pDC->SetBkColor (RGB(0,0,0)); CString str;
str.Format(\鼠标左键双击的位置是[%d,%d]\ pDC->TextOut(0,0,str); }
5.2.2设置文本显示属性
CDC还提供了设置文本显示属性的函数,下表5-2列出了三组控制文本的显示属性常用函数:
表5-2 文本属性设置函数
函 数 SetBkMode和GetBkMode SetTextAlign和GetTextAlign SetTextJusttification SetTextCharaterExtra 说 明 设置和获得背景模式 设置和获得对齐方式 调整文本
文本背景模式的默认设置是OPAQUE,它要求GDI用户要使用背景颜色,可替换设置为TRANSPARENT,要求GDI用户在绘制文本时,不要使用背景色,函数的格式:
int CDC::SetBkMode ( int nBkMode );
SetBkMode()函数返回先前的背景模式,nBkMode表示背景模式,只有两种:OPAQUE和TRANSPARENT。
int CDC::GetBkMode ( ) const;
GetBkMode()函数返回当前使用的背景模式。
文本对齐描述了(x,y)文本坐标和文本框之间的关系。默认设置将文本与文本坐标右下方对齐。可使用SetTextAlign函数设置文本对齐,函数格式:
UINT SetTextAlign ( UINT nFlags );
nFlag 为表5-3中列出的标志的组合,各栏中的标志之间相互排斥,只能从一栏中取一种标志,第一行为系统的默认设置值,例如:
pDC->SetTextAlign(TA_RIGHT|TA_TOP);
表5-3文本对齐风格
X轴对齐 TA_LEFT TA_CENTER TA_RIGHT Y轴对齐 TA_TOP TA_BASELINE TA_BOTTOM 更新当前位置 TA_NOUPSATECP TA_UPDATECP 8
第5章 图形与文本输出
如果准备将不同字体,不同字号的文本混合在一行,使用y轴默认设置TA_TOP将产生奇怪的现象,这时应该更改y轴默认设置为 TA_BOTTOM。
SetTextJusttification()和SetTextCharaterExtra()函数用于设置文本属性:文本调整和文本额外间隔。这两种属性能够帮助填补文本行。填补文本行是为了生成WYSIWYG(所见即所得)输出。在大多数情况下,它意味着显示屏幕输出变形,以模仿打印输出的效果。 SetTextJusttification()函数能够指定添加到各个间隔字符的像素数,如果需要更多地填充,则应调用SetTextCharaterExtra()函数,将额外的像素添加到各个字符(而不是间隔字符)。
5.2.3 设置字体
字体是一组复杂的图形图像,大小和设计都是统一的,用于表示字符数据。字体通常由磅值、名称和风格标识的,如8磅粗体Arial这样的风格。
处理字体的最简单的方法是使用GDI的常备字体,如要自己设置显示字体的风格需要创建一个CFont的对象,具体步骤如下: 1. 定义CFont对象
2. 调用CreateFont()函数创建字体
3. 将创建的字体对象选入DC,并保存前一个被选入DC的字体对象
CreateFont()函数包括大量参数,具体解释如下: (1) 格式:
BOOL CreateFont(
int nHeight, //字体所需高度,为0使用默认值
int nWidth, //字符的宽度值,为0表示设备的纵横比匹配可用字体的纵横比 int nEscapement, //字体转义,指定转义矢量和x轴的夹角
int nOrientation, //字体方向,指定字符基线和x轴的夹角(以0.1度为单位) int nWeight, //字体厚度
BYTE bItalic,//是否斜体,布尔值
BYTE bUnderline, //是否带有下划线,布尔值 BYTE cStrikeOut, //是否带有删除线,布尔值 BYTE nCharSet, //使用的字符集 BYTE nOutPrecision, //输出精度 BYTE nClipPrecision, //剪取精度 BYTE nQuality, //输出质量
BYTE nPitchAndFamily, //字符间距和字族 LPCTSTR lpszFacename //字体的字样名称 );
(2) 返回值:
如果成功,返回非0值;失败,返回0值。 (3) 参数:
nWeight 字体厚度常用参数有:FW_NORMAL、FW_REGULAR和FW_BOLD
nCharSet 字符集常用参数有:ANSI_SHARSET、DEFAULT_CHARSET、SYBOL_CHARSET、SHIFTJIS_CHARSET、OEM_CHARSET等
nOutPrecision 输出精确度定义。输出与请求使用的字体的高度、宽度、字符走向、转义和字间距
9
VC++6简明教程
的匹配程度,常用参数有:OUT_CHARACTER_PRECIS、 OUT_STRING_PRECIS、OUT_DEFAULT_PRECIS、OUT_DEVICE_PRECIS等等。
nClipPrecision 剪取精度定义。如何剪取部分位于剪取区域之外的字符,常用参数有:CLIP_CHARACTER_PRECIS、 CLIP_DEFAULT_PRECIS、CLIP_MASK。
nQuality 字体的输出质量定义。GDI怎样才能将逻辑字体属性与实际物理字体匹配起来,常用参数值:DEFAULT_QUALITY、DRAFT_QUALITY和PROOF_QUALITY。
nPitchAndFamily 通常是字符间距与字族的组合值,如:
DEFAULT_PITCH|FF_DONTCARE
下面通过实例显示字体对象的创建和使用。运行效果如图5-5所示:
图5-5 设置字体效果
程序清单5-8:在视图中创建并使用字体对象的OnDraw()函数 void CExam5View::OnDraw(CDC* pDC) { CExam5Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CFont NewFont; NewFont.CreateFont (65,65,0,0,FW_DONTCARE,
true,false,false,DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH|FF_DONTCARE, \黑体\
CFont *pOldFont; pOldFont=pDC->SelectObject (&NewFont); pDC->TextOut(10,10,\倾斜的黑体字\ }
10
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库VC++6.0入门第五章 图形和文本输出(2)在线全文阅读。
相关推荐: