7

これは基本的なことです。

CComboBoxユーザーが(実際にはのサブクラス)からアイテムを選択したときにキャッチしたいCComboBox

OnCblSelChange、の組み合わせをたくさん試しましOnCommandた。私はまだ正しいコンボをヒットしていないと思います (しゃれは意図されていません)。

OS は Vista ですが、XP スタイルのダイアログを強制しています (それは問題ではないはずです)。

CEditとから派生したクラスのイベントをキャッチできCFileDialogます。

私はここで頭がいっぱいです。どんな支援もこれまでにないほど高く評価されます。

もちろん、どのソース コードもこれまで以上に高く評価されます。

4

2 に答える 2

9

SELEND_OK残念ながら、コンボボックスの変更に関するすべてのメッセージ(も)は、テキストが実際に変更されるDoDataExchangeに送信されるようです。そのため、の前のテキストが表示されますCComboBoxMSDNで提案されているように、私は次の方法を使用しました。

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();
}

それは非常にうまく機能しているようです。

于 2009-11-04T00:43:35.970 に答える
1

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

この MSDN リンクには詳細情報があります (既にご覧になっている可能性があります...)。

これが私が約束したコードです。これをまとめて気づいたことの 1 つはON_CONTROL_REFLECTCComboBox. これにより、コントロール自体がメッセージを処理し、親に渡さなくなります。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 ...
}
于 2009-03-30T20:43:16.537 に答える