概述
((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
//IDM_ABOUTBOX注解:
只有在主窗口是对话框的MFC应用程序中才会出现这个消息。
IDM_ABOUTBOX是MFC框架在“InitDialog”函数中加入的“系统菜单”消息,用来弹出“IDD_ABOUTBOX”指定的对话框。
关于((nID & 0xFFF0) == IDM_ABOUTBOX):
在MSDN中SysCommand的帮助中,有这样一段:
In WM_SYSCOMMAND messages, the four low-order bits of the nID parameter are used internally by Windows. When an application tests the value of nID, it must combine the value 0xFFF0 with the nID value by using the bitwise-AND operator to obtain the correct result.
systemCommand的用处:用于响应系统菜单的命令消息.此时可以在系统的菜单中加入自己的菜单命令消息,即上面的IDM_aboutbox.
在响应的时候,可以根据命令ID的不同选择响应模式:
if ((nID & 0xFFF0) == IDM_ABOUTBOX)//如果命令id不再系统id范围之内.则自定义响应函数
{ //用0xFFF0是因为,ID的底四节默认是windows使用的id.
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);//否则就需要调用系统默认的响应系统命令函数.
}
//
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}//向系统菜单里面追加一项"关于"菜单
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon,ALT+TAB时显示大图标,否则显示为系统默认的图标
SetIcon(m_hIcon, FALSE); // Set small icon,运行时窗口的图标
// TODO: Add extra initialization here
CSpinButtonCtrl *pSpin=(CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_SCREENTIME);
pSpin->SetRange(1,60); // 设置数据范围到60分钟
//下面开始从注册表中读取当前设置屏保响应时间和checkbox的状态值
HKEY hkey;
LPCTSTR path="Control Panel\Desktop"; //设置要打开的子键值,主键在regopenkeyex中指定.
long ret=::RegOpenKeyEx(HKEY_CURRENT_USER,path,0,KEY_QUERY_VALUE,&hkey);
if(ret!=ERROR_SUCCESS)
{
MessageBox("错误,无法打开相关的HKEY");
OnCancel();
}
char tmp[256]="