| 网站首页 | JAVA文章 | AppServers | Web开发 | 应用开发 | 资源下载 | 论坛
    想学好编程,学好外语很重要  [enadd  2006年12月25日]        
设为首页 加入收藏 联系站长
您现在的位置: 编程笔记网 >> 应用开发 >> vc >> vc控件 >> 文章正文
自己动手做按钮        【字体:
自己动手做按钮
作者:-    文章来源:-    点击数:    更新时间:2006-4-20

下载本文所附源代码

现在网上发布的自制按钮很多,实际上其制作方法都很类似,以下给出几个关键步骤,具体细节你大可以发挥你的想象力,制作出你想要的各种按钮。

一、用ClassWizard生成一个新类,名字假设起为CMyButton,基类选为CButton;

二、在新类中用ClassWizard添加函数:PreSubclassWindow()、DrawItem()、OnMouseMove()、OnLButtonDown()、OnLButtonUp();

① PreSubclassWindow()函数在绘制按钮前执行,在这里我只做了一个工作:
void CMyButton::PreSubclassWindow()
{
CButton::PreSubclassWindow();
ModifyStyle( 0, BS_OWNERDRAW ); //设置按钮属性为自画式
}
这样你就无需在放置按钮时非得设置按钮属性为“OwnerDraw”了。

② DrawItem()函数是最重要的函数,所有自己绘制按钮的工作都在这里进行,它的作用类似于View类中的OnDraw()函数。
例:
void CMyButton::DrawItem(LPDRAW99vEMSTRUCT lpDrawItemStruct)
{
CDC *pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
m_ButRect = lpDrawItemStruct->rcItem; //获取按钮尺寸
GetWindowText( m_strText ); //获取按钮文本
CPoint m_ptCentre = m_ButRect.CenterPoint(); //求按钮中心点
CSize Extent = pDC->GetTextExtent( m_strText ); //求文本尺寸
m_textPt = CPoint( m_ptCentre.x - Extent.cx/2,
m_ptCentre.y - Extent.cy/2 ); //设置文本坐标
int nSavedDC = pDC->SaveDC();
VERIFY( pDC );

if( !(::GetWindowLong(m_hWnd,GWL_STYLE) & WS_DISABLED) )
{
if( !b_Flag )
{
NormalButton( pDC ); //画正常按钮
}
else
{
PassButton( pDC ); //画鼠标经过时的按钮
}
}
else
{
LockButton( pDC ); //画锁定的按钮
}

pDC->RestoreDC( nSavedDC );
}
其中的变量在CMyButton.h中定义:
BOOL b_Flag; //按钮状态(false-正常,true-当前)
BOOL b_InRect; //鼠标进入标志
CString m_strText; //按钮文字
COLORREF m_ForeColor; //文本颜色
COLORREF m_BkColor; //背景色
COLORREF m_LockForeColor; //锁定按钮的文字颜色
CRect m_ButRect; //按钮尺寸
CPoint m_textPt; //文字坐标(左上角)
具体绘制按钮的函数是另外定义的,只要你会用VC绘图,就可随心所欲的画出你想要的任何形态按钮,这里我定义了三种情况的按钮:
绘制正常状态下的按钮:
void CMyButton::NormalButton(CDC *pDC)
{
……
}
绘制鼠标进入按钮区域后的按钮:
void CMyButton::PassButton(CDC *pDC)
{
……
}
绘制锁定(变灰)状态下的按钮:
void CMyButton::LockButton(CDC *pDC)
{
……
}
有些人还希望绘制“鼠标按下时的按钮”、“拥有焦点的按钮”使效果更好,可在相应位置做如下修改:
int b_Flag; //0-正常、1-鼠标进入、2-鼠标按下、3-拥有焦点

switch(b_Flag)
{
case 0:画正常按钮;break;
case 1:画鼠标进入后的按钮;break;
case 2:画鼠标按下后的按钮;break;
case 3:画拥有焦点的按钮;break;
}
而b_Flag的值在鼠标消息函数中进行修改。

[1] [2] 下一页  

文章录入:enadd    责任编辑:enadd 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • VC控件 TreeCtrl 与 ListCtr…

  • CListCtrl 使用演示的例子

  • VC通用控件编程之CList控件

  • VC++在应用程序中使用标准窗…

  • 用ATL和MFC来创建ActiveX控件

  • 动态控件的生成与响应

  • 可设置颜色的静态控件、单选…

  • 支持数据项查找功能的树控制…

  • VC通用控件编程之CImageList…

  • 做一个可编辑的表格控件

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |