描述:
本文讲述了如何在VC6下动态创建控件并响应其消息。
技术实现:
在基于对话框的程序里我们创建控件的方法大多是直接拉一个控件上去,然后利用ClassWizard给控件添加变量及进行消息映射等。但在有些时候(如单文档或多文档程序)我们就无法直接拉这个控件,更无法用ClassWizard给他添加变量或进行消息映射了。
在本文中我们将以在对话框上动态添加一个按钮(CButton)与一个下拉框(CCombobox)为例子说明在VC6下如何动态创建控件并响应控件之消息。
m_rBtn = new CButton();
在类的头文件里加下如下函数声明:
afx_msg void OnPushButton1();
在类的实现文件里加下函数实现:
AfxMessageBox("Button1 is pushed!");
}
添加映射宏:
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{AFX_MSG_MAP(CAsdfsaDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(10004, OnPushButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
(1) 添加成员变量
CRect rect;
rect.left = 100;
rect.top = 100;
rect.right = 300;
rect.bottom = 500;
m_wndCombo.Create(WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST ,rect,this,6011);
m_wndCombo.MoveWindow(100,100,300,600); //调节下拉框的大小,如果内容超过大小,则出现滚动条
for( int i=0; i<10; i++ )
{
CString xx;
xx.Format( "fadfadsf[%d]", i );
m_wndCombo.AddString( xx );
在类的头文件里加下如下函数声明:
afx_msg void OnSelchangeCombo1();
在类的实现文件里加下函数实现:
void CTestDlg::OnSelchangeCombo1()
{
// TODO: Add your control notification handler code here
AfxMessageBox( "asaaaaaaaaaaaaaaaaaaaa" );
}
添加映射宏:
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{AFX_MSG_MAP(CAsdfsaDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(10004, OnPushButton1)
ON_CBN_SELCHANGE(6011, OnSelchangeCombo1) //在ctl类的cpp文件内添加,6011是Combo资源在resource.h内注册时候的ID
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
本文讲述了如何在VC6下动态创建控件并响应其消息。
技术实现:
在基于对话框的程序里我们创建控件的方法大多是直接拉一个控件上去,然后利用ClassWizard给控件添加变量及进行消息映射等。但在有些时候(如单文档或多文档程序)我们就无法直接拉这个控件,更无法用ClassWizard给他添加变量或进行消息映射了。
在本文中我们将以在对话框上动态添加一个按钮(CButton)与一个下拉框(CCombobox)为例子说明在VC6下如何动态创建控件并响应控件之消息。
1. 创建按钮并响应其BN_CLICKED事件
(1) 添加成员变量CButton* m_rBtn;
(2) 创建按钮m_rBtn = new CButton();
m_rBtn->Create("按钮1",BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(250,250,320,270),this,10004);
(3) 添加消息响应函数在类的头文件里加下如下函数声明:
afx_msg void OnPushButton1();
在类的实现文件里加下函数实现:
void CTestDlg::OnPushButton1()
{AfxMessageBox("Button1 is pushed!");
}
添加映射宏:
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{AFX_MSG_MAP(CAsdfsaDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(10004, OnPushButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
OK,现在已经完成了一个动态按钮的创建并实现了其消息的响应了。
2. 创建CComboBox并响应其CBN_SELCHANGE事件(1) 添加成员变量
CComboBox m_wndCombo;
(2) 创建CComboBoxCRect rect;
rect.left = 100;
rect.top = 100;
rect.right = 300;
rect.bottom = 500;
m_wndCombo.Create(WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST ,rect,this,6011);
m_wndCombo.MoveWindow(100,100,300,600); //调节下拉框的大小,如果内容超过大小,则出现滚动条
for( int i=0; i<10; i++ )
{
CString xx;
xx.Format( "fadfadsf[%d]", i );
m_wndCombo.AddString( xx );
}
(3) 添加消息响应函数在类的头文件里加下如下函数声明:
afx_msg void OnSelchangeCombo1();
在类的实现文件里加下函数实现:
void CTestDlg::OnSelchangeCombo1()
{
// TODO: Add your control notification handler code here
AfxMessageBox( "asaaaaaaaaaaaaaaaaaaaa" );
}
添加映射宏:
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{AFX_MSG_MAP(CAsdfsaDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(10004, OnPushButton1)
ON_CBN_SELCHANGE(6011, OnSelchangeCombo1) //在ctl类的cpp文件内添加,6011是Combo资源在resource.h内注册时候的ID
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
OK,现在已经完成了一个动态CComboBox的创建并实现了其消息的响应了。
注:其中最后一个参数6011与1005等,是ID号,一定要大于100,因为100以内为VC编译系统使用。