MFC中如何动态创建控件并响应其消息
MFC实现动态菜单及响应函数

MFC实现动态菜单及响应函数MFC中利用CMenu类动态添加弹出菜单和响应函数步骤:1 声明一个菜单:CMenu menu;2 生成菜单对象:menu.CreatePopupMenu();3 给菜单添加上内容:menu.AppendMenu(MF_STRING,WM_CLEARHOSTS,"清除HOSTS");AppendMenu函数具体的意义可以查看MSDN,其中WM_CLEARHOSTS为自定义的一个消息,最后一个参数为菜单的text,点击这个菜单就可以调用WM_CLEARHOSTS消息的处理函数。
4 添加子弹出菜单:CMenu submenu;submenu.CreatePopupMenu();menu.AppendMenu(MF_POPUP,(UINT_PTR)(submenu.m_hM enu),"sub");5 设置当失去焦点时菜单自动消失SetForegroundWindow();6 设置菜单的位置:menu.TrackPopupMenu();以上各步连接起来就是一个完整的动态生成菜单的步骤,当动态生成的菜单很多且菜单又不固定的时候,预先为每个菜单都定义一个消息和消息处理函数是很麻烦且不现实的,现在介绍一种方法来动态响应动态生成的菜单。
其原理就是利用OnCommand函数。
首先,要为每一个动态生成的菜单指定一个ID,方式如下menu.AppendMenu(MF_STRING,ID,"yourMenuName");其中参数ID为一个唯一的整数,可以由你自己指定,当鼠标单击此菜单的时候,系统发送一个消息,此消息优先被OnCommand函数接收,OnCommand函数的原形为:BOOL OnCommand(WPARAM wParam, LPARAM lParam);假如你指定菜单的ID为10001,响应函数的具体写法为:BOOL OnCommand(WPARAM wParam, LPARAM lParam){int menuID = LOWORD(wParam);if(menuID > 10000){//添加你自己的处理代码}}如果是使用对话框的mfc,自己重载OnCommand函数即可做一个MFC程序的时候碰到一个需求。
MFC实现动态菜单及响应函数

MFC实现动态菜单及响应函数一、实现步骤1.调用AppendMenu函数在菜单栏添加菜单2.调用AppendMenu函数在菜单栏菜单项添加子菜单3.调用AppendMenu函数在菜单栏菜单项添加动态子菜单4.将菜单所属的窗口句柄传入OnInitMenu函数5.在OnInitMenu函数中清除原有的菜单6.在菜单窗口中添加新的菜单二、代码1.主程序代码```// MFC_DynamicMenu.cpp : 定义应用程序的入口点。
//#include "stdafx.h"#include "MFC_DynamicMenu.h"#define MAX_LOADSTRING 100//全局变量:HINSTANCE hInst; // 当前实例WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名//此代码模块中包含的函数的前向声明:ATOM MyRegisterClass(HINSTANCE hInstance);BOOL InitInstance(HINSTANCE, int);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int APIENTRY wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR lpCmdLine,_In_ int nCmdShow)UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);//TODO:在此处放置代码。
//初始化全局字符串LoadStringW(hInstance, IDS_APP_TITLE, szTitle,MAX_LOADSTRING);LoadStringW(hInstance, IDC_MFCCDYNAMICMENU, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);//执行应用程序初始化:if (!InitInstance (hInstance, nCmdShow))return FALSE;}HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MFCCDYNAMICMENU));MSG msg;//主消息循环:while (GetMessage(&msg, nullptr, 0, 0))if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) TranslateMessage(&msg);DispatchMessage(&msg);}}return (int) msg.wParam;//// 函数: MyRegisterClass////目标:注册窗口类。
MFC自定义Static控件响应事件

{ // TODO: Add your message handler code here and/or calldefault AfxMessageBox("haha");// return CStatic::OnMouseWheel(nFlags, zDelta, pt);
}Байду номын сангаас
SetFocus(); CStatic::OnLButtonDown(nFlags, point);
} // void CStaticTest::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default SetFocus(); CStatic::OnRButtonDown(nFlags, point); } BOOL CStaticTest::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
mfc树控件复选框消息响应函数

mfc树控件复选框消息响应函数MFC树控件是Windows程序开发中常用的控件之一。
复选框是树控件中常用的交互元素之一,通常用于选择树节点。
在MFC树控件中,当用户选择或取消选择复选框时,控件会发送一条消息,程序可以通过响应该消息来实现响应节点的变化。
要实现复选框的消息响应函数,需要在定义树控件时添加一个响应函数。
在此函数中,可以获取选中或取消选中的节点,并执行相应的操作。
下面是一个示例函数:void CMyTreeCtrl::OnNMClick(NMHDR *pNMHDR, LRESULT*pResult){LPNMTREEVIEW pNMTreeView =reinterpret_cast<LPNMTREEVIEW>(pNMHDR);// 获取选中的树节点HTREEITEM hItem = pNMTreeView->itemNew.hItem;if (!hItem)return;// 获取节点的状态int iState = GetCheck(hItem);// 更新节点的状态if (iState == 0)SetCheck(hItem, 1);elseSetCheck(hItem, 0);*pResult = 0;}上述示例函数响应了树控件的单击消息,并获取了当前选中的节点。
然后,函数根据节点的状态执行不同的操作。
在实际开发中,我们可以根据自己的需求做出相应的更改,例如在选中节点时执行一个函数、在取消选中节点时执行另一个函数等等。
同时,需要注意的是,在响应函数中应该避免使用过于复杂的操作,以保证程序的运行效率。
总之,实现MFC树控件的复选框消息响应函数是本程序员必备技能之一。
通过响应函数的编写,可以灵活控制树控件的行为,实现更好的用户体验。
动态创建按钮

1动态建立一个按钮一.首先建立一个模态对话框二.在建立的对话框上加一个按钮,并设置按钮的ID为:IDD_BTN_ADD,Caption:Add,下面就实现单击这个Add按钮后,在对话框中动态建立一个按钮的功能1.为Add按钮添加单击时的消息响应函数,方法:单击【Add】按钮,在【ClassWizard】菜单项,即可出现MFC Class Wizard 对话框,在messages列表中选择BN_CLIked消息,单击Add function 按钮,并接受自动设置的函数名:OnBtnAdd ,然后单击Edit Code按钮,即可定位函数的定义处。
2.动态创建按钮,在CTestDlg类中添加一个私有的CButton成员变量:m_btn,然后调用CButton类的成员函数Create来实现。
void CTestDlg::OnBtnAdd(){// TODO: Add your control notification handler code herem_btn.Create("New",BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,CRect(0,0,100,100),this,123);}2.控件的访问静态文本控件当单击“Number1”时,把其静态文本变成“数值1:”。
1.第一步修改控件的ID为IDC_NUMBER1,单击【Number1】按钮,在【ClassWizard】菜单项,即可出现MFC Class Wizard 对话框,在messages列表中选择BN_CLIked 消息,单击Add function 按钮,并接受自动设置的函数名:OnNumber1,然后单击Edit Code按钮,即可定位函数的定义处。
2.利用GetDlgItem函数获得静态文本框控件对象3.显示文本用GetWindowText函数4.如果要设置文本用SetWindowText函数代码实现如下:void CTestDlg::OnNumber1(){// TODO: Add your control notification handler code hereCString str;if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str),str=="Number1:"){GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1:");}else{GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:");}}3.编辑框控件:在前面两个控件中输入两个数字,单击【Add】按钮,对前面两个编辑框求和,显示在第三个编辑框中。
在MFC中创建动态控件的生成与响应

在MFC中创建动态控件的生成与响应作者:风林动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的。
一、创建动态控件:为了对照,我们先来看一下静态控件的创建。
放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示。
静态控件不需要调用Create()函数来创建。
而创建动态控件有很大不同,以下以按钮为例,看一下动态控件的创建过程:1.建立控件ID号:ID号是控件的标识,创建控件前必须先为它设置一个ID号。
打开资源中的“String Table”,在空白行上双击鼠标,这时会弹出一个ID属性对话框,在其中的ID编辑框中输入ID,如:IDC_MYBUTTON,在Caption中输入控件标题或注解(注:Caption框不能为空,为空会导致创建失败),这里我输入的是按钮上要显示的文字--动态按钮。
2.建立控件对象:不同种类的控件应创建不同的类对象,按钮控件CButton (包括普通按钮、单选按钮和复选按钮)编辑控件CEdit静态文本控件CStatic标签控件CTabCtrl旋转控件CSpinButtonCtrl滑标控件CSliderCtrl多信息编辑控件CRichEditCtrl进度条控件CProgressCtrl滚动条控件CSrcollBar组合框控件CComboBox列表框控件CListBox图像列表控件CImageCtrl树状控件CTreeCtrl动画控件CAnimateCtrl本例中我们创建一个CButton类的普通按钮。
注意不能直接定义CButton对象,如:CButton m_My But;这种定义只能用来给静态控件定义控制变量,不能用于动态控件。
正确做法是用new调用CButton构造函数生成一个实例:CButton *p_My But = new CButton();然后用CButton类的Create()函数创建,该函数原型如下:BOOL Create( LPCTSTR lpszCaption, DWORD dwSty le, const RECT& rect, CWnd* pParentWnd, UINT nID );lpszCaption是按钮上显示的文本;dwSty le指定按钮风格,可以是按钮风格与窗口风格的组合,取值有:窗口风格:WS_CHILD 子窗口,必须有WS_VISIBLE 窗口可见,一般都有WS_DISABLED 禁用窗口,创建初始状态为灰色不可用的按钮时使用WS_TABSTOP 可用Tab键选择WS_GROUP 成组,用于成组的单选按钮中的第一个按钮按钮风格:BS_PUSHBUTTON 下压式按钮,也即普通按钮BS_AUTORADIOBUTTON 含自动选中状态的单选按钮BS_RADIOBUTTON 单选按钮,不常用BS_AUTOCHECKBOX 含自动选中状态的复选按钮BS_CHECKBOX 复选按钮,不常用BS_AUTO3STATE 含自动选中状态的三态复选按钮BS_3STATE 三态复选按钮,不常用以上风格指定了创建的按钮类型,不能同时使用,但必须有其一。
MFC动态按钮的创建及其消息响应(自定义消息)

MFC动态按钮的创建及其消息响应(⾃定义消息)动态按钮(多个)的创建:1、在类中声明并定义按钮控件的ID#define IDC_D_BTN 100002、在类的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⽂件)中声明消息响应函数OnButtonClickafx_msg void OnButtonClick(UINT uID);注:OnButtonClick函数的参数nID代表响应函数对应按钮控件的ID号,单个按钮可不设参数2、在对话框类的函数实现⽂件(.cpp⽂件)中定义消息映射ON_COMMAND_RANGE (多个按钮) 在函数实现⽂件中的消息映射部分(BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间)定义按钮控件与其消息响应函数之间的映射关系。
mfc中tabcontrol控件用法

mfc中tabcontrol控件用法TabControl控件是MFC中常用的窗口控件之一,用于创建多个选项卡,并在每个选项卡上显示不同的内容。
下面将介绍一下MFC中TabControl控件的基本用法。
首先,在MFC应用程序的对话框或窗口中添加一个TabControl控件。
可以通过在资源编辑器中拖放TabControl控件,或动态创建TabControl控件。
接下来,需要在代码中对TabControl控件进行初始化。
可以通过以下步骤来完成:1. 首先,定义一个成员变量来保存TabControl控件的指针,例如:```CTabCtrl m_tabCtrl;```2. 在对话框或窗口的OnInitDialog()函数中,将成员变量与TabControl控件关联起来,例如:```m_tabCtrl.SubclassDlgItem(IDC_TAB_CONTROL, this);```其中IDC_TAB_CONTROL是TabControl控件的ID,this表示当前对话框或窗口。
3. 接下来,可以设置TabControl控件的属性,例如添加选项卡、设置选项卡的文本等。
通过以下代码示例来添加两个选项卡:```m_tabCtrl.InsertItem(0, _T("Tab 1"));m_tabCtrl.InsertItem(1, _T("Tab 2"));```4. 接下来,可以在每个选项卡上添加子控件,以显示不同的内容。
可以使用对话框或窗口的Create()函数动态创建子控件,并将其与选项卡关联起来。
例如,在第一个选项卡上添加一个编辑框:```CWnd* pTabWnd = new CWnd;pTabWnd->Create(NULL, _T(""), WS_CHILD | WS_VISIBLE, CRect(0, 0, 200, 200), &m_tabCtrl, 0);```其中,CWnd是子控件的基类,编辑框是其中的一种。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
原理:
利用窗体上的消息都会经OnCmdMsg进行路由处理的原理,在这里截获自己动态生成的那些控件,然后通过自定义消息发送出去(带上控件id),经自己的消息处理函数处理即可。
1、定义起始控件ID号,和自定义消息
UINT Start_CtlID = 1980;
#define DynamicBtnMessage WM_USER+200
后面动态创建的控件id号会基于Start_CtlID自增;
2、在OnInitDialog中动态创建控件
窗体类中定义:CArray<CButton *> btnArray 以保存动态创建的按钮
int btnw=120;int btnh = 50;//创建*3个button,顺序排列
for (int i=0;i<5;i++)
{
for (int j=0;j<5;j++)
{
CString str;
str.Format(_T("Cam%d"),Start_CtlID-1980);
r.left =100 + (j*btnw);
r.top =250 + (i*btnh);
r.bottom = r.top + btnh;
r.right =r.left + btnw;
CButton *btn = CreateButton(Start_CtlID,str,r, BS_FLAT);
btn->ShowWindow(SW_SHOW);
btnArray.Add(btn);
}
}
3 在OnCmdMsg中处理控件点击消息
BOOL CFormDlg::OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo)
{
// 判断传进来的控件id位于动态创建button的id之间,并且命令nCode是控件命令(比如点击事件消息),注:其它系统事件也会走到这个函数里进行分发的。
if (nID>=1980 && nID<=Start_CtlID-1 && CN_COMMAND==nCode)
{
//发送自定义消息,并附上控件ID
PostMessage(DynamicBtnMessage,nID,NULL);
}
return CDialog::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
4、在自定义消息处理函数中处理点击事件
在BEGIN_MESSAGEMAP和END_MESSAGE_MAP之间加入以下消息映射:
ON_MESSAGE(DynamicBtnMessage, &CpngFormDlg::OnDynamicBtnMessage)
在头文件中定义消息响应函数:
afx_msg LRESULT OnDynamicBtnMessage(WPARAM wParam, LPARAM lParam);
LRESULT CpngFormDlg::OnDynamicBtnMessage(WPARAM wParam, LPARAM lParam) {
g_ClickBtnID = (UINT)wParam-1980;
if (g_ClickBtnID>=0 && g_ClickBtnID<=100)
{
CString str;
str.Format(_T("button %d is clicked!"),g_ClickBtnID);//获取到点击的是谁
AfxMessageBox(str);
}
return TRUE;
}。