按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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)
{
// 改变编辑控件