2009-04-05 5 views
2

Ich versuche, einen benutzerdefinierten Datei speichern Dialog für XP mit C++/VS2008 erstellen. Mein Dialogfeld enthält drei Dropdown-Felder und ein Bearbeitungsfeld. Ich benötige den Inhalt der Dropdown-Listen, um dynamisch zu aktualisieren, wenn in anderen Dropdown-Menüs eine Auswahl getroffen wird. Daher muss ich die CBN_-Ereignisse abfangen.Catching ON_CBN_SELCHANGE und andere Dropdown-Ereignisse beim Erweitern von CFileDialog

Ich habe eine Klasse erstellt, die CFileDialog erweitert und eine Klasse, die CComboBox erweitert. Ich kann den benutzerdefinierten Dialog (mit den Combos) anzeigen, aber ich kann die CBN_ Ereignisse nicht abfangen.

Ich habe den VS "Create MFC DLL" -Assistenten verwendet, um zwei Klassen zu erhalten: Die App-Klasse und die benutzerdefinierte Datei speichern Dialogklasse. Ich habe eine abgeleitete CComboBox-Klasse erstellt, sodass ich Nachrichten/Ereignis-Trapping-Code hinzufügen konnte. Ich habe die Message Maps, DoDataExchange und Event Trapping Code in die Dialogklasse eingefügt.

Der folgende Code ist eine gekürzte Version dessen, mit dem ich arbeite. Ich denke, ich muss die Erstellung von drei Dropdown-Listen nicht posten, wenn ich nicht einmal ein Dropdown-Menü zur Verfügung habe. Ich habe auch keinen Code für die Bearbeitungsbox eingegeben, da ich keine Probleme damit habe.

Einige Code: Von der App-Klasse - eine Instanz des benutzerdefinierten Dialog zu schaffen, ruft 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; 
} 

Hier ist ein Code aus dem benutzerdefinierten Dateidialog speichern:

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

Und hier ist die abgeleitete Klasse von 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) ; 
} 

Ich habe versucht, Versionen, wo die Dialogklasse hat t Er hat die MessageMap/DoDataExchange, die ComboBox-Klasse hat sie, beide Klassen haben sie.

Ich bin in der Lage, einige Ereignisse zu erfassen - aber keine mit der CComboBox. Ich kann veranlassen, dass der Dialog auf ON_NOTIFY, ON_WM_DESTROY antwortet und das Bearbeitungsfeld auf ON_WM_KILLFOCUS antwortet.

Ich habe diesen quälenden Gedanken, dass dies ein Stirn-Slapper ist, dass ich dem zu nah bin und das Offensichtliche nicht sehen kann.

ANy Hilfe, Hilfe, Richtung würde sehr geschätzt werden.

+0

Ich sollte erwähnen, dass ich dies als eine MFC-DLL erstellt, so dass ich CFileDialog Unterklasse konnte. Als ich versuchte, eine App zu erstellen, konnte ich CFileDialog nicht ableiten. Dann habe ich VS2008 Linker geändert, um eine ausführbare Datei zu erstellen. Es läuft, aber ich kann die Dropdown-Ereignisse nicht abfangen. – Lou

Antwort