使用ID_OKCANCEL在MessageBox中正确设置“取消按钮”;对话框中的对话框

时间:2013-05-31 21:11:50

标签: visual-c++ mfc messagebox cancel-button

我希望我的描述能让一切更加清晰。

我的想法是我必须创建一种电话簿,它使用列表控件(作为报告),有一个菜单,可以保存(到外部文件),加载(从一个),你可以添加新的联系人,编辑和删除现有联系人。 添加和编辑联系人时,我必须使用新的对话框。就像,我有一个名为“添加联系人”的菜单按钮,打开一个带编辑框的新对话框(在其中键入名字,姓氏,电子邮件等)。 电话本有效,没有错误,但我想让它好一点,功能:

假设我已经有一个名为John Doe的联系人。如果我尝试添加一个名为John Doe的联系人,当我点击“添加”按钮时,我设置程序问我: “联系人名称已存在;其他详细信息将相应更改”,使用“确定”和“取消”选项。 如果我点击OK,当然一切正常。电话,电子邮件,地址和群组(即其余信息)已更改。如果我单击取消,“添加”对话框就会消失,然后返回到显示列表的主对话框。这也是代码的事情,但我希望它......什么都不做。如果我单击该CANCEL,我希望它返回到我的“添加联系人对话框窗口”,但保持编辑框已经完成,就像我按下“添加”按钮之前一样。因为我可以再次调用该函数,如果我单击取消,但这样我只是得到一个带有空编辑框的新“添加对话框”,这不是我想要的。 当我插入新的联系人(姓名和姓)时,我想要发生同样的事情,但我在编辑框中设置的电话号码和/或电子邮件已经存在。比如,它会在一条消息中说:“电话号码已经存在”;如果我单击“确定”它应该返回到主对话框(列表,报告),但是如果我单击“取消”,我希望它返回到“添加对话框”,其中包含未更改的编辑框(之前输入的内容)名称,姓氏,电话,地址,电子邮件,群组)保持不变,因此我只需编辑已存在的手机/电子邮件。

我希望你们理解这个想法。我知道这是很多文字。顺便说一下,如果重要的话,选择组是用单选按钮。

插入函数的代码如下;我现在尝试用英语翻译变量,所以这是一个更容易阅读(我不是英语母语人士,对可能的错误感到抱歉);

void Phonebook::OnContactAdd() // keep in mind this is everything in the programs Dlg.cpp (PhonebookDlg.cpp)
{
    Add newcontact; //the Add type, the class created for the add dialog, has some TCHAR* values FirstName, LastName etc. When I click "add button" in the add dialog, the text from the edit boxes goes accordingly to the TCHARs
    if (newcontact.DoModal()==IDOK)
    {
        TCHAR getFirstName[20],getLastName[20],getPhoneNo[20],getAdr[100],getEmail[30]; //after the classes "newcontact" TCHARs are set, these strings from here get the values already in the list and it compares them
        int i;
        for(i=0;i<list.GetItemCount();i++) // it compares the values in the edit boxes typed in the "add dialog" with the ones in each line already in the list
        {
            list.GetItemText(i,0,getFirstName,20); //gets the first name from line i
            list.GetItemText(i,1,getLastName,20);// gets last name from line i
            if (strcmp(getFirstName,newcontact.FirstName)==0 && strcmp(getLastName,newcontact.LastName)==0) //compares the firstname and lastname introduced with those from the line i and if they're equal...
                if (MessageBox("Contact name already exists; other details will be changed accordingly","Warning!",MB_ICONQUESTION | MB_OKCANCEL | MB_TOPMOST )==IDOK)
                {
                    list.SetItemText(i,2,newcontact.PhoneNo);
                    prefix(i,newcontact.PhoneNo);//function that determines the operator, not relevant to the problem
                    list.SetItemText(i,4,newcontact.Adr);
                    list.SetItemText(i,5,newcontact.Email);
                    setgrup(i,newcontact.grup); // again, this is a function that sets the group in the list according to the radio button checked; ignore it, not relevant to the problem
                    return; // it found something, it changed, it exists
                }
                //else IDCANCEL; // this is the problem! else what? if I put "else return", it exists to the list, of course; if i set "else OnCancel()" it closes the whole program
                list.GetItemText(i,2,getPhoneNo,20); // if the names are not equal, we go and check if the phone number already exists
                if (strcmp(getPhoneNo,newcontact.PhoneNo)==0)
                {
                    AfxMessageBox("Phone number already exists");
                    OnContactAdd(); //it exists and now the function is called again; that's what I was saying, but it's not what I want, I want to "cancel" and go back to editing the text boxes
                    return;
                }

                list.GetItemText(i,5,getEmail,30);//same thing for the mail, as for the phone number
                if (strcmp(getEmail,newcontact.Email)==0)
                {
                    AfxMessageBox("Email already exists");
                    OnContactAdd();
                    return;
                }
        }
        // if the names, phone number or email weren't already in the list, there is no special case, so we just add the input data to the top of the list
        list.InsertItem(0,newcontact.FirstName);
        list.SetItemText(0,1,newcontact.LastName);
        list.SetItemText(0,2,newcontact.PhoneNo);
        list.SetItemText(0,4,newcontact.Adr);
        list.SetItemText(0,5,newcontact.Email);
        prefix(0,newcontact.PhoneNo);
        setgrup(0,newcontact.grup);
    }
}

// 现在还有一个问题(次要),也许有人知道它并随机进入这里:

我必须在“键入选项时进行搜索”。我做到了但它也应该为找到的文字上色。假设我正在搜索“Jo”并且有一个“John”和一个“Joanne”,那么只应出现那些行(所有列,信息,找到的名称)。没问题,我做到了。但有没有办法给John和Joanne的Jo着色/加粗/突出?就像让Jo-es红色和其他人一样('hn'和'anne'保持黑色)。或者至少要将整个文本着色,但其他列文本保持黑色,默认。 为了搜索,我使用编辑框中的事件处理程序,逐行将列表中的文本与列表中的每个列进行比较。如果匹配,则该行被添加到默认隐藏的新列表控件中,并且它现在就在前面。希望你明白这一点。可能我也会为此做另一个话题。

1 个答案:

答案 0 :(得分:0)

你可以在这里发布你的Add课程吗?我认为你应该处理保存“添加”CDialog类中的联系人。

按“确定”按钮并调用OnOk()(IDOK)功能开始关闭对话窗口。 你通过按下它来调用EndDialog()函数并且你没有处理它内部的任何事件(你在对话框之外 - 在关闭它之后这样做)所以对话框开始关闭。检查这个很好的例子,它确实显示了这一点:http://msdn.microsoft.com/en-US/library/wddd3ztw(v=vs.80).aspx

当您在显示此消息框时调用OnCancel()时,“”联系人姓名已存在;其他细节将相应更改“主要对话框的OnCancel()将被调用,因为您已经离开了添加对话框范围。再次,我建议您处理在”添加“类中保存联系人。尝试创建一个函数处理一个“保存”按钮,它将检查所有条件并执行相应的操作。您也可以尝试重写OnOk()函数,但我会选择该函数。将该函数放在“添加”对话框中,这样就可以了在“Add”类的这个实例中执行所有必要的检查。