友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
喜书网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言实例教程(PDF格式)-第58章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




具箱中的图标为          ),设置其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())  



{  



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)  


…………………………………………………………Page 359……………………………………………………………

{  



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);  



}  



}  



}  



7。   最后我们希望一点,就是说用户可以改变对话框的大小,而且当 

用户改变对话框的大小时,编辑框自动的改变其大小以适应父窗口大 

小的变化。方法是为WM_SIZE添加消息处理函数。在进行这一步操作 

之前,打开对话框的Dialog   Properties对话框,在Styles选项卡中 


…………………………………………………………Page 360……………………………………………………………

将其Border属性设置为Resizing                                (即可以改变大小),同时将 

Maximize             box属性值设置为真。然后,使用ClassWizard为消息 

WM_SIZE添加消息处理函数OnSize,其定义如下:  



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)  



{  



// 改变编辑控件
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!