专家及各位高手,有个关于VC对话框的问题请教大家。
我想实现一个功能,就是对话框里有两个复选框(checkbox)、一个“确定”按钮和一个“取消”按钮。
两个复选框的Label(标签) 分别是电机A、电机B。也就是按确定按钮后根据复选框选取情况可以让电机A,电机B单独运行或让电机A、B都运行。出于安全考虑等原因,电机A和B允许运行还要检查相关的变量是否为TRUE,(如 bln_MotorEnableA=TRUE,电机A就可以运转,bln_MotorEnableB=TRUE,电机B也可以运转),相反如bln_MotorEnableA=FALSE,勾选复选框A后按“确定”按钮就弹出一个警告对话框:电机A有故障禁止运行!按警告对话框的确定按钮后,清除勾选,然后焦点给复选框A,类似于数据DDV失败后抛出异常情形,我不知道如何实现,请高手指教。电机如何控制我自己解决,您只要MotorRun_A=TRUE,MotorRun_B=TRUE,我就知道如何继续了。总之就是按“确定”按钮后检查勾选情况和变量情况,都为真了,才能继续下去,否则抛出警告对话框,焦点给复选框控件~!谢谢!

解决方案 »

  1.   

    定义两个BOOL类型变量  当复选框选中时候让定义的变量等于TRUE  GetCheck  SetCheck()。。
      

  2.   

    //头文件定义
    #define    ERR_A_MSG     _T("电机A有故障禁止运行!")
    #define    ERR_B_MSG     _T("电机B有故障禁止运行!")
    #define    CAP_MSGBOX     _T("这个就自己定义了")//“确定”按钮事件函数里的处理
        if(m_checkBoxA.GetCheck() == 1){
            if(bln_MotorEnableA){
                MotorRun_A = TRUE;
            }else{
                ::MessageBox(this->m_hwnd, ERR_A_MSG, CAP_MSGBOX, (MB_ICONWARNING | MB_OK));
                m_checkBoxA.SetCheck(0);
                m_checkBoxA.SetFocus();
                return;
            }
        }
        if(m_checkBoxB.GetCheck() == 1){
            if(bln_MotorEnableB){
                MotorRun_B = TRUE;
            }else{
                ::MessageBox(this->m_hwnd, ERR_B_MSG, CAP_MSGBOX, (MB_ICONWARNING | MB_OK));
                m_checkBoxB.SetCheck(0);
                m_checkBoxB.SetFocus();
                return;
            }
        }
        //机器运行
        ...
      

  3.   


    非常感谢levelmouse和各位,请问我怎样给你加分?追加问一个问题,我建立了一个名为MyPro的单文档工程,这个对话框是工程的一部分,我为此对话框建立一个新的类: Cmydlg。
    然后在主菜单:查看(V)下添加一子菜单:摇摆(R),其ID为ID_VIEW_MotorRun,Caption为:摇摆(&R),并把该菜单与CMainFrame类关联。同时在CMainFrame类下建立了2个Public 的Bool 变量 bln_ARunning, bln_ARunning,初始化为FALSE, 他们为TRUE,电机才真正的运行。我想问对话框“确定”按钮事件函数里能不能直接操作变量bln_ARunning,和bln_ARunning,也就是勾选复选框并bln_MotorEnableX=TRUE时直接把bool 值赋给
    bln_ARunning, bln_ARunning,并更新。简言之就是在对话框里如何操作修改主程序的变量。
    我把单击摇摆(R)子菜单的处理函数摘要如下:
    void CMainFrame::OnVIEWMotorRun() 
    {
    // TODO: Add your command handler code here
        //bln_EA=TRUE;
    //bln_EB=FALSE;
        Cmydlg dlg;
    dlg.bln_MotorEnableA= TRUE;//为了简洁和观看出错效果我把dlg.bln_MotorEnableA、
                                 //dlg.bln_MotorEnableB一个直接赋TRUE,一个赋FALSE
    dlg.bln_MotorEnableB= FALSE;
    int ReturnVal=dlg.DoModal();
    if(ReturnVal==1)// 1—是按OK确定键后Domodal的返回值
    {
            // 这里假设您在对话框“确定”按钮事件函数操作过了bln_ARunning,bln_BRunning
           //变量,所以暂时不做处理,留空 }
    if(对话框“确定”按钮事件函数)
    {//********A电机运行程序
    }
    if(bln_BRunning)
    {//********B电机运行程序
    }

    }
      

  4.   

    修正一下摇摆(R)子菜单的处理函数:void CMainFrame::OnVIEWMotorRun() 

    // TODO: Add your command handler code here 
        //bln_EA=TRUE; 
    //bln_EB=FALSE; 
        Cmydlg dlg; 
    dlg.bln_MotorEnableA= TRUE;//为了简洁和观看出错效果我把dlg.bln_MotorEnableA、 
                                //dlg.bln_MotorEnableB一个直接赋TRUE,一个赋FALSE 
    dlg.bln_MotorEnableB= FALSE; 
    int ReturnVal=dlg.DoModal(); 
    if(ReturnVal==1)// 1—是按OK确定键后Domodal的返回值 

            // 这里假设您在对话框“确定”按钮事件函数操作过了bln_ARunning,bln_BRunning 
          //变量,所以暂时不做处理,留空 } 
    if(bln_ARunning) 
    {//********A电机运行程序 

    if(bln_BRunning) 
    {//********B电机运行程序 
    } }
      

  5.   

    Cmydlg dlg(this);
    ...
    传一个父窗口指针进去就可以了。