ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);我想知道以上这两段是什么意思?
这个函数是怎么一回事,还有的就是,为什么一个字符串和一个十六进制的数"<"这样呢?还有就是(IDM_ABOUTBOX & 0xFFF0)这样是什么意思?不太明白。
BOOL CQQLimitDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); 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);
}
}
}
ASSERT(IDM_ABOUTBOX < 0xF000);我想知道以上这两段是什么意思?
这个函数是怎么一回事,还有的就是,为什么一个字符串和一个十六进制的数"<"这样呢?还有就是(IDM_ABOUTBOX & 0xFFF0)这样是什么意思?不太明白。
BOOL CQQLimitDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); 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);
}
}
}
2.// IDM_ABOUTBOX must be in the system command range.
这行注释能看明白吗?就是说下在的两行代码是检测IDM_ABOUTBOX这个常量的值是否系统命令范围之内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); //要是16的倍数
ASSERT(IDM_ABOUTBOX < 0xF000); //要小于0xF000
这两个条件符合就在系统命令范围之内了。
&0xFFF0 这样是什么意思?这个数值是多少?就是这里我觉得怪怪的。
0&0 = 0;
0&1 = 0;
1&1 = 1;
3 = 00000011(二进制)
5 = 00000101(二进制)
3&5 = 0000001(二进制)
0xFFF0 (16进制)=
1111111111110000(二进制)
(IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX
中的&0xFFF0是把IDM_ABOUTBOX这个值的低4位清0,高12位不变。
整句就是要检测一下IDM_ABOUTBOX的低4位是否为0,也就是说看它是否是16的倍数。
如果它的低4位不是0,那么
(IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX
返回就是假,ASSERT将通不过。所以这句就是要求IDM_ABOUTBOX是16的倍数。