La capture de ON_CBN_SELCHANGE et d'autres déroulante des événements lors de l'extension de CFileDialog

Je suis en train de créer un fichier personnalisé boîte de dialogue enregistrer pour XP à l'aide de C++/VS2008. Mon dialogue aura trois listes déroulantes et une zone d'édition. J'ai besoin du contenu des listes déroulantes à mettre à jour dynamiquement lorsque les sélections sont effectuées sur d'autres listes déroulantes. Donc, mon besoin de rattraper le CBN_ événements.

J'ai créé une classe qui étend la classe CFileDialog et une classe qui étend la classe CComboBox. Je peux obtenir la boîte de dialogue personnaliser (avec les combos) à l'écran mais je ne peut pas intercepter le CBN_ événements.

J'ai utilisé le VS 'Créer la DLL MFC' assistant pour obtenir deux classes: La classe app et le fichier personnalisé en classe de boîte de dialogue enregistrer. J'ai créé un dérivé CComboBox classe afin que je puisse ajouter des messages/event code de recouvrement. Je l'ai mis dans le message de cartes, de DoDataExchange et de recouvrement de l'événement code dans la classe de boîte de dialogue.

Le code qui suit est une version abrégée de ce que je suis en train de travailler avec. Je me dis que je n'avez pas besoin de poster la création de trois listes déroulantes quand je ne peux pas obtenir même un menu pour le travail. Je n'ai pas mis de code pour la zone d'édition, puisque je ne suis pas d'avoir des problèmes avec ça.

Code: à Partir de la classe app - création d'une instance de la boîte de dialogue personnaliser, appelant DoModal:

BOOL CSaveAsApp::InitInstance() 
{
CWinApp::InitInstance();
// Parse the command line to get the defaultExtension and the file filter 
CString cmdLineAsString =   CString( theApp.m_lpCmdLine );

int curPos  =   0 ;
CString fileExtension   = cmdLineAsString.Tokenize(" ", curPos ) ;
CString fileFilter  = cmdLineAsString.Tokenize(" ", curPos ) ; ;


MyFileDialog    dlg( FALSE, fileExtension.GetBuffer(), "Enter File Name Here",
                    OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
                    fileFilter.GetBuffer(), m_pMainWnd) ;


m_pMainWnd = &dlg;

int nResponse = dlg.DoModal();

if (nResponse == IDOK)
{
   ...  
}
else if (nResponse == IDCANCEL)
       ...

return FALSE;
}

Voici un peu de code à partir d'un fichier personnalisé boîte de dialogue enregistrer:

IMPLEMENT_DYNAMIC(MyFileDialog, CFileDialog ) 
// LJM Put in last two parms: DWORD dwSize, BOOL bVistaStyle (0, 0 )
//     bVistaStyle = 0 ==> XP-Style dialog

MyFileDialog::MyFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, 
            LPCTSTR    lpszFileName, DWORD dwFlags, LPCTSTR lpszFilter, 
            CWnd* pParentWnd) :
    CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags,
            lpszFilter, pParentWnd, 0, 0) 
{ }

MyFileDialog::~MyFileDialog() { }

void MyFileDialog::DoDataExchange(CDataExchange* pDX)
{
   CFileDialog::DoDataExchange(pDX);
   //{{AFX_DATA_MAP(MyFileDialog)
   //DDX_Control(pDX, IDC_CONTEXT_COMBO, m_ComboContext);
   //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(MyFileDialog, CFileDialog)
ON_CBN_SELCHANGE(IDC_CONTEXT_COMBO, &MyFileDialog::OnCbnSelchangeUniqueNumber)
ON_CBN_SELENDOK(IDC_CONTEXT_COMBO, &MyFileDialog::OnCbnSelchangeUniqueNumber)
END_MESSAGE_MAP()

BOOL MyFileDialog::OnInitDialog() 
{
CFileDialog::OnInitDialog();

//AfxEnableControlContainer();

const UINT iExtraSize = 300;
//Get a pointer to the original dialog box.
CWnd *wndDlg = GetParent();
RECT Rect;


wndDlg->GetWindowRect(&Rect);
//Change the size of FileOpen dialog
wndDlg->SetWindowPos(NULL, 0, 0, 
                    Rect.right - Rect.left, 
                    Rect.bottom - Rect.top + iExtraSize,  
                    SWP_NOMOVE);

CWnd *wndComboCtrl = wndDlg->GetDlgItem(cmb1);   
wndComboCtrl->GetWindowRect(&Rect);
wndDlg->ScreenToClient(&Rect); //Remember it is child controls

Rect.top += 60;
Rect.bottom += 120;
Rect.left += 50;

m_ComboContext.Create(WS_CHILD | WS_VISIBLE | CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP, Rect, wndDlg, IDC_CONTEXT_COMBO);      


    m_ComboContext.SetFont(wndComboCtrl->GetFont(), TRUE);

        m_ComboContext.AddString(_T("Lou1") );
    m_ComboContext.AddString(_T("L432") );
    m_ComboContext.AddString(_T("Lou2") );
    m_ComboContext.AddString(_T("Lou3") );



return true ;
}

void MyFileDialog::OnCbnSelchangeUniqueNumber()
{
AfxMessageBox( _T("OnCbnSelchangeUniqueNumber"), 0, 0 ) ;
}

Et voici la classe dérivée de CComboBox:

   IMPLEMENT_DYNAMIC(LouComboBox, CComboBox)

   LouComboBox::LouComboBox() {  }

   LouComboBox::~LouComboBox() {  }

BEGIN_MESSAGE_MAP(LouComboBox, CComboBox)
ON_CONTROL_REFLECT(CBN_SELCHANGE, &LouComboBox::OnCbnSelchange)
ON_CONTROL_REFLECT(CBN_KILLFOCUS, &LouComboBox::OnCbnKillfocus)
ON_CONTROL_REFLECT(CBN_SELENDCANCEL, &LouComboBox::OnCbnSelendcancel)

ON_CBN_SELCHANGE(IDC_CONTEXT_COMBO, &LouComboBox::OnCbnSelchangeUniqueNumber)
END_MESSAGE_MAP()

void LouComboBox::OnCbnSelchange()
{
//TODO: Add your control notification handler code here
AfxMessageBox( _T("Menu selected"), 0, 0 ) ;
}

void LouComboBox::OnCbnKillfocus()
{
//TODO: Add your control notification handler code here
AfxMessageBox( _T("Lost focus"), 0, 0 ) ;
}

void LouComboBox::OnCbnSelendcancel()
{
AfxMessageBox( _T("OnCbnSelendcancel"), 0, 0 ) ;
}

void LouComboBox::OnCbnSelchangeUniqueNumber()
{
//TODO: Add your control notification handler code here    
AfxMessageBox( _T("OnCbnSelchangeUniqueNumber"), 0, 0 ) ;
}

J'ai essayé les versions où la classe de boîte de dialogue a messagemap/DoDataExchange, la zone de liste déroulante de la classe a, les deux classes ont eux..

Je suis en mesure d'assister à quelques événements - aucun avec le CComboBox, cependant. Je peux obtenir la boîte de dialogue pour répondre à ON_NOTIFY, ON_WM_DESTROY et la zone d'édition répond à ON_WM_KILLFOCUS.

J'ai cette lancinante pensé que c'est un front-slapper, que je suis trop près, et ne peuvent pas voir l'évidence.

Toute l'aide, l'assistance, la direction serait grandement apprécié.

  • Je dois mentionner que j'ai créé ce que d'une DLL MFC afin que je puisse la sous-classe CFileDialog. Quand j'ai essayé de créer une application, je ne pouvais pas sous-classe CFileDialog. Puis j'ai changé VS2008 de l'éditeur de liens opte pour créer un fichier exécutable. Il fonctionne, mais je ne peut pas intercepter la liste des événements.
InformationsquelleAutor Lou | 2009-04-05