2009-03-30 24 views
6

これは基本的には取得するほどです。ユーザーがCComboBoxから項目を選択したときのキャッチ

ユーザーがCComboBox(実際には、CComboBoxのサブクラス)から項目を選択したときにキャッチしたいと思います。

OnCblSelChange、OnCommandの組み合わせを試してみました。私は右のコンボをまだ打っていないと思う。私はCEditのとのCFileDialogから派生したクラスのイベントをキャッチすることができるよ

OSはビスタですが、私は(それは、それは問題ではないはずでしょうか?)XPスタイルのダイアログを強制してい

を。

私はここで賢明です。どんな援助もこれまで以上に高く評価されます。

すべてのソースコードは、これまで以上に高く評価されます。

+0

下記の私の答えにコードを追加しました。それが役に立てば幸い! – mwigdahl

答えて

1

CBN_SELENDOKあなたが探しているメッセージである必要があります。ユーザーの選択が確定した後で、コンボボックスが閉じる前にコンボボックスが閉じる前に送信されます。 CBN_SELCHANGEの前に送信され、の選択は実際にコンボボックスコントロールに保存されます。

This MSDN linkは、より多くの情報(あなたはおそらくすでにそれを見てきました...)

ここで私はあなたを約束したコードがあるがあります。これを収集する際に気付いたことの1つは、CComboBoxから派生したクラス内でON_CONTROL_REFLECTハンドラを使用している場合、このメッセージを抑制することが可能であるということです。これにより、コントロール自体がメッセージを処理し、親に渡されることはありません。その問題を回避するには、ON_CONTROL_REFLECT_EXに適切な戻りコードを付けてください。これにより、ボックス自体と親がメッセージを受信します。

とにかく、ここにコードスニペットがあります:

class SPC_DOCK_CLASS ProcessingExceptionDockDlg : public CSPCDockDialog 
{ 
    SPC_DOCK_DECLARE_SERIAL(ProcessingExceptionDockDlg); 

public: 
    // ... redacted ... 

    //{{AFX_DATA(ProcessingExceptionDockDlg) 
    CComboBox     m_comboFilter; 
    //}}AFX_DATA 

    //{{AFX_VIRTUAL(ProcessingExceptionDockDlg) 
    protected: 
    virtual void DoDataExchange(CDataExchange* pDX); 
    //}}AFX_VIRTUAL 

protected: 

    //{{AFX_MSG(ProcessingExceptionDockDlg) 
    afx_msg void OnSelendokComboTreeFilter(); 
    //}}AFX_MSG 
    DECLARE_MESSAGE_MAP() 
}; 

/****************/ 

// ProcessingExceptionDockDlg.cpp : implementation file 
// 

#include "stdafx.h" 
#include "resource.h" 
#include "ProcessingExceptionDockDlg.h" 

// ... much code redacted ... 

void ProcessingExceptionDockDlg::DoDataExchange(CDataExchange* pDX) 
{ 
    CSPCDockDialog::DoDataExchange(pDX); 
    //{{AFX_DATA_MAP(ProcessingExceptionDockDlg) 
    DDX_Control(pDX, IDC_COMBO_TREE_FILTER, m_comboFilter); 
    //}}AFX_DATA_MAP 
} 

BEGIN_MESSAGE_MAP(ProcessingExceptionDockDlg, CSPCDockDialog) 
    //{{AFX_MSG_MAP(ProcessingExceptionDockDlg) 
    ON_CBN_SELENDOK(IDC_COMBO_TREE_FILTER, OnSelendokComboTreeFilter) 
    //}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

void ProcessingExceptionDockDlg::OnSelendokComboTreeFilter() 
{ 
    // ... code redacted ... 
} 
+0

ありがとうございます。 CBN_SELENDOKを試しましたが、まだ運がありません。確かに私は何か基本的なものを欠いている。誰かがコードサンプルを持っていますか? –

+0

私は仕事に就くと、それを恐れて明日に投稿しようとします。 – mwigdahl

+0

サンプルのためのThanx。私はDoDataExchangeについて知りませんでした。私はそれを試みましたが、まだドロップダウンの変更/選択されたイベント(s?)をキャッチすることはできませんが、DoDataExchangeは私に探索するための追加の道を与えます。それは何かダンブッとする必要があります - 私は見落としているシンプルです。 –

6

残念ながら、コンボボックスの変更のすべてのメッセージ(でもSELEND_OK)はDoDataExchangeはあなたを与えるよう前のテキストは、実際に、変更されている送信されているようですCComboBoxの前のテキスト

void MyDialog::DoDataExchange(CDataExchange* pDX) 
{ 
    DDX_Text(pDX, IDC_COMBO_LOCATION, m_sLocation); 
    CDialog::DoDataExchange(pDX); 
} 

BEGIN_MESSAGE_MAP(MyDialog, CDialog) 
    ON_CBN_SELENDOK(IDC_COMBO1, &MyDialog::OnComboChanged) 
    ON_CBN_EDITUPDATE(IDC_COMBO1, &MyDialog::OnComboEdited) // This one updates immediately 
END_MESSAGE_MAP() 

... 

void MyDialog::OnComboChanged() 
{ 
    m_myCombo.GetLBText(m_myCombo.GetCurSel(), m_sSomeString); 
} 

void MyDialog::OnComboEdited() 
{ 
    UpdateData(); 
} 

非常にうまく動作するようです:私は、次の方法、as suggested by MSDNを使用しています。

関連する問題