WTL CComboBox CBN_SELCHANGE消息不响应?

stevenkoh 2013-05-13 05:57:38
今天测试了一下CComboBox控件,但一直测不出来,求教。

要求是CCombox空间中的当前值改变,就触发一个事件让父窗口接管处理(无需再按OK按钮)。我看了下手册使用CBN_SELCHANGE 消息。我简单写了一个测试发现无法响应,不知何故?

编程环境:VC6 WTL7.1

程序就是根据向导生成的范例程序,ATL/WTL AppWizard 程序Dialog Based(Modal Dialog)
然后加了一个ComboBox控件


程序也非常简单:定义:
class CMainDlg : public CDialogImpl<CMainDlg>
{
public:
enum { IDD = IDD_MAINDLG };

BEGIN_MSG_MAP(CMainDlg)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
COMMAND_ID_HANDLER(IDOK, OnOK)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
NOTIFY_HANDLER(IDC_COMBO1, CBN_SELCHANGE, OnComboxChanged) //我添加的
END_MSG_MAP()

// Handler prototypes (uncomment arguments if needed):
// LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
// LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
// LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)

LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
LRESULT OnAppAbout(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/);
LRESULT OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/);
LRESULT OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/);
LRESULT OnComboxChanged(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/);

CComboBox m_combobox; //我添加的
};



实现:


LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
// center the dialog on the screen
CenterWindow();

// set icons
HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME),
IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
SetIcon(hIcon, TRUE);
HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME),
IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
SetIcon(hIconSmall, FALSE);


m_combobox=GetDlgItem(IDC_COMBO1) ;
//m_combobox.SubclassWindow

m_combobox.ResetContent();

CString strTemp;


for(int i=1;i<=100;i++)

{

strTemp.Format("%d",i);

m_combobox.AddString(strTemp);

}

m_combobox.SetCurSel(1);


return TRUE;
}


LRESULT CMainDlg::OnComboxChanged(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
{
MessageBox("Changed");
return 0;
}


问题是,每见到MessageBox被触发过,不知道栽到那个阴沟里,谢谢指点

...全文
352 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
火星大能猫 2014-07-14
  • 打赏
  • 举报
回复
终于找到解决方法了
stevenkoh 2013-05-14
  • 打赏
  • 举报
回复
CBN_SELCHANGE 不是说是通知吗?怎么成了命令?
stevenkoh 2013-05-13
  • 打赏
  • 举报
回复
谢谢,结贴给分了. 一针见血!
sumos 2013-05-13
  • 打赏
  • 举报
回复
COMMAND_HANDLER(IDC_COMBO_1,CBN_SELCHANGE,OnComboSelChange)
使用说明 微软最新的编程工具Visual Studio 2013 已经发布,想在该平台下使用WTL的话,目前还没有对应的安装文件(一般学者),本人将自己改写的文件上传到CSDN,供朋友使用。改写的版本为 WTL81_12085 第一步:下载文件包“WTL_81_12085_For_VS2013.rar”,解压后,有两个文件夹和两个文件 文件夹: Application (WTL添加到VS创建向导里的一些文件) 文件夹: Include (include就是WTL的头文件) 文件: setup120.js (安装脚本) 文件: 使用说明.txt 第二步:找到"VS安装目录\VC\VCWizards\AppWiz"这个目录, 如我电脑上就是"F:\Program Files\Microsoft Visual Studio 12.0\VC\VCWizards\AppWiz", 在这个目录下新建一个WTL文件夹,然后将Application文件夹和setup120.js拷贝到WTL文件夹下。 第三步:双击“setup120.js”进行安装,或者用命令行执行。 命令行操作方法如下: 运行CMD,执行如下代码: wscript //e:jscript "F:\Program Files\Microsoft Visual Studio 12.0\VC\VCWizards\AppWiz\WTL\setup110.js" 第四步:在“安装盘:\Program Files\Microsoft Visual Studio 12.0\VC”建一个WTL文件夹, 将解压出来的Include文件夹拷贝到此文件夹下面。 在编译工程时,将“安装盘:\Program Files\Microsoft Visual Studio 12.0\VC\WTL\Include”目录添加进包含目录。 第四步,可以不操作,只要编译时,将Include (WTL的头文件)目录添加进包含目录。 添加包含目录的操作为:打开工程属性页->配置属性->VC++目录->包含目录->编辑->写入路径->确定 也可以通过改写配置文件,添加为默认的包含路径,具体的方法请在网上找一下。 任何单位或个人转发本文件包请保留作者信息,谢谢! 水梦雪 SnowEmail3074@163.com

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧