1、插入符(Caret):
(1) 文本插入符 函数的原型声明:(CWnd类)
void CreateSolidCaret ( int Nwidth, int nHeight );
·nwidth:指定插入符的宽度(逻辑单位)。参数值为0,则系统将其设置为系统定义的窗口边界的宽度。
·nHeight:(同理)...高度。
`默认是隐藏的,需调用 Showcatet(); 来显示;
插入符的创建应该在窗口创建之后进行,可以在WM_CREATE消息的响应函数OnCreate中(在创建窗口的代码之后)添加创建插入符的代码。
怎样得到设备描述表中当前字体的信息(即:文本信息):
调用CDC类的GetTextMetrics成员函数可以得到设备描述表中当前字体的度量信息。
BOOL GetTextMetrics( LPTEXTMETRIC lpMetrics ) const;
·该函数的参数是一个TEXTMETRIC结构体的指针;定义一个TEXTMETRIC结构体类型的变量,然后将该变量的地址传递给这个参数。
·通过GetTextMetrics这个函数调用,它会用设备描述表中当前字体的信息来填充这个结构体。
typedef struct tagTEXTMETRIC { LONG tmHeight; LONG tmAscent; LONG tmDescent; LONG tmInternalLeading; LONG tmExternalLeading; LONG tmAveCharWidth; LONG tmMaxCharWidth; LONG tmWeight; LONG tmOverhang; LONG tmDigitizedAspectX; LONG tmDigitizedAspectY; TCHAR tmFirstChar; TCHAR tmLastChar; TCHAR tmDefaultChar; TCHAR tmBreakChar; BYTE tmItalic; BYTE tmUnderlined; BYTE tmStruckOut; BYTE tmPitchAndFamily; BYTE tmCharSet; } TEXTMETRIC, *PTEXTMETRIC;
·字体没有一个具体的宽度值,只有一个平均值(tmAveCharWidth)。
(2) 图形插入符 的函数声明:
void CreateCaret( CBitmap* pBitmap );
·在使用这个函数前,需先构造一个CBitmap对象,并利用CBitmap的成员函数初始化位图对象之后,才能使用这个位图对象。
2、窗口重绘:
如果希望输入的内容始终保留在窗口上,就要在响应WM_PAINT消息的函数中将内容再次输出。MFC AppWizard产生的视类代码中,给我们提供了一个类似于WM_PAINT消息响应函数的OnDraw函数,当窗口发生重绘时,应用程序框架代码就会调用该函数。
(1) OnDraw函数;
void CTextView::OnDraw(CDC* pDC) { CTextDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here }
提示:CDC类封装的TextOut函数与Platform SDK提供的全局TextOut函数类的区别:前者不需要DC句柄作为参数,因为CDC内部专门有一个成员变量(m_hDC)保存了DC句柄。
3、路径:
路径层(path bracket)【设备描述表中】的概念:
路径层的作用:看代码效果!!!!
//cdc::GetTextExtent CSize GetTextExtent( const CString& str ) const;
·该函数可以获得一个字符串在屏幕上显示的宽度和高度;(要想得到字符串在窗口中的显示宽度,必须针对特定的字符串电泳GetTextExtent函数;
·返回一个CSize类型的对象,CSize类 类似于 Windows的SIZE结构体:
typedef struct tagSIZE { LONG cx; LONG cy; } SIZE, *PSIZE;
·cx 和 cy 表示 宽度 和 高度。
GetTextExtent 与 GetTextMetrics 的作用:
GetTextExtent函数:它获得的是设备描述表中当前字体的度量信息;
GetTextMetrics函数:则是获得某个特定的字符串在窗口中显示时所暂据的宽度和高度。
提示:设备描述表中有一个默认的白色画刷,当绘制图形时,默认用该画刷填充图形内部。
//CDC::SelectClipPath BOOL SelectClipPath( int nMode );
·作用:把当前设置的路径层和设备描述表中已有的裁剪区域按照一种指定的模式进行一个互操作;
·参数nMode用来指定互操作的模式;如RGN_DIFF(新的裁剪区域包含当前裁剪区域,但排除当前路径层区域)、RGN_AND(新的裁剪区域是当前裁剪区域和当前路径层的交集)等;
·该函数与路径层一起作用。
4、字符输入:
当用户在键盘上按下某个字符按键后,要把该字符输出到程序窗口上,该操作需要程序捕获键盘按下这一消息。WM_CHAR消息可以捕获这个消息,在该消息的响应函数中完成字符输出功能。
注意:TextOut函数在窗口中输出字符时,需要提供字符显示位置的x坐标和y坐标。
问题提出:
1、每个字符在屏幕上所占据的宽度都是不一样的,怎样获得下一个输入点的坐标?
2、程序应当在当前插入符的位置输出字符;
3、用来存储输入的字符串的成员变量:m_strLine的取值变化问题;
4、每次输入的字符串都应在当前插入符位置,也就是鼠标左键单击处开始显示;
5、在输出字符时,还应考虑到回车字符的处理;
6、在输出字符时,还要处理一个特殊的字符:退格键(Backspace);
7、插入符的位置如何随字符输出的变化而变化;
(1) 设置字体:CFont类 派生于 CGDiObject类,封装了一个Windows图形设备接口(GDI)的字体。
在构造了一个CFont对象后,必须利用该类提供的几个初始化函数之一对该对象进行初始化,然后才能使用这个对象:
在程序中,与其他GDI对象一样,当创建了一个字体对象并初始化后,还必须将它选入设备描述表,之后这个新字体才能发挥作用。我们可以保存这个字体,在使用完新字体后,再把设备描述表中的字体恢复为先前的字体。
(2) 字幕变色共更能的实现:
//CDC::DrawText int DrawText(const CString& str, LPRECT lpRect, UINT nFormat );
·功能:在指定的举行范围内输出文字;
//CWnd::SetTimer UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD) );
·如果这个函数调用成功,它将返回新定时器的标识。
·nIDEvent:指定一个非零值的定时器标识。(如果该函数调用成功,那么这个表示将作为返回值返回,即函数执行成功,它的第一个参数和返回值就是相等的)
·nElapse:指定定时器的时间间隔;毫秒为单位的。
·lpfnTimer:函数只剩,并且是一个回调函数。当设定好定时器之后,每隔设定的时间间隔,它就会发送一条定时器消息。如果在这里设置了回调函数,这时操作系统就会调用这个回调函数来处理定时器消息。如果我们将此参数设置为NULL值,定时器消息,即WM_TIMER消息就会被放到应用程序的消息队列中,然后由程序相应此消息的窗口对象来处理。
提示:对一个变量进行自加自减操作前,一定要初始化这个变量。否则,结果是不确定的。
5_文本编程