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是子控件的基类,编辑框是其中的一种。
MFC 单文档中动态添加菜单项和响应菜单事件
MFC 单文档中动态添加菜单项和响应菜单事件新建一个单文档程序在查看菜单项中增加两个子菜单,分别为隐藏工具栏(ID_HIDE),新建菜单(ID_NEWMENU) 在Resource.h中增加一个ID_NEWMENU宏#define ID_NEWMENU WM_USER+101操作工具栏和状态栏使用GetDescendantWindow函数获取工具栏和状态栏的指针为ID_HIDE添加消息映射,编辑代码如下static bool m_Hide=false;m_Hide=!m_Hide;//获取工具栏指针CWnd* pWndToolBar=(CWnd*)GetDescendantWindow(AFX_IDW_TOOLBAR);//获取状态栏指针CWnd* pWndStatusBar=(CWnd*)GetDescendantWindow(AFX_IDW_STATUS_BAR);CMenu* pMenu=GetMenu();CMenu* pSubMenu=pMenu->GetSubMenu(2);if(m_Hide){pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"显示工具栏");if(pWndStatusBar!=NULL) pWndStatusBar->SetWindowText("隐藏工具栏");if(pWndToolBar!=NULL) pWndToolBar->ShowWindow(SW_HIDE);}else{pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"隐藏工具栏");if(pWndStatusBar!=NULL) pWndStatusBar->SetWindowText("显示工具栏");if(pWndToolBar!=NULL) pWndToolBar->ShowWindow(SW_SHOW);}动态添加子菜单为ID_NEWMENU增加消息映射,编辑代码如下static UINT m_NewMenu=ID_NEWMENU+1;//获取菜单CMenu* pMenu=GetMenu();//获取索引为2的菜单项,即第3列菜单CMenu* pSubMenu=pMenu->GetSubMenu(2);char buffer[1];itoa(m_NewMenu-ID_NEWMENU,buffer,10);if(m_NewMenu<=ID_NEWMENU+5){pSubMenu->AppendMenu(MF_SEPARATOR); //分隔线pSubMenu->AppendMenu(MF_STRING | MF_ENABLED,m_NewMenu++,CString("新的菜单")+buffer);}//如果m_bAutoMenuEnable为true,则会依次检查View、Document、Frame的//消息映射表是否有这个弹出菜单中每个菜单项的处理函数,澳门新濠天地官网 如果没有就会把那一项改为灰的m_bAutoMenuEnable=false;添加OnCommand的消息映射用来响应添加的子菜单项,代码如下UINT uMsg=LOWORD(wParam);for(UINT i=ID_NEWMENU+1;i<=ID_NEWMENU+5;i++)if(uMsg==i){char buffer[1];itoa(i-ID_NEWMENU,buffer,10);MessageBox(CString("新的菜单") + buffer);}右键菜单在View类中添加OnRButtonDown的消息映射,代码如下CMenu pPopMenu;pPopMenu.CreatePopupMenu();if(pPopMenu==NULL);pPopMenu.AppendMenu(MF_STRING,ID_NEWMENU+6,"右键菜单");this->ClientToScreen(&point);pPopMenu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);在View类中添加OnCommand的消息映射用来响应右键菜单的事件UINT uMsg=LOWORD(wParam);if(uMsg==ID_NEWMENU+6)MessageBox(CString("右键菜单"));。
mfc动态创建EDIT控件
mfc动态创建EDIT控件知识点:CWnd::CreateCWnd::CreateExSpy++⼯具动态创建控件⼀、 CWnd::Create 参数virtual BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);BOOL CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, LPVOID lpParam = NULL);dwExStyle扩展样式0x204lpszClassName类名未知的话可以⽤spy++获取lpszWindowName窗⼝名dwStyle风格rect矩形pParentWnd⽗窗⼝nID窗⼝IDpContext窗⼝上下⽂环境⼆、代码测试:int CDialog_Dynamics_Create::OnInitDialog(void){CDialog::OnInitDialog();// TODO: 在此添加控件通知处理程序代码// myedt.Create(WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL|ES_CENTER,CRect(0,0,100,50),this,100081);//myedt.CWnd::Create(L"Edit",L"myedit",0x50010080,CRect(0,0,100,50),this,100081);//myedt.CWnd::CreateEx(0x204,L"Edit",L"myedit",0x50010080,CRect(0,0,100,50),this,100081);myedt.CreateEx(WS_EX_CLIENTEDGE,L"Edit",L"myedit",WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL|ES_CENTER,CRect(0,0,100,50),this,100081);myedt2.Create(WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL|ES_CENTER,CRect(0,60,100,110),this,100082);return0;}dwExStyle扩展窗⼝风格:•WS_EX_ACCEPTFILES 指明⽤这个风格创建的窗⼝能够接受拖放⽂件。
mfc子对话框自定义消息及响应函数
mfc子对话框自定义消息及响应函数在MFC程序中,子对话框是一种非常常用的UI组件,它可以作为主对话框的一个子窗口,用于显示和处理某个特定功能的界面和逻辑。
而在子对话框中,我们经常需要自定义消息和响应函数,以便实现自己的业务需求。
接下来,本文将为大家介绍如何在MFC子对话框中自定义消息和响应函数。
一、什么是自定义消息和响应函数?在MFC程序中,消息是指窗口和控件之间的通讯机制。
当用户执行某些操作时,窗口或控件会向消息队列中发送一条消息,然后消息循环会将这些消息逐个分发给窗口和控件,从而触发相应的事件和动作。
而自定义消息和响应函数,则是指我们可以自己定义一些特定的消息类型和相应的处理函数,从而实现对某些特定事件的处理。
比如,我们可以定义一个自己的WM_MY_MESSAGE消息,然后在子对话框中添加一个响应函数OnMyMessage,当收到这个消息时,就会自动调用该响应函数来处理相应的业务逻辑。
二、如何定义自定义消息和响应函数?在MFC程序中,定义自定义消息和响应函数的步骤如下:1.在resource.h文件中添加自定义消息的宏定义,如下所示:#define WM_MY_MESSAGE (WM_USER+100)其中,WM_USER是一个预定义的消息码,代表用户自定义消息的起始码,因此我们可以在此基础上加上一个任意数字来定义自己的消息码。
2.在子对话框的头文件中声明自定义消息的处理函数,如下所示:afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);其中,afx_msg是一个宏定义,代表该函数是一个MFC消息处理函数,LRESULT是一个预定义的返回值类型,代表消息的处理结果。
3.在子对话框的源文件中实现自定义消息的处理函数,如下所示:LRESULT CMySubDlg::OnMyMessage(WPARAM wParam, LPARAM lParam){// 在这里实现自己的业务逻辑return 0;}其中,CMySubDlg是子对话框的类名,OnMyMessage是自定义消息的处理函数名,wParam和lParam分别代表消息的参数,可以根据具体情况进行解析和使用。
MFC双击List消息响应
MFC双击List消息响应很多时候,我们在用CListCtrl创建一个列表时,需要一个双击列表中某一项的操作响应函数,这时候就需要响应List控件的NM_DBLCLK消息,响应这个消息有两种方法,一种是通过向导添加消息响应函数,另外一种是手动添加消息响应函数。
首先说明通过向导添加消息响应函数。
对于基于对话框的应用程序,或者基类是CListView的类,可以打开类向导,在打开的类向导中的消息一栏即可找到NM_DBLCLK这样一个消息,双击添加消息响应函数,向导会自动为我们建立消息映射,我们只需在对应的消息响应函数OnNMDblclk中添加我们所需要的操作代码即可。
对于继承于CListView的视图类,可在函数操作中定义CListCtrl& m_ListCtrl= GetListCtrl()来获取List控件对象引用,其余操作方法跟基于对话框的List控件操作一样。
DWORD dwStyle = listctr.GetExtendedStyle();dwStyle |= LVS_EX_FULLROWSELECT;// 选?中D某3行D使o1整?行D高?亮¢¨¢(ê?§只?适o¨o 用??与??report 风¤?格?的ì?listctrl)ê?dwStyle |= LVS_EX_GRIDLINES;dwStyle |=LVS_EX_UNDERLINEHOT;dwStyle |= LVS_EX_TWOCLICKACTIVATE;listctr.SetExtendedStyle(dwStyle); //设|¨¨置?列¢D表à¨a风¤?格?通过以上六行代码,即可将列表的风格设置为选中时为高亮状态。
NM_LISTVIEW *pNMListCtrl = (NM_LISTVIEW *)pNMHDR;if(pNMListCtrl->iItem != -1){CListCtrl& m_ListCtrl= GetListCtrl(); // 获?取¨?列¢D表à¨a的ì?控?件tCString str;str = m_ListCtrl.GetItemText(pNMListCtrl->iItem, 0);CMotorDlg dlg(str);dlg.DoModal();}以上语句可判断双击是否在有数据的列表上,并获得被双击的行数iItem和这一行的第几个子项号iSubItem,这样即可快速定位到被选中的地方并可以获得对应的数据。
MFC双击List消息响应
很多时候,我们在用CListCtrl创建一个列表时,需要一个双击列表中某一项的操作响应函数,这时候就需要响应List控件的NM_DBLCLK消息,响应这个消息有两种方法,一种是通过向导添加消息响应函数,另外一种是手动添加消息响应函数。
首先说明通过向导添加消息响应函数。
对于基于对话框的应用程序,或者基类是CListView的类,可以打开类向导,在打开的类向导中的消息一栏即可找到NM_DBLCLK这样一个消息,双击添加消息响应函数,向导会自动为我们建立消息映射,我们只需在对应的消息响应函数OnNMDblclk中添加我们所需要的操作代码即可。
对于继承于CListView的视图类,可在函数操作中定义CListCtrl& m_ListCtrl= GetListCtrl()来获取List控件对象引用,其余操作方法跟基于对话框的List控件操作一样。
DWORD dwStyle = listctr.GetExtendedStyle();dwStyle |= LVS_EX_FULLROWSELECT;// 选?中D某3行D使º1整?行D高?亮¢¨¢(ꡧ只?适º¨º用®?与®?report 风¤?格?的Ì?listctrl)ê?dwStyle |= LVS_EX_GRIDLINES;dwStyle |=LVS_EX_UNDERLINEHOT;dwStyle |= LVS_EX_TWOCLICKACTIVATE;listctr.SetExtendedStyle(dwStyle); //设¦¨¨置?列¢D表À¨ª风¤?格?通过以上六行代码,即可将列表的风格设置为选中时为高亮状态。
NM_LISTVIEW *pNMListCtrl = (NM_LISTVIEW *)pNMHDR;if(pNMListCtrl->iItem != -1){CListCtrl& m_ListCtrl= GetListCtrl(); // 获?取¨?列¢D表À¨ª的Ì?控?件tCString str;str = m_ListCtrl.GetItemText(pNMListCtrl->iItem, 0);CMotorDlg dlg(str);dlg.DoModal();}以上语句可判断双击是否在有数据的列表上,并获得被双击的行数iItem和这一行的第几个子项号iSubItem,这样即可快速定位到被选中的地方并可以获得对应的数据。
MFC开发中添加自定义消息和消息响应函数
MFC开发中添加⾃定义消息和消息响应函数(1)在.h或.cpp⽂件定义⼀个消息 #define CLICK_MESSAGE_BOX WM_USER+1001 //add by 20180612 给主窗⼝ctrl.cpp发送消息 //⾃定义消息 #define WM_PENSIGNMSG WM_USER+1001(2)在.h中类定义⾥添加消息映射DECLARE_MESSAGE_MAP() //类的定义 class CamPenSignerCtrl : public COleControl { // 消息映射 DECLARE_MESSAGE_MAP() }(3)在.h中类定义⾥添加宏⾥⾯添加消息处理函数声明 //类的定义 class CamPenSignerCtrl : public COleControl { //add by 20180612 给主窗⼝ctrl.cpp发送消息 //定义消息处理函数 afx_msg LRESULT OnPensignMsgHandler(WPARAM wParam, LPARAM lParam); }(4)cpp⽂件⾥链接消息和消息映射函数 BEGIN_MESSAGE_MAP(CamPenSignerCtrl, COleControl) //add by 20180612 给主窗⼝ctrl.cpp发送消息 //实现消息映射 ON_MESSAGE(WM_PENSIGNMSG,OnPensignMsgHandler) END_MESSAGE_MAP()(5)cpp中实现消息响应函数 afx_msg LRESULT CamPenSignerCtrl::OnPensignMsgHandler(WPARAM w,LPARAM l) { int nCode=l; EvtHandler(nCode); return 0; }(6)然后在本类中调⽤::PostMessage(PENSIGNMSG _MSG,0,0),当在这触发候,.cpp中的消息响应函数就触发了。
利用MFC 在运行中动态创建新窗口
利用MFC 在运行中动态创建新窗口在程序运行中,经常要利用对话框来给出某些提示,或者接收用户的反馈。
然而在莫些场合下,仅仅利用对话框的方式是不够的。
我们可能需要弹出一个新窗口,它包含自己的菜单条,对话框和状态条;当然,我们可以在对话框里加入菜单条,对话框和状态条,这在技术上是完全可行的,然而为何不直接创建新的窗口呢?本文给出了在MFC下的一种方法。
我们知道,Windows编程下,创建新窗口包括两个步骤:(1)注册相应的Windows窗口类;(2)根据注册的窗口类,生成某个窗口。
然而如果在MFC下,想要利用C++和MFC的特性,我们最好利用现成的MFC类,从其继承过来,并加以改造,以添加我们必须的元素。
以下给出具体例子,主窗口显示一个矩形图形,在主窗口单击,将弹出包含编辑控件的新窗口。
注意可以创建多个新窗口,当主窗口关闭时,所有新窗口也随之关闭。
步骤一,创建一个SDI工程Test。
编辑CtestView:OnDraw函数,在客户区画一个矩形:void CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here// Draw a rectangle in ClientpDC->Rectangle( 50, 50, 200, 200);pDC->TextOut( 10, 10, "在窗口单击鼠标左键,创建新窗口");}步骤二:利用ClassWizard从CframeWnd继承新窗口的类CnewFrame:在资源里资源:简单起见,工具栏仍然采用主窗口的工具栏和状态条。
在CNewFrame.H的类声明中插入工具栏和状态栏对象的声明:protected: // control bar embedded membersCStatusBar m_wndStatusBar;CToolBar m_wndToolBar;在CNewFrame响应WM_CREATE消息,在CNewFrame::OnCreate中装载工具栏和状态条:int CNewFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CFrameWnd::OnCreate(lpCreateStruct) == -1)return -1;// TODO: Add your specialized creation code hereif (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))// 简单起见,仍然装载主窗口的工具栏// 用户也可装载自己的工具栏{TRACE0("Failed to create toolbarn");return -1; // fail to create}if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))){TRACE0("Failed to create status barn");return -1; // fail to create}// TODO: Delete these three lines if you don''''t want the toolbar to// be dockablem_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);static int s_nNewFrameID = 0;s_nNewFrameID ++;CString str;str.Format( "第%d 号新窗口", s_nNewFrameID );SetWindowText( str );//设置新窗口的标题return 0;}步骤三:窗口的销毁的处理。
MFC添加工具条按钮并加入事件
网上也找了些资料,经过几个小时的错误实验终于做出来了。
首先切换到资源视图,编辑最后一个灰
色的按钮,我画的图案是一个红色的α。
现在运行按钮是灰色的说明没有添加事件。
点击资源视图中的Dialog,右键添加Dialog。
在工具箱中拖动列表控件到新建的Dialog中。
在这个新的对话框上右击,添加类,类名CMyDlg。
资源视图,点击新建的α按钮,属性视图,改变ID为ID_MyButton
类视图,CMainFrame右键类向导,事件处理程序,添加ID_MyButton的响应函数,编辑代码。
添加代码CMyDlg dlg;
此时会报错,因为没有包含MyDlg.h头文件,在本页最上方添加声明处添加#include "MyDlg.h",报错消失。
在CMyDlg dlg这句话的后面添加
dlg.DoModal();
整个过程就做完了。
实现效果
参考资料/t/20060830/15/4986680.html的第三楼写的。
还有百度文档《02界面编程-2控制条》,有兴趣的同志可以自己去原帖看一下。
MFC控件使用说明
MFC控件使用说明MFC(Microsoft Foundation Classes)是一套C++的类库,用于开发Windows应用程序。
MFC提供了丰富的控件(control)来实现图形界面(GUI)。
下面是MFC控件的使用说明。
1.控件概述:2.控件的创建:在MFC应用程序的对话框资源中可以选择并拖拽控件到界面上。
MFC 提供了DIALOG控件类表示对话框,并通过类向导(Class Wizard)自动生成控件的成员变量。
3.控件的属性和事件:每个控件都有一些属性,如字体、颜色、大小等,可以通过修改这些属性来改变控件的外观。
每个控件也都有一些事件,如鼠标点击、按键按下等,可以通过响应这些事件来处理用户的操作。
4.控件的操作:MFC提供了一系列的成员函数来操作控件,如设置文本、获取选择的项、显示隐藏控件等。
可以通过控件的成员变量来调用这些函数。
5.控件的布局和对齐:在对话框资源中可以使用布局与对齐工具来自动排列和对齐控件。
也可以通过代码来动态调整控件的位置和大小。
6.控件的自定义:如果MFC提供的控件不能满足需求,可以继承自原有控件类,并重写其成员函数来实现自定义的控件。
7.控件的扩展库:除了MFC提供的控件,还可以使用第三方控件库来增加更多的控件。
常见的控件库有DevExpress、Telerik等,提供了更丰富的控件和功能。
8.控件的样式和外观:9.控件的国际化和本地化:MFC提供了多语言支持,可以使用资源文件来实现对不同语言的支持。
通过在资源文件中提供不同语言的字符串,可以使控件显示适合不同语言环境的文本。
10.控件的错误处理:在使用MFC控件时,可能会出现一些错误,如控件无法创建、控件响应事件失败等。
可以通过正确处理这些错误,如捕获异常、输出错误信息等来保证程序的稳定性和可靠性。
总结:MFC控件提供了丰富的功能和灵活的扩展方式,可以满足大部分GUI应用程序的需求。
通过掌握MFC控件的使用,可以快速开发出功能强大、界面友好的Windows应用程序。
MFC控件使用详细教程
MFC控件使用详细教程MFC(Microsoft Foundation Classes)是微软公司开发的一套面向对象的C++类库,旨在简化Windows应用程序的开发。
其中包括了一系列的控件类,用于构建Windows用户界面。
本文将介绍MFC控件的使用,并提供详细的教程。
1.创建MFC应用程序首先,打开Visual Studio开发环境,选择创建MFC应用程序项目。
在项目向导中,选择“对话框”应用程序类型。
2.添加控件到对话框在MFC应用程序中,用户界面的主要组成部分是对话框。
打开对话框资源文件(通常是一个名为“MainDlg”的文件),可以看到空白的对话框。
从工具箱中选择所需的控件,例如按钮(Button)、文本框(Edit Control)等。
点击工具箱中的控件,然后在对话框上绘制一个矩形,即可在对话框中添加该控件。
3.设置控件属性选中添加的控件,可以在“属性”窗口中设置其属性。
例如,可以设置按钮的文本、大小、位置等。
4.响应控件事件控件可以触发各种事件,例如按钮点击事件。
为了响应这些事件,我们需要添加相应的事件处理程序。
在资源视图中,右键点击对话框资源文件,选择“添加事件处理程序”。
然后,选择要响应的事件,例如按钮的点击事件。
在出现的对话框中,输入事件处理程序的名称,并选择成员变量的名称。
点击“确定”后,Visual Studio会自动生成事件处理程序的代码。
5.控件的常用操作- 设置控件的文本:使用SetWindowText函数,例如SetWindowText("Hello");- 获取控件的文本:使用GetWindowText函数,例如CString str; GetWindowText(str);- 启用或禁用控件:使用EnableWindow函数,例如EnableWindow(FALSE)可以禁用控件;- 显示或隐藏控件:使用ShowWindow函数,例如ShowWindow(SW_HIDE)可以隐藏控件;- 设置或获取控件的位置、大小:使用SetWindowPos和GetWindowRect函数,例如SetWindowPos(NULL, x, y, width, height)可以设置控件的位置和大小;- 样式和外观设置:使用ModifyStyle和SetWindowLong函数,例如在按钮上设置图标和文字风格。
MFC中如何动态创建控件并响应其消息
MFC中如何动态创建控件并响应其消息原理:利用窗体上的消息都会经OnCmdMsg进行路由处理的原理,在这里截获自己动态生成的那些控件,然后通过自定义消息发送出去(带上控件id),经自己的消息处理函数处理即可。
1、定义起始控件ID号,和自定义消息UINT Start_CtlID = 1980;#define DynamicBtnMessage WM_USER+200后面动态创建的控件id号会基于Start_CtlID自增;2、在OnInitDialog中动态创建控件窗体类中定义:CArray 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是控件命令(比如点击事件消息),注:其它系统事件也会走到这个函数里进行分发的。
MFC动态控件添加消息响应
MFC动态控件添加消息响应MFC动态创建控件的消息处理前些天有⼈在论坛⾥问在动态创建TreeCtrl后怎么响应消息于是便写了⼀点⾃⼰的⼼得现整理如下。
本例在MFC动态创建控件的消息处理前些天有⼈在论坛⾥问在动态创建TreeCtrl后怎么响应消息于是便写了⼀点⾃⼰的⼼得现整理如下。
本例在view中动态创建⼀个ListCtrl并响应其NM_CLICK消息先写出动态创建的代码: 新建⼀SDI⼯程给view加上⼀个成员变量:CListCtrl m_list 在view的OnCreate中创建它:ifm_list.CreateWS_BORDER WS_CHILD WS_VISIBLELVS_ICON LVS_AUTOARRANGELVS_EDITLABELSCRect1010310210thisID_LISTCTRLTRACE0Failed to create ListCtrl windownreturn -1//添加⼀些项CString strforint i0i10istr.Formatitemdim_list.InsertItemistr 其中的ID_LISTCTRL是这个控件的ID当然你可以直接⽤数值来表⽰但为了程序清淅还是定义⼀个常量的好在主菜单View-Resource Symbols弹出的对话框中New按钮在Name下⾯输⼊ID_LISTCTRL. 创建完毕编译链接后就可以运⾏了但你怎么它都没反应当然因为我们还没写消息处理的代码。
通常做法是⼿动写消息处理函数及消息映射⾄少得三步1在头⽂件中定义消息处理函数的原型2在cpp中实现这个函数3在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间写上消息映射。
如果是单单处理⼀个消息的话那还可以忍受消息⼀多的话不但⿇烦还容易出错。
所以我采取下⾯的⽅法: 1.打开about对话框资源放⼊⼀个ListCtrl控件到对话框中并将其ID设为ID_LISTCTRL. 2.CtrlW把Class Name由原来的CAboutDlg改为CxxxView在左边的Object IDS中选择ID_LISTCTRL这时右边会出现相应的通知消息这时就可以跟平常⼀样双击添加消息映射了. 嘿嘿是不是跟在对话框⾥响应控件的消息⼀样很⽅便呀. 有⼀点需要注意只有当打开你加⼊控件的那个对话框资源编辑器的时候按CtrlW时Class Wizard中才会出现那个ID_LISTCTRL还有发⾏时注意把对话框上的listctrl控件删掉.。
- 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;
}。