按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect。Width() cxIcon + 1) / 2;
int y = (rect。Height() cyIcon + 1) / 2;
// 绘制图标
dc。DrawIcon(x; y; m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
…………………………………………………………Page 195……………………………………………………………
// 在用户拖动被最小化的窗口时系统调用该函数来获得用于显示的光标。
HCURSOR CDialogDemoDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
在实现文件DialogDemoDlg。cpp 中包括了类CAboutDlg的定义,该类封
装了应用程序的 “关于”对话框。由于类CAboutDlg与类
CDialogDemoDlg相比要简单得多,所以我们在此不再讲述。下面我们
主要分几个部分来讲述类CDialogDemoDlg 。
(1) 构造函数
在类CDialogDemoDlg的构造函数中,注释分隔符AFX_DATA_INIT用于
在对话框类的构造函数中标记对话框数据交换 (DDX)成员变量初始化
的开始和结束。接着使用MFC全局函数AfxGetApp获得指向应用程序对
象的指针,再通过该指针调用成员函数LoadIcon加载图标,并将其句
柄放入成员变量m_hIcon。
类CDialogDemoDlg的成员函数DoDataExchange只是简单的调用基类的
对应成员函数。在成员函数DoDataExchange 内,注释分隔符
AFX_DATA_MAP用于标记对话框数据交换函数调用的开始和结束。
l 注意:
l 尽管在接下来的一章中,我们将要再次对菜单的应用作系统的介
绍,但考虑到程序说明的完整性,在这里,我们仍然先对其作简
明的介绍。
(2) 消息处理成员函数OnInitDialog
消息处理函数OnInitDialog首先调用基类的对应成员函数。接着的两
个ASSERT宏断言IDM_ABOUTBOX处于系统命令范围内。ASSERT宏以一个
布尔表达式为参数,然后对该表达式求值,如果结果为0 (假),
ASSERT输出一个诊断信息,然后中断程序,如果结果为非0,宏
ASSERT什么也不做。
由宏ASSERT输入的诊断信息具下面的格式:
…………………………………………………………Page 196……………………………………………………………
assertion failed in file in line
在这里文件名代表了出现ASSERT错的源代码文件,行号指出了源代码
文件中出错的行。
在MFC的发行版本 (Release version)中,宏ASSERT并不对表达式进行
求值,从而也不会中断程序的执行。与宏ASSERT不同,宏VERIFY在
MFC中调试版本和发行版本中都将对表达式进行求值。
接下来,由类CWnd的成员函数GetSystemMenu返回控制菜单的一个拷
贝。如果传递给该函数的参数为假,函数GetSystemMenu返回正在使
用的控制菜单的一个拷贝的句柄。该拷贝同控制菜单完全相同,但它
可以修改。如果传递的参数为真,函数GetSystemMenu重置控制菜单
为默认值,如果原有控制菜单经过修改,该改动将丢失。在这种情况
下,函数GetSystemMenu的返回值是未定义的。可以通过由成员函数
GetSystemMenu返回的指针使用CMenu::AppendMenu、
CMenu::InsertMenu或CMenu::ModifyMenu函数来改变控制菜单。
控制菜单最初包括由不同ID值,如SC_CLOSE、SC_MOVE和SC_SIZE等标
识的项。这些控制菜单中的项产生WM_SYSMAND消息。所有预定义
的控制菜单具有大于0xF000的ID值,因此,如果应用程序向控制菜单
中添加了新的项,这些项所使用的ID值应该小于0xF000。
Windows可以自动的决定是否使标准控制菜单中的项变灰。类CWnd可
以通过响应WM_INITMENU来执行检查或变灰,该消息在所有菜单显示
之前发送。
表4。 4 成员函数AppendMenu 的nFlags参数
值 含义
MF_CHECKED 在菜单项前面放置一个默认的选中
标记。当应用程序提供了选中标记
位图时,则使用表示选中状态的位
图。
MF_UNCHECKED 清除菜单项前面的选中标记。如果
应用程序提供了选中标记位图,则
使用表示不选中状态的位图。
MF_DISABLED 禁止某项被选择,但不使其变灰。
MF_ENABLED 允许某项被选择。
MF_GRAYED 禁止某项被选择,并使其变灰。
…………………………………………………………Page 197……………………………………………………………
MF_MENUBARBREAK 对于静态菜单,将项放到新的一
行,对于弹出菜单,将项放到新的
一列。新的弹出菜单列和旧的列使
用垂直分隔线隔开。
MF_MENUBREAK 将项放到新的一行,或弹出菜单的
新的一列。列之间没有任何分隔
线。
MF_OWNERDRAW 指定项为一个自绘制项。当菜单第
一次显示时,拥有该菜单的窗口将
收到消息WM_MEASUREITEM,该消息
包括了菜单项的高度和宽度。而每
次当需要更新菜单项的显示外观
时,将发送消息。该选对顶层菜单
项无效。
WM_POPUP 指定该菜单项具有一个相关联的弹
出菜单。ID参数指定与该项相关的
弹出菜单句柄。该标志用来添加顶
层弹出菜单或将一弹出菜单添加到
另一弹出菜单。
WM_SEPARATOR 绘制一个水平分隔线。仅用于弹出
式菜单。该行不可以变灰,不可以
被禁止,也不可以被加亮,并且其
它参数被忽略。
MF_STRING 指定菜单项为一字符串。
如果由函数GetSystemMenu返回的指针不为空,则通过一个CString对
象strAboutMenu从资源文件中加载字符串IDS_ABOUTBOX。如果成功的
话 (通过检验strAboutMenu是否为空来判断),将该菜单项添加到控制
菜单中。
添加菜单项使用类CMenu的成员函数AppendMenu。该函数具有如下的
原型:
BOOL AppendMenu( UINT nFlags; UINT nIDNewItem = 0; LPCTSTR lpszNewItem = NULL );
BOOL AppendMenu( UINT nFlags; UINT nIDNewItem; const CBitmap* pBmp );
第一个参数nFlags指定了在新添加菜单时关于新增菜单项的状态的信
息。它可以为表4。4所列的一个或多个值。需要注意的事是表4。4中所
列的某些标志是互斥的,也就是说这其中的一些标志不可以同时使
用。关于这方面的详细信息请参考Visual C++中关于成员函数
AppendMenu的联机文档。
…………………………………………………………Page 198……………………………………………………………
l 注意:
l 在程序设计中 (尤其是在涉及到图形编程时!),图形化的菜单
是不是对用户具有更大的吸引力?要达到这一点,在菜单编程中
使用位 图参数就大功告成了 !是不是相 当简单?
如果n