本文以一个简单的例子实现编辑控件的基本操作。
首先,新建一个对话框应用程序
然后在对话框上添加一个edit控件
修改menu菜单
添加处理程序
- void CEditDemoDlg::InitUi()
- {
- CRect rect;
- GetClientRect(&rect);
- CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT);
- if (pEdit)
- {
- pEdit->MoveWindow(&rect);
- }
- }
- void CEditDemoDlg::OnFileExit()
- {
- // 调用基类成员函数 OnCancel 终止对话框
- OnCancel();
- }
- void CEditDemoDlg::OnFileNew()
- {
- // 将编辑控件中的文本初始化为零, 并清除其撤消缓冲区。
- CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT);
- pEdit->SetWindowText("");
- pEdit->EmptyUndoBuffer();
- }
- void CEditDemoDlg::OnEditUndo()
- {
- // 直接调用类 CEdit 的成员函数 Undo
- CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT);
- pEdit->Undo();
- }
- void CEditDemoDlg::OnEditCut()
- {
- // 直接调用类 CEdit 的成员函数 Cut
- ((CEdit*)GetDlgItem(IDC_EDIT))->Cut();
- }
- void CEditDemoDlg::OnEditCopy()
- {
- // 直接调用类 CEdit 的成员函数 Copy
- ((CEdit*)GetDlgItem(IDC_EDIT))->Copy();
- }
- void CEditDemoDlg::OnEditPaste()
- {
- // 直接调用类 CEdit 的成员函数 Paste
- ((CEdit*)GetDlgItem(IDC_EDIT))->Paste();
- }
- void CEditDemoDlg::OnEditDel()
- {
- // 直接调用类 CEdit 的成员函数 Clear
- ((CEdit*)GetDlgItem(IDC_EDIT))->Clear();
- }
- 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,nEnd);
- }
- void CEditDemoDlg::OnEditSetfont()
- {
- LOGFONT lf;
- static CFont font;
- // 获得编辑框原来使用的字体信息,并使用该信息初始化字体对话框
- CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT);
- pEdit->GetFont()->GetLogFont(&lf);
- CFontDialog dlg(&lf);
- // 弹出字体对话框以供用户选择新的字体,
- // 并在用户确认的情况下更改编辑控件所使用的字体。
- if (dlg.DoModal()==IDOK)
- {
- dlg.GetCurrentFont(&lf);
- font.DeleteObject();
- font.CreateFontIndirect(&lf);
- pEdit->SetFont(&font);
- }
- }
- void CEditDemoDlg::OnInitMenuPopup( CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu )
- {
- CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT);
- // 当用户单击的是窗口的控制菜单时 bSysMenu 参数为真,否则为假
- if (!bSysMenu)
- {
- // 检查编辑控件是否有可撤消的操作
- if (pEdit->CanUndo())
- {
- pPopupMenu->EnableMenuItem(ID_EDIT_UNDO,MF_ENABLED);
- }
- else
- {
- pPopupMenu->EnableMenuItem(ID_EDIT_UNDO,MF_GRAYED);
- }
- // 检查编辑控件中是否有选定的文本
- int nStart,nEnd;
- pEdit->GetSel(nStart,nEnd);
- if (nStart==nEnd)
- {
- pPopupMenu->EnableMenuItem(ID_EDIT_CUT,MF_GRAYED);
- pPopupMenu->EnableMenuItem(ID_EDIT_COPY,MF_GRAYED);
- pPopupMenu->EnableMenuItem(ID_EDIT_DEL,MF_GRAYED);
- }
- else
- {
- pPopupMenu->EnableMenuItem(ID_EDIT_CUT,MF_ENABLED);
- pPopupMenu->EnableMenuItem(ID_EDIT_COPY,MF_ENABLED);
- pPopupMenu->EnableMenuItem(ID_EDIT_DEL,MF_ENABLED);
- }
- // 检查剪贴板中是否有文本格式的数据可供粘贴
- // 该过程通过调用 Win32 API 函数 IsClipboardFormatAvailable 来实现
- if (IsClipboardFormatAvailable(CF_TEXT))
- {
- pPopupMenu->EnableMenuItem(ID_EDIT_PASTE,MF_ENABLED);
- }
- else
- {
- pPopupMenu->EnableMenuItem(ID_EDIT_PASTE,MF_GRAYED);
- }
- }
- }
- void CEditDemoDlg::OnSize(UINT nType, int cx, int cy)
- {
- // 调用基类的 OnSize 成员函数
- CDialog::OnSize(nType, cx, cy);
- CRect rect;
- // 获得父窗口的客户区矩形
- GetClientRect(&rect);
- CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT);
- if (pEdit)
- {
- // 改变编辑控件的大小以适应父窗口大小的改变
- pEdit->MoveWindow(&rect);
- }
- }