怎么样在MFC中创建动态控件

作者&投稿:左刘 (若有异议请与网页底部的电邮联系)
MFC 动态创建多个控件~

CButton *pButton = new CButton[4];
for(int i=0;i<4;i++)
pButton[i].Create("第一个", WS_CHILD|BS_DEFPUSHBUTTON|WS_VISIBLE|BS_AUTOCHECKBOX,
CRect(10, 80, 200, 100), this, 123+i);
//这里我没有更改每个控件的位置,你设置的CRect(10, 80, 200, 100),所以,你要分别设置这四个控件的位置,比如CRect(10+50*i,10,50+50*i,50)

工具箱空白处右键-》选择项-》浏览-》(找到activex的dll)-》打开-》确定 这时,在工具箱里就有你写的ActiveX控件了,把它拖到界面上即可

在MFC中怎么动态创建各种控件,以及添加相应的响应事件。

放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从对象窗口中拖出所需控件放在对话框中即可,再恰当批改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示。

静态控件不须要调用Create()函数来创建。

动态控件是指在须要时由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_MyBut;这种定义只能用来给静态控件定义把握变量,不能直接用于动态控件。

正确做法是用new调用CButton机关函数生成一个实例:

[cpp] view plain copy
CButton *p_MyBut = new CButton();

然后用CButton类的Create()函数创建,该函数原型如下:

BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

lpszCaption是按钮上显示的文本;

dwStyle指定按钮风格,可所以按钮风格与窗口风格的组合,取值有:

窗口风格:

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 三态复选按钮,不常用

以上风格指定了创建的按钮类型,不能同时应用,但必须有其一。

BS_BITMAP 按钮大将显示位图

BS_DEFPUSHBUTTON 设置为默认按钮,只用于下压式按钮,一个对话框中只能指定一个默认按钮

rect指定按钮的大小和地位;

pParentWnd指导拥有按钮的父窗口,不能为NULL;

nID指定与按钮接洽关系的ID号,用上一步创建的ID号。

不同控件类的Create()函数略有不同,可参考相干材料。

例:p_MyBut->Create( "动态按钮", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20,10,80,40), this, IDC_MYBUTTON );

这样,我们就在当前对话框中的(20,10)处创建了宽60,高30,按钮文字为“动态按钮”的下压式按钮。

为了使创建过程更便利易用,我定义了如下函数:

[cpp] view plain copy
CButton* CTextEditorView::NewMyButton(int nID,CRect rect,int nStyle)  
{  
 CString m_Caption;  
 m_Caption.LoadString( nID ); //取按钮题目  
 CButton *p_Button = new CButton();  
 ASSERT_VALID(p_Button);  
 p_Button->Create( m_Caption, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | nStyle, rect, this, nID );  //创建按钮  
 return p_Button;  
}

此中m_Caption.LoadString( nID )是从字符串表中读取按钮文本,如许在创建按钮ID时,应当把文本设置好,参数nStyle为除必须风格外的额外风格。

以下,我调用该函数创建三个按钮,并指定第一个按钮为默认按钮,按钮的ID已预先设置好了:

[cpp] view plain copy
CButton *p_MyBut[3];  
p_MyBut[0] = NewMyButton( ID_MYBUT1, CRect(10,20,50,35), BS_DEFPUSHBUTTON );  
p_MyBut[1] = NewMyButton( ID_MYBUT2, CRect(55,20,95,35), 0 );  
p_MyBut[2] = NewMyButton( ID_MYBUT3, CRect(100,20,140,35), 0 );

二、动态控件的响应:

动态控件的响应函数不能直接用ClassWizard添加,只能手动添加。仍以上方的按钮为例,我们建造按钮的单击响应函数。

1.在MESSAGE_MAP中添加响应函数:

MESSAGE_MAP表中定义了消息响应函数,其格局为:消息名(ID,函数名),当我们用ClassWizard添加函数时,会主动添加在AFX_MSG_MAP括起的区间内,如:

[cpp] view plain copy
BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)  
 //{{AFX_MSG_MAP(CTextEditorView)  
 ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)  
 //}}AFX_MSG_MAP  
END_MESSAGE_MAP()

手工添加时不要添加到AFX_MSG_MAP区间内,以防ClassWizard不克不及正常工作,如:

[cpp] view plain copy
BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)  
 //{{AFX_MSG_MAP(CTextEditorView)  
 ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)  
 //}}AFX_MSG_MAP  
 ON_BN_CLICKED(ID_MYBUT1, OnMybut1)  
 ON_BN_CLICKED(ID_MYBUT2, OnMybut2)  
 ON_BN_CLICKED(ID_MYBUT3, OnMybut3)  
END_MESSAGE_MAP()

此中ON_BN_CLICKED是按钮单击消息。

2.在头文件中添加函数定义:

用ClassWizard添加函数时,会在头文件的AFX_MSG区间内添加函数定义,如:

[cpp] view plain copy
protected:  
 //{{AFX_MSG(CTextEditorView)  
 afx_msg void OnIconbut0();  
 //}}AFX_MSG  
 DECLARE_MESSAGE_MAP()

我们仿照这种情势,只是把函数定义添加到AFX_MSG区间外就行了:

[cpp] view plain copy
protected:  
 //{{AFX_MSG(CTextEditorView)  
 afx_msg void OnIconbut0();  
 //}}AFX_MSG  
 afx_msg void OnMybut1();  
 afx_msg void OnMybut2();  
 afx_msg void OnMybut3();  
 DECLARE_MESSAGE_MAP()



如何在Visual Studio 2015中创建MFC窗体应用
我们在使用Visual Studio 2015创建桌面应用的时候,最经常遇到的就是Winform和MFC了,那么如何在Visual Studio 2015中创建MFC窗体应用呢?下面我给大家分享一下。工具\/材料 VisualStudio2015 首先我们打开Visual Studio 2015软件,点击顶部的文件菜单,然后选择新建下面的项目选项,如下图所示 接下来在弹出的...

学习MFC框架如何创建的过程
CChildFrame做为子窗口包含于MDIClient中(可以包含多个),CChildFrame里面则是真实的文档表示窗口CMDITestView了。 我们从这里开始:\/\/ CMDITestApp 初始化BOOL CMDITestApp::InitInstance() 做为CWinApp的派生类,通常需要重载InitInstance(), ExitInstance()两个函数,以完成应用的初始化和退出。我们现在...

MFC中用Cwnd类创建一个最简单的窗口
pMainWnd == NULL)m_pMainWnd = new COurWnd();m_pMainWnd->ShowWindow(m_nCmdShow);return TRUE;};COurApp myapp;大致步骤,新建win32项目,然后在工程属性中把使用标准windows库改为在静态库或动态库中使用mfc。代码适用于vc2008 unicode工程中,如果是非unicode,请把字符串常量前大写的L去掉 ...

mfc 创建图形插入符时,在哪里写代码?(纯新手菜鸟,希望高手指教)_百度...
就会释放销毁,因此我们可以将它,设置为Cview的一个成员变量,即在CView中加入代码:Private:CBitmap bitmap;完整代码为:bitmap.LoadBitmap(IDB_BITMAP1);\/\/初始化 CretCaret();ShowCaret();我也是初学,对这个有些迷糊,查到资料说是这样子,你有清楚的做法吗?发我,谢谢。我qq:460752384 ...

vs2010 mfc中如何在视图中创建一个图形,然后用鼠标能拖动,双击它还会弹 ...
创建一个从CStatic派生的类即可 该类显示图形,并处理鼠标消息使之能拖动并弹出对话框。

MFC 怎样新建一个窗体 ?
当前窗口,有一个窗口类吧,例如CMyDlg(只是举个例子,名字是你自己取的)。然后用这个类新建一个对象dlg2 最后调用dlg2.DoModal();

怎样用MFC做一个图形界面程序
给你个最最简单的MFC程序。你可以打开2005 新建win32 程序 建立空项目 然后编写如下代码\/\/hello.cpp include <afxwin.h> \/\/ 说明应用程序类 class CHelloApp : public CWinApp { public:virtual BOOL InitInstance();};\/\/ 建立应用程序类的实例 CHelloApp HelloApp;\/\/ 说明主窗口类 class CHello...

基于对话框的MFC应用程序怎么建立?
即,可以直接使用MFC的CFrameWnd类实现一个窗口,但是CWinApp不能直接使用,必须派生一个用户类,因为Windows程序的启动顺序是:实例全局对象,WinMain,…,如果不实例CWinApp,找不到机会创建窗口,而派生之后,就可以重载CWinApp::InitInstance函数,AfxWinMain里会调用这个函数。10. 使用File|New,选择Resource...

用MFC如何创建文件夹?
CString strFolderPath="c:\\\\test"\/\/ 判断路径是否存在 if (!PathIsDirectory(m_strFolderPath) ){ CString strMsg;strMsg.Format ("指定路径\\"%s\\"不存在,是否创建?", m_strFolderPath);if (AfxMessageBox(strMsg, MB_YESNO) == IDYES){ if (!Create...

MFC中怎么创建一颗树 而且动态的去增加结点
先建立root HTREEITEMroot = m_tree.InsertItem(_T(""),TVI_ROOT);for(iter = pView->a.begin(); iter != pView->a.end(); iter++)\/\/a是一个向量用来存储建立子节点数据 { HTREEITEMrootItem = m_tree.InsertItem(iter->second,root);} \/\/我的向量是一个map,所以a.second表示a向量...

共和县19170945532: 怎样动态创建控件:比如创建按钮 -
闻虽头孢: mfc中,定义private:Cbutton m_btn;//运行的地方输入m_btn.Create(L”增加的按钮!”,BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,CRect(0,0,100,100),this,123);第一个参数就是按钮的标题,不用多说了;第二个参数是按钮的类型...

共和县19170945532: mfc怎样动态的创建activex控件 -
闻虽头孢: 工具箱空白处右键-》选择项-》浏览-》(找到activex的dll)-》打开-》确定 这时,在工具箱里就有你写的ActiveX控件了,把它拖到界面上即可

共和县19170945532: MFC 中怎么动态创建Picture Control控件 -
闻虽头孢: 用炫彩界面库 ,XPic_Create() 创建图片控件, 或者用UI设计器直接拖拽.MFC太老了,好多年不用了.

共和县19170945532: MFC中的单文档程序,如何在界面上添加控件 -
闻虽头孢: 动态创建,调用控件的Create函数 比如 CEdit *pEdit=new CEdit; pEdit->Create(WS_VISIBLE|ES_LEFT,CRect(100,100,200,140),this,WM_USER+100);//或者使用CreateEx() pEdit->ShowWindow(SW_SHOW);

共和县19170945532: 在VC中MFC,新建对话框该如何建立控件啊?(比如static text , edit box等等) -
闻虽头孢: 可以在工具箱中点击对应的图标.然后在对话框上画出即可,如动态创建,如cedit,CEdit* pEdit = new CEdit; pEdit->Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER, CRect(10, 10, 100, 100), this, 1);

共和县19170945532: MFC如何动态创建多个edit控件 -
闻虽头孢: 不一定是要动态创建,只要实现这个效果就可以了.毕竟你要动态创建的话,你窗口的大小,以及创建出来的edit控件布局也很难做好.建议方法: 先在界面上布置好最大数量的edit控件,然后全部隐藏,窗口大小也可以适当缩小一部分,然后动态输入的时候,只要把edit控件显示出来就可以了

共和县19170945532: MFC动态创建控件的问题. -
闻虽头孢: 我的解决办法:GetDlgItem(IDC_DisplayAera)->GetClientRect(&m_Rect) this->ClientToScreen(m_Rect); //this表示相对于主窗口

共和县19170945532: mfc 动态创建按钮,如何理解MFC中的动态创建? -
闻虽头孢: MFC的动态创建是通过一些宏来实现的.主要过程是:1.在要实现动态创建的类(classA)的声明代码处加入一个静态的CRuntimeClass变量(b),并重载GetRuntimeClass()函数以返回b,并声明动态建立函数(C())(通过在类的声明处...

共和县19170945532: 关于MFC单文档中控件的添加与操作 -
闻虽头孢: 动态添加的控件的ID肯定是你动态创建控件的时候提供的, 添加文本就直接((CEdit *)GetDlgItem(int nID))->SetWindowText(CStrin & cstr);

共和县19170945532: MFC中怎么在状态栏中加入静态文本控件和编辑框控件? -
闻虽头孢: 动态创建 头文件中声明:CEdit* m_Edits; cpp文件的OnInitDialog函数中:m_Edits=new CEdit(50); for(int i=0;i<50;i++) { m_Edits[i].Create(……); } 程序执行结束时:for(int i=0;i<50;i++) { delete []m_Edits; } 不过这种情况只适合你所有的Edit控...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网