4

プロパティ ペインの一部であり、数値 (正の整数) のみを許可する CEdit テキスト ボックスがあります。数値以外の値を入力するとボックスは正常に機能しますが、ボックス内の値を削除すると、「正の整数を入力してください」というダイアログが表示されます。

状況は次のとおり
です。 1. ボックスに数字 (たとえば 20) があります。
2.番号を削除します。
3. エラー ダイアログが表示されます。
このイベントを傍受してそこにデフォルト値を設定する方法を誰か教えてもらえますか?

私のプロパティペインは次のようになります。


const int DEFAULT_VALUE = 20;

class MyPropertyPane:public CPropertyPane
{
    //....
private:
    CEdit m_NumericBox;
    int   m_value;

    //....
public:
    afx_msg void OnEnChangeNumericBox();

    //....
}
void MyPropertyPane::MyPropertyPane()
{
   // Set a default value
   m_value = DEFAULT_VALUE;
}

//....
void MyPropertyPane::DoDataExchange(CDataExchange* pDX)
{
    DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox);

    // this sets the displayed value to 20
    DDX_Text(pDX, IDC_NUMERIC_BOX, m_value);
}

//....
void MyPropertyPane::OnEnChangeNumericBox()
{
    // Somebody deleted the value in the box and I got an event
    // saying that the value is changed.

    // I try to get the value from the box by updating my data
    UpdateData(TRUE);

    // m_value is still 20 although the value is 
    // deleted inside the text box.
}

4

3 に答える 3

9

受信しているメッセージは、データ交換ルーチンではなく、データ検証ルーチンからのものです。DoDataExchange() には、おそらく次のような呼び出しがあります。

void MyPropertyPane::DoDataExchange(CDataExchange* pDX)
{
    DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox);
    DDX_Text(pDX, IDC_NUMERIC_BOX, m_value);
    DDV_MinMaxInt(pDX, m_value, 1, 20); // if the value in m_value is outside the range 1-20, MFC will pop up an error dialog
}

組み込みの MFC データ検証を削除し、独自のものを追加することで、この問題を解決できます。

void MyPropertyPane::DoDataExchange(CDataExchange* pDX)
{
    DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox);
    DDX_Text(pDX, IDC_NUMERIC_BOX, m_value);

    if( m_value < 1 || m_value > 20 )
    {
        m_value = DefaultValue;
    }
}
于 2009-04-13T14:48:42.717 に答える
0

ジョン・ディブリングのヒントは、私をこの解決策に導きました:


void MyPropertyPane::OnEnChangeNumericBox()
{
    UpdateData(TRUE);
    CString value;
    m_NumericBox.GetWindowText(value);
    if( value.IsEmpty() )
    {
        m_value = DEFAULT_VALUE;
        UpdateData(FALSE);
    }
}

実際の数値検証はボックスによって既に処理されているため、実際に行う必要があった唯一の検証は、ボックスに値が含まれていることを確認することです。ユーザーは数値以外の値を入力することはできませんが、既存の値を削除することはできるため、データ交換関数で処理するのが難しい状況であり、OnChange イベントを「ハック」する必要がありました。

于 2009-04-13T15:26:18.350 に答える
0

これは私のために働いた

void CtimersDlg::OnEnChangeInterval()
{
   CString value; //or use char *
   CWnd *pWnd = GetDlgItem(IDC_INTERVAL);//IDC_EDITBOX

   if(pWnd)
   {
      pWnd->GetWindowTextW(value);
   }

   int i = _wtoi(value); //if char * use _atol()
   if((!value.IsEmpty())&& (i))  //To check i = 0 or 00 entered or not
      UpdateData(TRUE);
}
于 2010-02-22T04:00:24.927 に答える