7

MFC ダイアログの [OK] ボタンを無効にするにはどうすればよいですか?
このコード:からの関数の行で 例外 "アクセス違反読み取り場所... " が発生します 。この時点では、別のコントロールにフォーカスがあります。 何が間違っている可能性がありますか?
CWnd* fieldOK = pDlg->GetDlgItem(IDOK);
fieldOK->EnableWindow(FALSE);

ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));CWnd::EnableWindow(BOOL bEnable)winnocc.cppmfc90d.dll

手伝ってくれてありがとう。

[編集]

bool CSCalcNormCell::OnSelectionChanged( CWnd* pDlg, int type, int page, UINT ctrl_id ) 
{ 
  DDX_DataBox(pDX.get(), IDC_WORKSHOP_COMBO, ws_code); 
  if (!CInfactoryPriceAdapter::CanEditPricesForWorkshop( ws_code )) 
  { 
    CWnd* fieldOK = pDlg->GetDlgItem(IDOK); 
    fieldOK->EnableWindow(FALSE); 
  } 
  else 
  { 
    CWnd* fieldOK = pDlg->GetDlgItem(IDOK); 
    fieldOK->EnableWindow(TRUE); 
  } 
}
4

5 に答える 5

6

なぜそれができないのかわからない。通常の CDialog を使用して、次のような初期化を行うとします。

BOOL CMyDialog::OnInitDialog() {
    CDialog::OnInitDialog();
    CWnd *okbtn = GetDlgItem( IDOK );
    if ( okbtn ) {
        okbtn->EnableWindow( FALSE );
    }
    return TRUE;
}

ボタンを無効にします。おそらく何か他のことが間違っていますか?

于 2013-06-21T12:14:41.353 に答える
2

これを試してください: http://support.microsoft.com/kb/122489

MFC ダイアログのデフォルトのプッシュボタン処理を無効にする方法

デフォルトのボタン (プッシュボタン) のサポートが推奨されますが、特定の状況では、標準の実装を無効にするか変更する必要がある場合があります。次の手順に従って、MFC アプリケーションでこれを行うことができます。

ダイアログを App Studio に読み込み、[OK] ボタンの識別子を IDOK から IDC_MYOK などの別のものに変更します。また、Default Button プロパティのチェックを外します。

ClassWizard を使用して、OnClickedMyOK という名前のこのボタンのメッセージ処理関数を作成します。この関数は、このボタンから BN_CLICKED メッセージを受信したときに実行されます。

OnClickedMyOK のコードで、OnOK 関数の基本クラス バージョンを呼び出します。次に例を示します。

void CMyDialog::OnClickedMyOK()
   {
      CDialog::OnOK();
   }

ダイアログの OnOK をオーバーライドし、関数内では何もしません。次に例を示します。

void CMyDialog::OnOK()
   {
   }

プログラムを実行し、ダイアログを表示します。[OK] ボタン以外のコントロールにフォーカスを移します。戻るキーを押します。CDialog::OnOK() が実行されないことに注意してください。

于 2013-06-21T11:08:44.713 に答える
1

pDlg問題はポインターにあると思われます。を呼び出すpDlg->GetDlgItem(IDOK)と、ダイアログは既に作成されていますか?

行にブレークポイントを作成し、CWnd* fieldOK = pDlg->GetDlgItem(IDOK);そこにデバッグして、fieldOK ポインターが null または有効なポインターであるかどうかを確認します。

mark's answer is very close. You can disable it onそのため、 OnInitDialog` またはダイアログ クラスの他のメンバーが表示された後だと思います。

于 2015-03-31T16:43:36.230 に答える
0

問題は、ボタン コントロールがまだインターフェイス上に作成されていないことです。私たちはあなたの問題の全体像を把握していません。

とにかく、コードがクラッシュしないように保護する必要があります。アプリケーションをクラッシュさせるよりも、コードで何もしない方がよいでしょう。このように再構築すると、NULL ポインターによるアクセス違反の問題が回避されます。

bool CSCalcNormCell::OnSelectionChanged( CWnd* pDlg, int type, int page, UINT ctrl_id ) 
{ 
    DDX_DataBox(pDX.get(), IDC_WORKSHOP_COMBO, ws_code);

    CWnd* fieldOK = pDlg->GetDlgItem(IDOK); 
    if (fieldOK)
    {
        if (!CInfactoryPriceAdapter::CanEditPricesForWorkshop( ws_code )) 
            fieldOK->EnableWindow(FALSE); 
        else
            fieldOK->EnableWindow(TRUE); 
     }
}
于 2015-07-23T23:32:30.297 に答える
0

LoadBitmaps() 関数で [OK] ボタンの無効モードのビットマップをロードする必要があります。

于 2016-03-08T15:14:42.627 に答える