vc动态创建控件_第1页
vc动态创建控件_第2页
vc动态创建控件_第3页
vc动态创建控件_第4页
vc动态创建控件_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VC 动态创建控件 动态控件是指在需要时由 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()函数创建,该函数原型如下: BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT 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 为除必须风格外的额外风格。 以下,调用该函数在 ONINIATIAL 中创建三个按钮,并指定第一个按钮为默认按钮, 按钮的 ID 在 STRING TABLE 中已预先设置好了: /CButton *p_MyBtn3;/为了在后面释放资源,改为在类头文件中声明为 /公有变量 p_MyBtn0=NewMyButton(ID_MYBTN1,CRect(10,20,60,40),BS_DEFPUSHBUTTO N); p_MyBtn1=NewMyButton(ID_MYBTN2,CRect(10,50,60,70),0); p_MyBtn2=NewMyButton(ID_MYBTN3,CRect(10,80,60,100),0); 二、动态控件的响应: 动态控件的响应函数不能用 ClassWizard 添加,只能手动添加。仍以上面的按钮为例, 我们制作按钮的单击响应函数。 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) /AFX_MSG_MAP END_MESSAGE_MAP() 手工添加时不要添加到 AFX_MSG_MAP 区间内,以防 ClassWizard 不能正常工作,如: BEGIN_MESSAGE_MAP(CTextEditorView, CFormView) /AFX_MSG_MAP(CTextEditorView) ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0) /AFX_MSG_MAP ON_BN_CLICKED(ID_MYBTN1, OnMybtn1) ON_BN_CLICKED(ID_MYBTN2, OnMybtn2) ON_BN_CLICKED(ID_MYBTN3, OnMybtn3) END_MESSAGE_MAP() 其中 ON_BN_CLICKED 是按钮单击消息。 2.在头文件中添加函数定义: 用 ClassWizard 添加函数时,会在头文件的 AFX_MSG 区间内添加函数定义,如: protected: /AFX_MSG(CTextEditorView) afx_msg void OnIconbut0(); /AFX_MSG DECLARE_MESSAGE_MAP() 我们模仿这种形式,只是把函数定义添加到 AFX_MSG 区间外就行了: protected: /AFX_MSG(CTextEditorView) afx_msg void OnIconbut0(); /AFX_MSG afx_msg void OnMybtn1(); afx_msg void OnMybtn2(); afx_msg void OnMybtn3(); DECLARE_MESSAGE_MAP() 3.编写消息响应函数: 以上是把消息和函数关联起来了,具体在单击按钮后应做的工作在函数中完成: void CTextEditorView:OnMybtn1() MessageBox( “哈!你单击了动态按钮。“ ); void CTextEditorView:OnMybtn2() void CTextEditorView:OnMybtn3() 除了按钮的响应函数外,你还可以用上面获得的指针访问按钮,如: 修改按钮的大小和位置:p_MyBtn0-MoveWindow(); 修改按钮文本:p_MyBtn0-SetWindowText(); 显示/隐藏按钮:p_MyBtn0-ShowWindow();等等。 三、回收资源: 由于动态控件对象是由 new 生成的,它不会被程序自动释放,所以需手工释放。在控 件不再使用时可以删除它,在对话框中的析构函数中销毁(析构函数没有手动添加): CMonthCalCtrlDlg:CMonthCalCtrlDlg() for(int i=0;ihDC ); m_ButRect = lpDrawItemStruct-rcItem; /获取按钮尺寸 if( m_strText.IsEmpty() ) GetWindowText( m_strText ); /获取按钮文本 int nSavedDC = pDC-SaveDC(); VERIFY( pDC ); DrawButton( pDC ); /绘制按钮 pDC-RestoreDC( nSavedDC ); DrawItem()函数是一个关键函数,按钮的绘制工作就在这里进行,它的作用相当于对话框中 的 OnPaint()函数和视图中的 OnDraw()函数。 这里我做了三项工作:获取按钮尺寸、获取按钮文本、绘制按钮。其中绘制工作在自定义 函数 DrawButton()中完成。以下就是绘制过程: void CMyButton:DrawButton(CDC *pDC) /调整状态 if( m_Style=3 ) m_Style = 0; if( GetStyle() /禁止状态 /根据状态调整边框颜色和文字颜色 COLORREF bColor, fColor; /bColor 为边框颜色,fColor 为文字颜色 switch( m_Style ) case 0: bColor = RGB(192,192,192); fColor = m_ForeColor; break; /正常按钮 case 1: bColor = RGB(255,255,255); fColor = m_ForeColor; break; /鼠标进入时按钮 case 2: bColor = RGB(192,192,192); fColor = m_ForeColor; break; /按下的按钮 case 3: bColor = m_BackColor; fColor = m_LockForeColor; break; /锁定的按钮 /绘制按钮背景 CBrush Brush; Brush.CreateSolidBrush( m_BackColor ); /背景刷 pDC-SelectObject( CPen Pen; Pen.CreatePen(PS_SOLID, 1, bColor ); pDC-SelectObject( pDC-RoundRect( /画圆角矩形 /绘制按钮按下时的边框 if( m_Style!=2 ) CRect Rect; Rect.SetRect( m_ButRect.left+2, m_ButRect.top+1, m_ButRect.right, m_ButRect.bottom ); pDC-DrawEdge( /画边框 /绘制按钮文字 pDC-SetTextColor( fColor ); /画文字 pDC-SetBkMode( TRANSPARENT ); pDC-DrawText( m_strText, /绘制拥有焦点按钮的虚线框 if( GetFocus()=this ) CRect Rect; Rect.SetRect( m_ButRect.left+3, m_ButRect.top+2, m_ButRect.right-3, m_ButRect.bottom- 2 ); pDC-DrawFocusRect( /画拥有焦点的虚线框 变量 m_Style 表征当前按钮状态,它的取值为:0- 正常, 1-当前,2-按下,3- 锁定。不同状 态下按钮的边框颜色和文字颜色有所不同。m_Style 的值在鼠标响应函数中进行修改。 绘制工作主要利用 CDC 类的绘图函数完成,主要注意在 m_Style 不同取值下表现出来的 差别。 void CMyButton:onMouseMove(UINT nFlags, CPoint point) if( !b_InRect | GetCapture()!=this ) /鼠标进入按钮 b_InRect = true; /设置进入标志 SetCapture(); /捕获鼠标 m_Style = 1; /设置按钮状态 Invalidate(); /重绘按钮 else if ( !m_ButRect.PtInRect(point) ) /鼠标离开按钮 b_InRect = false; /清除进入标志 ReleaseCapture(); /释放捕获的鼠标 m_Style = 0; /设置按钮状态 Invalidate(); /重绘按钮 CButton:onMouseMove(nFlags, point); onMouseMove()函数是鼠标移动消息函数,用于判定当前鼠标指针是否在按钮上。b_InRect 是个标志,为 true 表示鼠标指针进入了按钮区域,此时要捕获鼠标,让鼠标命令传送给按 钮。当鼠标指针离开按钮时,要清除 b_InRect 标志,并且释放捕获的鼠标,让其它窗口可 以接收鼠标命令。 Invalidate()函数用于更新按钮,它会自动调用 DrawItem()函数重新绘制按钮。 设置条件的目的是仅在鼠标指针进入按钮和离开按钮时更新按钮,这样可以防止鼠标在按 钮上移动时发生闪烁。 void CMyButton:OnLButtonDown(UINT nFlags, CPoint point) m_Style = 2; Invalidate(); /重绘按钮 CButton:OnLButtonDown(nFlags, point); OnLButtonDown()函数是单击鼠标左键时的消息函数。这里只是重新绘制按钮,具体的单击 响应应该在拥有按钮的对话框或视图中进行。 void CMyButton:OnLButtonUp(UINT nFlags, CPoint point) m_Style = 1; Invalidate(); /重绘按钮 CButton:OnLButtonUp(nFlags, point); OnLButtonUp()函数是单击鼠标左键后弹起时的消息函数。这里也只是重绘按钮,这样能使 按钮在按下和弹起时有所不同,使按钮看上去有动态效果。 接口函数是用 CMyButton 类 定义的按钮修改颜色、字体和按钮文字的接口,由以下函数 组成: /设置按钮文本 void CMyButton:SetText(CString str) m_strText = _T(“); SetWindowText(str); /设置文本颜色 void CMyButton:SetForeColor(COLORREF color) m_ForeColor = color; Invalidate(); /设置背景颜色 void CMyButton:SetBkColor(COLORREF color) m_BackColor = color; Invalidate(); /设置字体(字体高度、字体名) void CMyButton:SetTextFont(int FontHight,LPCTSTR FontName) if ( p_Font ) delete p_Font; /删除旧字体 p_Font = new CFont; p_Font-CreatePointFont( FontHight, FontName ); /创建新字体 SetFont( p_Font ); /设置字体 由于新字体由 new 生成,必须显式回收,这项工作可以在 CMyButton 类 的析构函数中进 行: CMyButton:CMyButton() if ( p_Font ) delete p_Font; /删除字体 这样一个可设置颜色、字体的按钮类就做好了。使用时,先在对话框中放置好按钮,再用 ClassWizard 为按钮添加控制变量,并且将变量的类型设置为 CMyButton。之后,可以用 该变量调用接口函数设置按钮颜色和字体。 以上测试过,太复杂。又生一类。 / 方法二: 添加 dlg 类的 WM_DRAWITEM 消息处理函数 void CBtncolorDlg:OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) / TODO: Add your message handler code here and/or call default if(nIDCtl=IDC_BUTTON1) /checking for the button CDC dc; RECT rect; dc.Attach(lpDrawItemStru

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论