VC程序中实现控件的动态生成与响应

2016-02-19 16:21 30 1 收藏

今天图老师小编要向大家分享个VC程序中实现控件的动态生成与响应教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - 编程语言 】

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

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

CButton *p_MyBut = new CButton();

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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,按钮文字为“动态按钮”的下压式按钮。

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

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已预先设置好了:

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添加,只能手动添加。仍以上面的按钮为例,我们制作按钮的单击响应函数。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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

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

BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)
//{{AFX_MSG_MAP(CTextEditorView)
ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)
/

来源:http://www.tulaoshi.com/n/20160219/1611773.html

延伸阅读
这个例子类似于 Windows 的资源管理器,程序运行界面如下图一所示: 主要用到的类有: CListCtrl,CTreeCtrl,CImageList,CFileFind 和函数SHGetFileInfo() 简述步骤如下: 1、增加 TreeCtrl 的 TVS_HASBUTTONS,TVS_HASLINES、TVS_LINESATROOT Style,代码如下: DWORD dwStyle = GetWindowLong(m_tree.m_hWnd,GWL_ST...
VC控件 TreeCtrl 与 ListCtrl 演示 作者:兰州大学现物系 王景生 下载源代码 这个例子类似于 Windows 的资源管理器,程序运行界面如图一所示: 图一 主要用到的类有: CListCtrl,CTreeCtrl,CImageList,CFileFind 和函数SHGetFileInfo() ...
    在很多情况下,我们需要将当前运行的程序重新运行;此时我们就必须在程序关闭后立即重新运行程序,形成新的进程; 实例代码:     1、重启按钮事件中添加代码:     g_bIsRunAgain=true;//控制是否重新运行的变量     this-SendMessage(WM_CLOSE);     2、在On...
标签: vb
By Steven Smith from aspalliance.com Yknow, theres this really cool library in .NET for dynamically creating images on the fly. However, this article has nothing to do with that, so if thats what youre looking for, stop now. What this article is about is very simple -- how to use a single line of code (via a compo...
Progress控件能让人们感受到一个应用程序执行的进度,在很多应用程序中都能用到它,但通常只支持在单任务中,在Windows98/NT中文操作系统下,在VC++6.0环境下,利用线程编制了一个非常小巧的应用程序来实现Progress控件的使用。它可以支持多线程,使用起来很方便。以下是这个应用程序的源代码: //ProgressDialog.h class CProgressD...

经验教程

617

收藏

74
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部