在vc中自定义事件扩展控件功能
来源:互联网 发布:办理软件著作权登记 编辑:程序博客网 时间:2024/06/03 20:27
当MFC所提供的控件不能满足我们的要求时,我们需要为控件进行功能扩展,根据需求自定义控件的事件。
本文以一个扩展按钮的鼠标按下和鼠标松开的事件为例,其它控件事件扩展可遵照该例。提供源代码,在VC6.0中调试成功。
按钮也是一个窗口,继承自CWND,它其中封装了大量的消息,因此我们之需要继承CButton,然后添加我们需要的事件对控件进行扩展即可。
在开发过程中,只需要将标准按钮拖放到对话框,这和一般开发没有区别。
基本思想:一般不需要将在新扩展类中编写消息响应代码,而是将该消息反射到父窗口中去,原因是因为在处理消息的过程中,我们需要用到父窗口的其他信息,
如果放在这个类中去实现,很麻烦,也基本不可能。
开发流程:
一 新建一个类NewButton,继承CButton,需要做如下工作:
添加事件OnLButtonDown OnLButtonUp 。
添加HWND成员变量 HWND m_hWnd.
添加消息宏道头文件中
#define WM_LBUTTONDOWNU (WM_USER+10)
#define WM_LBUTTONUPU (WM_USER+11)
添加自定义消息
//{{AFX_MSG(NewButton)
// NOTE - the ClassWizard will add and remove member functions here.
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
afx_msg void OnLButtonUp(UINT nFlags,CPoint point);
//}}AFX_MSG
实现2个事件函数
void NewButton::OnLButtonDown(UINT nFlags,CPoint point)
{
CButton::OnLButtonDown(nFlags,point);
UINT id =GetDlgCtrlID();
m_hWnd = GetParent()->GetSafeHwnd();
::SendMessage(m_hWnd,WM_LBUTTONDOWNU,id,0);
}
void NewButton::OnLButtonUp(UINT nFlags,CPoint point)
{
CButton::OnLButtonUp(nFlags,point);
UINT id;
id=GetDlgCtrlID();
m_hWnd=GetParent()->GetSafeHwnd();
::SendMessage(m_hWnd,WM_LBUTTONUPU,id,0);
}
二 在对话框中放置2个按钮 界面如下:
在Dialog中添加2个事件
afx_msg void OnLButtonDownu(UINT id,UINT qt);
afx_msg void OnLButtonUpu(UINT id,UINT qt);
//以上代码在VC6.0中可以,但是在vs2005以上的代码里面不行
改成:
afx_msg LRESULT OnLButtonDownu(UINT id,UINT qt);
afx_msg LRESULT OnLButtonUpu(UINT id,UINT qt);
添加消息映射
BEGIN_MESSAGE_MAP(CButtonExtDlg, CDialog)
//{{AFX_MSG_MAP(CButtonExtDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CANCELMODE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_LBUTTONDOWNU, OnLButtonDownu)
ON_MESSAGE(WM_LBUTTONUPU, OnLButtonUpu)
END_MESSAGE_MAP()
在OnIniDilog中添加代码
m_button1.SubclassDlgItem(IDC_BUTTON1,this);
m_button2.SubclassDlgItem(IDC_BUTTON2,this);
实现2个消息响应函数,对消息进行处理。
LRESULT CButtonExtDlg::OnLButtonDownu(UINT id,UINT qt)
{
if(id==IDC_BUTTON1)
{
GetDlgItem(IDC_EDIT_TEST)->SetWindowText("BUTTON1 DOWN");
}
if(id==IDC_BUTTON2)
{
GetDlgItem(IDC_EDIT_TEST)->SetWindowText("BUTTON2 DOWN");
}
return 0;
}
LRESULT CButtonExtDlg::OnLButtonUpu(UINT id,UINT qt)
{
if(id==IDC_BUTTON1)
{
GetDlgItem(IDC_EDIT_TEST)->SetWindowText("BUTTON1 UP");
}
if(id==IDC_BUTTON2)
{
GetDlgItem(IDC_EDIT_TEST)->SetWindowText("BUTTON2 UP");
}
return 0;
}
本文以一个扩展按钮的鼠标按下和鼠标松开的事件为例,其它控件事件扩展可遵照该例。提供源代码,在VC6.0中调试成功。
按钮也是一个窗口,继承自CWND,它其中封装了大量的消息,因此我们之需要继承CButton,然后添加我们需要的事件对控件进行扩展即可。
在开发过程中,只需要将标准按钮拖放到对话框,这和一般开发没有区别。
基本思想:一般不需要将在新扩展类中编写消息响应代码,而是将该消息反射到父窗口中去,原因是因为在处理消息的过程中,我们需要用到父窗口的其他信息,
如果放在这个类中去实现,很麻烦,也基本不可能。
开发流程:
一 新建一个类NewButton,继承CButton,需要做如下工作:
添加事件OnLButtonDown OnLButtonUp 。
添加HWND成员变量 HWND m_hWnd.
添加消息宏道头文件中
#define WM_LBUTTONDOWNU (WM_USER+10)
#define WM_LBUTTONUPU (WM_USER+11)
添加自定义消息
//{{AFX_MSG(NewButton)
// NOTE - the ClassWizard will add and remove member functions here.
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
afx_msg void OnLButtonUp(UINT nFlags,CPoint point);
//}}AFX_MSG
实现2个事件函数
void NewButton::OnLButtonDown(UINT nFlags,CPoint point)
{
CButton::OnLButtonDown(nFlags,point);
UINT id =GetDlgCtrlID();
m_hWnd = GetParent()->GetSafeHwnd();
::SendMessage(m_hWnd,WM_LBUTTONDOWNU,id,0);
}
void NewButton::OnLButtonUp(UINT nFlags,CPoint point)
{
CButton::OnLButtonUp(nFlags,point);
UINT id;
id=GetDlgCtrlID();
m_hWnd=GetParent()->GetSafeHwnd();
::SendMessage(m_hWnd,WM_LBUTTONUPU,id,0);
}
二 在对话框中放置2个按钮 界面如下:
在Dialog中添加2个事件
afx_msg void OnLButtonDownu(UINT id,UINT qt);
afx_msg void OnLButtonUpu(UINT id,UINT qt);
//以上代码在VC6.0中可以,但是在vs2005以上的代码里面不行
改成:
afx_msg LRESULT OnLButtonDownu(UINT id,UINT qt);
afx_msg LRESULT OnLButtonUpu(UINT id,UINT qt);
添加消息映射
BEGIN_MESSAGE_MAP(CButtonExtDlg, CDialog)
//{{AFX_MSG_MAP(CButtonExtDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CANCELMODE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_LBUTTONDOWNU, OnLButtonDownu)
ON_MESSAGE(WM_LBUTTONUPU, OnLButtonUpu)
END_MESSAGE_MAP()
在OnIniDilog中添加代码
m_button1.SubclassDlgItem(IDC_BUTTON1,this);
m_button2.SubclassDlgItem(IDC_BUTTON2,this);
实现2个消息响应函数,对消息进行处理。
LRESULT CButtonExtDlg::OnLButtonDownu(UINT id,UINT qt)
{
if(id==IDC_BUTTON1)
{
GetDlgItem(IDC_EDIT_TEST)->SetWindowText("BUTTON1 DOWN");
}
if(id==IDC_BUTTON2)
{
GetDlgItem(IDC_EDIT_TEST)->SetWindowText("BUTTON2 DOWN");
}
return 0;
}
LRESULT CButtonExtDlg::OnLButtonUpu(UINT id,UINT qt)
{
if(id==IDC_BUTTON1)
{
GetDlgItem(IDC_EDIT_TEST)->SetWindowText("BUTTON1 UP");
}
if(id==IDC_BUTTON2)
{
GetDlgItem(IDC_EDIT_TEST)->SetWindowText("BUTTON2 UP");
}
return 0;
}
0 0
- 在vc中自定义事件扩展控件功能
- C#自定义控件:扩展控件功能
- 使用智能设备扩展在 C# 中开发自定义控件
- 在VC 程序中自定义Vista事件日志
- Android自定义控件---继承ProgressBar功能扩展
- 如何在VC中使用自定义的SkinMagic控件?
- 自定义控件:使用智能设备扩展在 C# 中开发自定义控件
- 使用委托在用户自定义控件中实现事件响应
- 关于在自定义控件中事件不响应的问题
- 关于在自定义控件中事件不响应的问题
- 在反射中实现用户自定义控件的事件响应
- Android 触摸事件 在自定义控件中常用
- VC++中自定义控件小结
- VC++单文档分割窗口、在视图中添加控件,并响应该控件的事件
- VC++单文档分割窗口、在视图中添加控件,并响应该控件的事件
- performClick() 事件 直接在自定义控件中监听处理click 事件
- 在VC++中自定义消息
- VC中动态添加控件映射事件
- 升级samba问题
- 如何通过WiFi来进行Android的真机模拟
- Maven工程中外置Tomcat插件找不到: http://cwiki.apache.org/confluence/display/MAVEN/NoPluginFoundForPrefixExcept
- android中判断手机网络状况
- 一个swig的配置文件实例
- 在vc中自定义事件扩展控件功能
- C#不用ArcEngine,生成Shp文件(二)---------读取.shp文件格式
- 文章标题
- Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别
- php 端口扫描
- 关于oracle的两个视图user_tab_comments和user_col_comments妙用
- 文章标题
- Linux修改MySql默认存储引擎为InnoDB
- 【C/C++ 】C++库类大全