友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
C语言实例教程(PDF格式)-第42部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
Paste 将剪贴板中格式为CF_TEXT的数据
(如果有的话)插入到编辑框中的当
前位置。
Undo 撤销最后一次编辑操作
CanUndo 决定编辑控件的操作是否可以被撤
销
EmptyUndoBuffer 重置编辑控件的undo标志
GetModify 判断编辑控件中的内容是否被修改
过
SetModify 设置或清除编辑控件中的修改标志
SetReadOnly 设置编辑控件的只读状态
GetPasswordChar 当用户输入文本时获得编辑控件中
显示的密码字符
SetPasswordChar 设置或移去当用户输入文本时编辑
控件中显示的密码字符
GetFirstVisibleLine 获得编辑控件中最上面的可见行
LineLength 获得编辑控件中一行的长度
LineScroll 滚动多行编辑控件中的文本
LineFromChar 获得包含指定索引字符的行的行号
GetRect 获得编辑控件的格式矩形
LimitText 限制用户可以在编辑控件中输入的
文本的长度
GetLineCount 获得多行编辑控件中行的数 目
GetLine 获得编辑控件中的一行文本
LineIndex 获得多行编辑控件中一行的字符索
引
FmtLines 在多行编辑控件中设置是否包含软
换行符的开关
续表6。25
…………………………………………………………Page 351……………………………………………………………
成员函数 描述
SetTabStops 在多行编辑控件中设置制表位
SetRect 设置多行文本编辑控件的格式矩形,并更新
控件
SetRectNP 设置多行文本编辑控件的格式矩形,但不重
绘控件窗口
GetHandle 获得为多行编辑控件分配的内存的句柄
SetHandle 设置供多行编辑控件使用的本地内存句柄
GetMargins 获得当前CEdit对象的左右页边距
SetMargins 设置当前CEdit对象的左右页边距
GetLimitText 获得当前CEdit对象可以包括的最大文本量
SetLimitText 设置当前CEdit对象可以包括的最大文本量
CharFromPos 获得最接近于指定位图的行和字符的索引
PosFromChar 获得指定字符索引的左上角的坐标
上面的成员函数涵盖了编辑控件在使用中的很多方面,可以满足我们
在很多情况下的绝大部分需要。这里要注意的是,一些CWnd中定义的
成员函数也是很重要的,比如说我们常用CWnd的成员函数
GetWindowText和SetWindowText来获取和设置编辑控件的文本,使用
成员函数GetFont和SetFont来获取和设置编辑控件显示文本时所使用
的字体。
编辑控件可以向父窗口发送的通知消息也要比前面讲述的几种控件
多。这些消息有:
ON_EN_CHANGE: 编辑控件不能按选定需要
ON_EN_ERRSPACE: 分配足够的内存
ON_EN_HSCROLL: 用户单击了编辑控件中的
水平滚动条。父窗口在屏
幕更新前获得此消息
ON_EN_KILLFOCUS: 编辑控件失去输入焦点
ON_EN_MAXTEXT: 当前插入内容超过了编辑
…………………………………………………………Page 352……………………………………………………………
控件中的指定的字符数,
该插入内容已被裁剪。如
果控件没有设置
ES_AUTOHSCROLL样式,那
么在插入的字符超出了编
辑控件的宽度也发送该通
知消息。同样,如果控件
没有指定ES_AUTOVSCROLL
样式,该通知也以插入操
作导致总行数超过编辑控
件的高度时发送。
ON_EN_SETFOCUS: 编辑按钮获得输入焦点
ON_EN_UPDATE: 控件已对文本作了格式
化,但尚未显示文本。通
常可以处理该消息以决定
是否需要对窗口的大小作
改变等。
ON_EN_VSCROLL: 用户单击了编辑控件的垂
直滚动条。父窗口在屏幕
更新前收到该消息。
示例程序EditDemo演示了编辑控件的一般使用方法。按如下步骤创建
该工程:
1。 使用AppWizard创建基于对话框的工程EditDemo。
2。 向工程中添加菜单资源IDR_MAINMENU,该菜单资源包括两个顶层
菜单项 “文件 (&F)”和 “编辑 (&E)”, “文件 (&F)”下包括如图6。41
所示的菜单命令。各菜单命令 (不包括具有Separator样式的菜单项)
的资源ID依次为ID_FILE_NEW和ID_FILE_EXIT。 “编辑 (&E)”菜单下
包括如图6。42所示菜单命令。各菜单命令的资源ID依次为
ID_EDIT_UNDO、ID_EDIT_CUT、ID_EDIT_COPY、ID_EDIT_PASTE、
ID_EDIT_DEL、ID_EDIT_SELECTALL和ID_EDIT_SETFONT。
图6。 41 “文件”菜单下的菜单命令
…………………………………………………………Page 353……………………………………………………………
图6。 42 “编辑”菜单下的菜单命令
3。 按图6。43在应用程序的主对话框上绘制编辑框 (对应于Control工
具箱中的图标为 ),设置其ID为IDC_EDIT,并将其Multiline属性、
Auto VScroll属性和Want return属性设置为真,同时将Auto
HScroll属性设置为假。这里,编辑框IDC_EDIT在大小和位置并不重
要,我们将在程序中对其进行调整。
4。 删除原有的 “确定”按钮和 “取消”按钮。接着打开对话框本身
的属性对话框,从Menu下拉列表框中选择IDR_MAINMENU。
图6。 43 设置主对话框的Menu属性
5。 在资源管理器中打开菜单资源IDR_MAINMENU,如图6。44所示。在
任一菜单项上单击鼠标右键,选择命令ClassWizard 。这时
ClassWizard将弹出如图6。45所示的对话框,单击Cancel。在Object
IDs处选择ID_FILE_EXIT,在Messages处选择MAND,单击And
function按钮并接受默认的处理函数名OnFileExit,在函数
OnFileExit中调用类CDialog的成员函数OnCancel,如下面的代码所
示:
void CEditDemoDlg::OnFileExit()
{
// 调用基类成员函数 OnCancel 终止对话框
OnCancel();
}
按同样的方法为ID_FILE_NEW的MAND命令添加处理函数OnFileNew
如下:
…………………………………………………………Page 354……………………………………………………………
void CEditDemoDlg::OnFileNew()
{
// 将编辑控件中的文本初始化为零,
// 并清除其撤消缓冲区。
CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT);
pEdit…》SetWindowText(〃〃);
pEdit…》EmptyUndoBuffer();
}}
图6。 44 在Developer Studio 的资源编辑器中打开菜单资源IDR_MAINMENU
为ID_EDIT_UNDO的MAND命令添加处理函数OnEditUndo如下:
void CEditDemoDlg::OnEditUndo()
{
// 直接调用类 CEdit 的成员函数 Undo
CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT);
pEdit…》Undo();
}
…………………………………………………………Page 355……………………………………………………………
图6。 45 询问是否将菜单IDR_MAINMENU与某一视类相关联
为ID_EDIT_CUT的MAND命令添加处理函数OnEditCut如下:
void CEditDemoDlg::OnEditCut()
{
// 直接调用类 CEdit 的成员函数 Cut
((CEdit*)GetDlgItem(IDC_EDIT))…》Cut();
}
为ID_EDIT_COPY的MAND命令添加处理函数OnEditCopy如下:
void CEditDemoDlg::OnEditCopy()
{
// 直接调用类 CEdit 的成员函数 Copy
((CEdit*)GetDlgItem(IDC_EDIT))…》Copy();
}
为ID_EDIT_PASTE的MAND命令添加处理函数OnEditPaste如下:
void CEditDemoDlg::OnEditPaste()
{
// 直接调用类 CEdit 的成员函数 Paste
((CEdit*)GetDlgItem(IDC_EDIT))…》Paste();
}
为ID_EDIT_DEL的MAND命令添加处理函数OnEditDel如下:
void CEditDemoDlg::OnEditDel()
…………………………………………………………Page 356……………………………………………………………
{
// 直接调用类 CEdit 的成员函数 Clear
((CEdit*)GetDlgItem(IDC_EDIT))…》Clear();
}
为ID_EDIT_SELECT的MAND命令添加处理函数OnEditSelectall如
下:
void CEditDemoDlg::OnEditSelectall()
{
int nStart;nEnd;
// 设置选定字符的开始
nStart=0;
// 设置选定字符的结尾。函数 GetWindowTextLength 返回编辑控件中文本的长度
nEnd=((CEdit*)GetDlgItem(IDC_EDIT))…》GetWindowTextLength();
// 以 nStart 和 nEnd 为参数调用类 CEdit 的成员函数 SetSel
((CEdit*)GetDlgItem(IDC_EDIT))…》SetSel(nStart;nSel);
}
为ID_EDIT_SETFONT的MAND命令添加处理函数OnEditSetfont如
下:
void CEditDemoDlg::OnEditSetfont()
{
LOGFONT lf;
static CFont font;
// 获得编辑框原来使用的字体信息,并使用该信息初始化字体对话框
CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT);
pEdit…》GetFont()…》GetLogFont(&lf);
CFontDialog dlg(&lf);
// 弹出字体对话框以供用户选择新的字体,
…………………………………………………………Page 357……………………………………………………………
// 并在用户确认的情况下更改编辑控件所使用的字体。
if (dlg。DoModal()==IDOK)
{
dlg。GetCurrentFont(&lf);
font。DeleteObject();
font。CreateFontIndirect(&lf);
pEdit…》SetFont(&font);
}
}
在成员函数OnEditSetfont中所使用的方法和技巧已在第三节的末尾
讲述如何为按钮控件设置字体时进行了介绍。因此对于函数
OnEditSetfont我们不进行详细的注解。
6。 考虑下面的情况:如果当前没有可供撤消的操作, “编辑”菜单
下的 “撤消”应该处于不可用(变灰)状态;同样的,如果当前编辑控
件中没有选定任何文本,那么 “剪贴”、 “复制”以及 “删除”命令
也应该不可用;如果当前剪贴板中没有任何文本数据, “粘贴”命令
应该不可用。我们通过为消息WM_INITMENUPOPUP添加消息处理函数来
设置各菜单命令的可用状态。该消息在用户单击某菜单之后在菜单项
弹出之前发送。
对于类CEditDemoDlg,我们不能使用ClassWizard来为消息
WM_INITMENUPOPUP添加消息处理函数,但事实上,对话框也可以接收
到消息WM_INITMENUPOPUP。这里,我们可以手动来添加相应的消息映
射项。
第一步是在类CEditDemoDlg的定义中添加消息处理函数
afx_msg void OnInitMenuPopup( CMenu* pPopupMenu; UINT nIndex; BOOL bSysMenu );
可以把该处理函数的声明添加到由ClassWizard生成的消息处理函数
的后面。由ClassWizard生成的消息处理函数位于两行注释标记//
{{AFX_MSG和//}}AFX_MSG之间。同我们在此之前强调过的一样,不要
将OnInitMenuPopup的声明添加到两行注释之间。以后如果再遇到与
此相似的情况,我们将不再强调。
…………………………………………………………Page 358……………………………………………………………
接着添加相应的消息映射入口,在类CEditDemoDlg的实现文件
EditEemoDlg。cpp中找到宏BEGIN_MESSAGE_MAP(CEditDemoDlg;
CDialog),在它之后,宏END_MESSAGE_MAP之前添加下面的宏代码:
ON_WM_INITMENUPOPUP()
我们仍应将上面的代码添加到注释标记//{{AFX_MSG_MAP和//}}
AFX_MSG_MAP之外。同样的,以后如果再遇到这种情况我们将不再强
调。
最后添加函数OnInitMenuPopup的定义:
void CEditDemoDlg::OnInitMenuPopup( CMenu* pPopupMenu; UINT nIndex; BOOL
bSysMenu )
{
CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT);
// 当用户单击的是窗口的控制菜单时 bSysMenu 参数为真,否则为假
if (!bSysMenu)
{
// 检查编辑控件是否有可撤消的操作
if (pEdit…》CanUndo())
{
pPopup
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!