MFC动态创建控件及其消息响应函数

原文链接: http://www.cnblogs.com/gaohongchen01/p/4046525.html

动态按钮(多个)的创建:

1、在类中声明并定义按钮控件的ID

#define IDC_D_BTN 10000

2、在类的OnInitDialog()函数中动态创建按钮(建立按钮对象时最好建立对象的指针)

3、手动释放对象指针

下面是动态生成多个按钮的例子:

CButton* btn = new CButton[5];  
DWORD dwStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;  
for(int i = 0; i < 5; i++)
{  
    btn[i].Create(_T("动态按钮"), dwStyle,CRect(20+80*i,20,80+80*i,60),this,IDC_D_BTN+i);    
}  

注:Create()的第一个参数为按钮的标题,可直接给出(如上所示),也可在String Table中先定义字符串,再利用控件的LoadString()函数将字符串读取进来

程序运行效果如下所示:

 

动态按钮(多个)的消息响应:

  一个MFC的消息响应函数在程序中有三处相关信息:函数原型函数实现以及用来关联消息和消息响应函数的宏。头文件中在两个AFX_MSG注释宏之间是消息响应函数原型的声明。源文件中有两处:一处是在AFX_MSG_MAP注释宏之间的消息映射宏,用来关联消息和消息响应函数的宏;另一处是源文件中的消息响应函数的实现代码。

下面为动态生成的多个按钮的消息响应的建立步骤:

1、在对话框类的定义文件(.h文件)中声明消息响应函数OnButtonClick

afx_msg void OnButtonClick(UINT uID);

注:OnButtonClick函数的参数nID代表响应函数对应按钮控件的ID号,单个按钮可不设参数

2、在对话框类的函数实现文件(.cpp文件)中定义消息映射ON_COMMAND_RANGE     (多个按钮)

  在函数实现文件中的消息映射部分(BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间)定义按钮控件与其消息响应函数之间的映射关系。

ON_COMMAND_RANGE(IDC_D_BTN,IDC_D_BTN+5-1,OnButtonClick)

  对于所有动态创建的5个按钮(ID号在IDC_D_BTN ~ IDC_D_BTN+5-1之间),定义其消息映射函数为OnButtonClick函数,根据其输入ID分辨具体响应那个按钮。

  若是单个按钮,则消息映射为ON_BN_CLICKED

ON_BN_CLICKED(IDC_BUTTON_ID, OnButtonFunc)

3、实现消息响应函数OnButtonClick

  在对话框类的函数实现文件(.cpp文件)中给出具体的按钮消息响应

 

自定义消息:

  消息映射循环机制是Windows程序运行的基本方式。VC++ MFC 中有许多现成的消息句柄,可当我们需要完成其它的任务,需要自定义消息,就遇到了一些困难。在MFC ClassWizard中不允许添加用户自定义消息,所以我们必须在程序中添加相应代码,以便可以象处理其它消息一样处理自定义消息。

  Windows消息用"WM_"这个前缀,自定义消息一般用"UM_这个前缀"

1、首先在头文件或CPP文件中定义一个消息(推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息)

#define WM_MY_MESSAGE (WM_USER+100) 

2、在消息映射宏里面添加函数声明

afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); 

3、在函数实现文件(.cpp文件)中定义消息映射ON_MESSAGE,关联消息和消息响应函数

ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)

4、实现消息处理函数,该函数使用WPRAM和LPARAM参数并返回LPESULT

LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)  
{  
    // TODO: 处理用户自定义消息  
    ...  
    return 0;  
}  

5、发送消息

::PostMessage(GetSafeHwnd(), WM_MY_MESSAGE, 0, 0);

  其中GetSafeHwnd()得到了一个当前窗口的句柄,此消息将发给当前窗口;如果想发送消息给其它窗口,只需改变这个句柄,前提是目的窗口也实现了此消息的处理函数。

注:

  如果用户需要一个定义整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage定义消息:

static UINT WM_MY_MESSAGE=RegisterWindowMessage("User"); 

并使用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过以下步骤实现: 1. 在 CListCtrl 的创建时设置 LVS_EDITLABELS 样式,这个样式可以让用户双击列表项时编辑文本。 2. 在 CListCtrl 的 OnDblClick() 函数中处理双击事件,可以使用 EditLabel() 函数让当前选中的列表项变为可编辑状态。 3. 在 CListCtrl 的 OnEndLabelEdit() 函数中处理编辑完成事件,可以获取用户输入的文本,并更新列表项的文本内容。 下面是一个示例代码: ``` // 创建列表控件 CRect rect(10, 10, 300, 200); DWORD dwStyle = WS_VISIBLE | WS_BORDER | LVS_REPORT | LVS_EDITLABELS; m_listCtrl.Create(dwStyle, rect, this, IDC_LIST_CTRL); // 设置列表控件的列头 m_listCtrl.InsertColumn(0, _T("姓名"), LVCFMT_LEFT, 100); m_listCtrl.InsertColumn(1, _T("年龄"), LVCFMT_LEFT, 100); // 在列表控件的 OnDblClick 函数中处理双击事件 void CMyDialog::OnDblClickListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { NMITEMACTIVATE* pActivate = (NMITEMACTIVATE*)pNMHDR; if (pActivate->iItem >= 0 && pActivate->iSubItem >= 0) { // 使用 EditLabel 函数让当前选中的列表项变为可编辑状态 m_listCtrl.EditLabel(pActivate->iItem); } *pResult = 0; } // 在列表控件的 OnEndLabelEdit 函数中处理编辑完成事件 void CMyDialog::OnEndLabelEditListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { LVITEM lvItem = { 0 }; lvItem.mask = LVIF_TEXT; lvItem.iItem = ((NMLVDISPINFO*)pNMHDR)->item.iItem; lvItem.iSubItem = ((NMLVDISPINFO*)pNMHDR)->item.iSubItem; lvItem.pszText = ((NMLVDISPINFO*)pNMHDR)->item.pszText; // 获取用户输入的文本,并更新列表项的文本内容 m_listCtrl.SetItem(&lvItem); *pResult = 0; } ``` 在上面的代码中,CMyDialog 是一个对话框类,m_listCtrl 是一个 CListCtrl 成员变量,OnDblClickListCtrl() 和 OnEndLabelEditListCtrl() 是列表控件消息响应函数。你可以将这些代码添加到你的 MFC 应用程序中,并根据需要进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值