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

解决方案 »

  1.   

    1.IDM_ABOUTBOX是字符串吗?你在它上面点一下鼠标右键选择转到定义看一下。
    2.// IDM_ABOUTBOX must be in the system command range.
    这行注释能看明白吗?就是说下在的两行代码是检测IDM_ABOUTBOX这个常量的值是否系统命令范围之内。
        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);    //要是16的倍数
        ASSERT(IDM_ABOUTBOX < 0xF000);       //要小于0xF000
    这两个条件符合就在系统命令范围之内了。
      

  2.   

    谢谢这位朋友热情回复!
    &0xFFF0 这样是什么意思?这个数值是多少?就是这里我觉得怪怪的。
      

  3.   

     & “按位与”运算符
    0&0 = 0;
    0&1 = 0;
    1&1 = 1;
    3 = 00000011(二进制)
    5 = 00000101(二进制)
    3&5 = 0000001(二进制)
    0xFFF0 (16进制)=
    1111111111110000(二进制)
      

  4.   

    这一句
    (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的倍数。
      

  5.   

    敢问楼主是在研究范例 ime.sln 吗