自定义按钮类

原创 2012年03月29日 12:03:43

 

1.       新建一个MFC类,名称为CCustomButton,父类CButton

2.       构造函数中初始化按钮字体

      CCustomButton::CCustomButton()

{

       Font.CreateFont( 12, 0, 0, 0, FW_HEAVY, 0, 0, 0, ANSI_CHARSET, \

              OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, \

              VARIABLE_PITCH | FF_SWISS, "MS Sans Serif" );

}

3.       改写按钮类的DrawItem虚方法

void CCustomButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

{

       // TODO: Add your code to draw the specified item

              if (lpDrawItemStruct->CtlType==ODT_BUTTON )

       {

              CDC *pBtnDC = CDC::FromHandle(lpDrawItemStruct->hDC);       //获取按钮关联的DC

       //获取按钮的绘画区域

       CRect BtnRC = lpDrawItemStruct->rcItem;

       //获取按钮的当前状态

       int BtnState = lpDrawItemStruct->itemState;

      

       //获取按钮文本

       CString BtnText;

       GetWindowText(BtnText);

 

       CBrush           Brush;

       CBrush           *pOldBrush;

       CPoint           PT(2,2);

      

       pBtnDC->SelectObject(&Font);

       pBtnDC->SetTextColor( RGB( 255, 255, 250 ) );

       //如果按钮获得焦点或按钮被选中

       if (BtnState & ODS_SELECTED || BtnState & ODS_FOCUS)

       {

              Brush.CreateSolidBrush( RGB( 160, 160, 160 ) );

              pBtnDC->SetTextColor( RGB( 50, 50, 250 ) );

       }

       else

       {

              CBitmap bmp;

              bmp.LoadBitmap(IDB_BITMAP1);

              Brush.CreatePatternBrush(&bmp);

       }

       pOldBrush = pBtnDC->SelectObject( &Brush );

       pBtnDC->RoundRect(&BtnRC, PT);

 

       pBtnDC->SetBkMode(TRANSPARENT);

       pBtnDC->DrawText(BtnText, &BtnRC, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

       pBtnDC->DeleteDC();  

       Brush.DeleteObject();

       }    

}

4.       设置按钮的Owner Draw属性为True.这时按钮没有回车响应,需要截获回车键按下和抬起的消息响应

BOOL CCustomButton::PreTranslateMessage(MSG* pMsg)

{

       if(pMsg->hwnd==this->GetSafeHwnd()&&pMsg->message==WM_KEYDOWN && pMsg->wParam==13)

       {

              pMsg->lParam=0;

              pMsg->message=WM_LBUTTONDOWN;

       }

       if(pMsg->hwnd==this->GetSafeHwnd()&&pMsg->message==WM_KEYUP && pMsg->wParam==13)

       {

              pMsg->lParam=0;

              pMsg->message=WM_LBUTTONUP;

       }

       return CButton::PreTranslateMessage(pMsg);

}

5.       在需要重绘按钮的对话框中引用自定义类,然后CCustomButton m_BTLogin;

6.            CDialog::DoDataExchange(pDX);

       //{{AFX_DATA_MAP(CLogin)后加入DDX_Control(pDX, IDC_LOGIN, m_BTLogin);

 

相关文章推荐

自定义4方向按钮-封装类

  • 2015年08月06日 08:59
  • 3KB
  • 下载

02 自定义按钮类和窗口嵌套

1.实现自定义的按钮类: QPushButton可以设置图标: void setIcon(const QIcon & icon)如按钮btn对象: btn.setIcon(QIcon...
  • jklinux
  • jklinux
  • 2017年05月09日 17:51
  • 251

一个MFC的自定义按钮类

  • 2012年11月29日 11:17
  • 8KB
  • 下载

Android自定义Dialog类,并在Activity中实现按钮监听

实际开发中,经常会用到Dialog,比如退出时候会弹出是否退出,或者还有一些编辑框也会用Dialog实现,效果图如下: 开发中遇到的问题无非在于如果在Activity中监听这个Dialog中实现...

Android 自定义Dialog类,并在Activity中实现按钮监听事件

实际开发中,经常会用到Dialog,比如退出时候会弹出是否退出,或者还有一些编辑框也会用Dialog实现,效果图如下: 开发中遇到的问题无非在于如果在Activity中监听这个Dialo...
  • jdsjlzx
  • jdsjlzx
  • 2015年04月16日 17:06
  • 3345

QT 点击自定义QDialog类"确定"按钮 , 模态框立刻关闭 , 之后又做空值检查问题解决

问题:点击自定义类的"确定"按钮 , 模态框立刻关闭 , 之后又做空值检查(弹框提示) 解决:点击自定义类的"确定"按钮 ,先空值检查,再关闭模态框 QDialog::Accepted值生成及传递 Q...

自定义Dialog(图片,文字说明,单选按钮)----类ListPreference实现(2)

在上一篇 中,只是实现一个perference,但是点击以后没有响应事件,我们可以定义一个一个Dialog,Dialog选项里面需要有图片,文字说明,后面还需要一个单选按钮,所以自己写了一个demo,...

uisegmentedcontrol类重写,自定义按钮和背景颜色

。h文件 #import @interface MCSegmentedControl : UISegmentedControl { NSMutableArray *_items; ...
  • ant1239
  • ant1239
  • 2012年07月27日 11:13
  • 7733
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义按钮类
举报原因:
原因补充:

(最多只允许输入30个字)