zoukankan      html  css  js  c++  java
  • mfc保持两个edit control的一致性

    两个edit control,比如半径R,周长L,需要保证R改变,L随之更改;L改变,R随之更改。

    查了下,发现edit有一个EN_CHANGE消息,每当一个edit有更改,会发送一个EN_CHANGE消息。因此在两个edit上均添加这样一个消息处理函数,去更改另一个edit即可。

    代码如下:

     1 //R的消息处理函数
     2 OnEnChangeEditR()
     3 {
     4     // TODO:  如果该控件是 RICHEDIT 控件,它将不
     5     // 发送此通知,除非重写 CDialogEx::OnInitDialog()
     6     // 函数并调用 CRichEditCtrl().SetEventMask(),
     7     // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
     8 
     9 
    10 
    11     // TODO:  在此添加控件通知处理程序代码
    12     CString RS,LS;
    13     double R,L;
    14     GetDlgItemText(IDC_EDIT_R,RS);
    15     R=atof(RS);
    16     L=2*3.14159*R;
    17     LS.Format("%.2f",L);
    18     SetDlgItemText(IDC_EDIT_L,LS);
    19 }
    20 //L的消息处理函数
    21 OnEnChangeEditL()
    22 {
    23     // TODO:  如果该控件是 RICHEDIT 控件,它将不
    24     // 发送此通知,除非重写 CDialogEx::OnInitDialog()
    25     // 函数并调用 CRichEditCtrl().SetEventMask(),
    26     // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
    27 
    28 
    29 
    30     // TODO:  在此添加控件通知处理程序代码
    31     CString RS,LS;
    32     double R,L;
    33     GetDlgItemText(IDC_EDIT_L,LS);
    34     L=atof(LS);
    35     R=L/(2*3.14159);
    36     RS.Format("%.2f",R);
    37     SetDlgItemText(IDC_EDIT_R,RS);
    38 }

    跑了两次都挂了。debug了下发现是SetDlgItemText会发送ON_ENCHANGE消息,两个处理函数反复互相调用导致陷入死循环。

    要想破解死循环,需要在处理函数中辨识是否从另一个处理函数而来,如果是的话就直接返回。因此加两个布尔变量的标记,fromR和fromL,初始值为false。代码如下:

     1 OnEnChangeEditR()
     2 {
     3     // TODO:  如果该控件是 RICHEDIT 控件,它将不
     4     // 发送此通知,除非重写 CDialogEx::OnInitDialog()
     5     // 函数并调用 CRichEditCtrl().SetEventMask(),
     6     // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
     7 
     8 
     9 
    10     // TODO:  在此添加控件通知处理程序代码
    11     //破解死循环,如果是从OnEnChangeEditL过来,则直接返回
    12     if(fromL)
    13     {
    14         fromL=false;
    15         return;
    16     }
    17 
    18 
    19         // TODO:  在此添加控件通知处理程序代码
    20         CString RS,LS;
    21         double R,L;
    22         GetDlgItemText(IDC_EDIT_R,RS);
    23         R=atof(RS);
    24         L=2*3.14159*R;
    25         LS.Format("%.2f",L);
    26         fromR=true;
    27         SetDlgItemText(IDC_EDIT_L,LS);
    28 }
    29 
    30 OnEnChangeEditL()
    31 {
    32     // TODO:  如果该控件是 RICHEDIT 控件,它将不
    33     // 发送此通知,除非重写 CDialogEx::OnInitDialog()
    34     // 函数并调用 CRichEditCtrl().SetEventMask(),
    35     // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
    36 
    37 
    38 
    39     // TODO:  在此添加控件通知处理程序代码
    40     //破解死循环,如果是从OnEnChangeEditR过来,则直接返回
    41     if(fromR)
    42     {
    43         fromR=false;
    44         return;
    45     }
    46 
    47 
    48         // TODO:  在此添加控件通知处理程序代码
    49         CString RS,LS;
    50         double R,L;
    51         GetDlgItemText(IDC_EDIT_R,RS);
    52         R=atof(RS);
    53         L=2*3.14159*R;
    54         LS.Format("%.2f",L);
    55         fromL=true;
    56         SetDlgItemText(IDC_EDIT_R,RS);
    57 }
  • 相关阅读:
    spring bean的三种管理方式·
    mybatis解决字段名和实体属性不相同
    python字符串格式化方法%s和format函数
    myeclipse配置springmvc教程
    2019ICPC南昌站
    浅谈可持久化线段树(主席树)
    2019CCPC厦门站总结
    牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)
    2019牛客暑期多校训练营(第一场)A
    [The Preliminary Contest for ICPC Asia Nanjing 2019] L-Digit sum
  • 原文地址:https://www.cnblogs.com/mascure/p/3309926.html
Copyright © 2011-2022 走看看