【问题标题】:Catching ON_CBN_SELCHANGE and other dropdown events when extending CFileDialog扩展 CFileDialog 时捕获 ON_CBN_SELCHANGE 和其他下拉事件
【发布时间】:2010-10-17 16:32:19
【问题描述】:

我正在尝试使用 C++/VS2008 为 XP 创建一个自定义文件保存对话框。我的对话框将有三个下拉菜单和一个编辑框。当在其他下拉列表中进行选择时,我需要下拉列表的内容动态更新。因此,我需要捕捉 CBN_ 事件。

我创建了一个扩展 CFileDialog 的类和一个扩展 CComboBox 的类。我可以显示自定义对话框(带有组合),但我无法捕获 CBN_ 事件。

我使用 VS 的“创建 MFC DLL”向导来获取两个类:应用程序类和自定义文件保存对话框类。我创建了一个派生的 CComboBox 类,因此我可以添加消息/事件捕获代码。我在对话框类中放入了消息映射、DoDataExchange 和事件捕获代码。

下面的代码是我正在使用的代码的精简版本。我想当我连一个下拉菜单都无法工作时,我不需要发布三个下拉菜单的创建。我也没有为编辑框输入任何代码,因为我对此没有任何问题。

一些代码:来自应用程序类 - 创建自定义对话框的实例,调用 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;
}

以下是自定义文件保存对话框中的一些代码:

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

这是来自 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 ) ;
}

我已经尝试过对话框类具有消息映射/DoDataExchange 的版本,ComboBox 类具有它们,两个类都具有它们..

我能够捕捉到一些事件——不过,CComboBox 没有。我可以让对话框响应 ON_NOTIFY、ON_WM_DESTROY 和编辑框响应 ON_WM_KILLFOCUS。

我有一个挥之不去的想法,认为这是一个前额拍板,我离这个太近了,看不到明显的东西。

任何帮助、帮助、指导将不胜感激。

【问题讨论】:

  • 我应该提到我将它创建为一个 MFC DLL,因此我可以继承 CFileDialog。当我尝试创建一个应用程序时,我无法继承 CFileDialog。然后我更改了 VS2008 链接器选项以创建可执行文件。它运行但我无法捕获下拉事件。

标签: events mfc combobox


【解决方案1】:

您需要为对话框提供一个挂钩过程来捕获消息。详情在这里:http://msdn.microsoft.com/en-us/library/windows/desktop/ms646931%28v=vs.85%29.aspx

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2022-06-10
    • 2021-10-04
    • 1970-01-01
    • 2015-10-23
    • 2013-03-18
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多