Push Button背景色修改修正版(完整工程)

原创 2004年01月13日 10:09:00

关于Push Button,已经存在两篇比较经典的文章:

http://www.csdn.net/Develop/Read_Article.asp?Id=11690

http://www.csdn.net/Develop/Read_Article.asp?Id=8432

(第二篇或http://www.csdn.net/Develop/Read_Article.asp?Id=11689,内容一样)

但是这两篇都不很完美,

第一篇里有很多错误,不进行修改没办法编译,不适合初学者,特别是得出的按钮没有文字,而第二篇只能说是一个伪代码,只是一个思路,鉴于此,特别做出一个完整的示例及代码):

 

首先,仍然是从CButton继承一个新类:CMyButton

头文件:

#if !defined(AFX_MYBUTTON_H__35978C4D_94AF_40FD_A82C_6DB1847775D7__INCLUDED_)
#define AFX_MYBUTTON_H__35978C4D_94AF_40FD_A82C_6DB1847775D7__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MyButton.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CMyButton window

class CMyButton : public CButton
{
// Construction
//DECLARE_DYNAMIC(CMyButton)

public:
 CMyButton();
    virtual ~CMyButton();
// Attributes
public:
// Operations
public:

// Overrides
 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CMyButton)
 public:
 virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);//重载此函数
 //}}AFX_VIRTUAL

// Implementation
public:
 //{{AFX_MSG(CMyButton)
  // NOTE - the ClassWizard will add and remove member functions here.
 //}}AFX_MSG

 DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MYBUTTON_H__35978C4D_94AF_40FD_A82C_6DB1847775D7__INCLUDED_)

CPP文件:

// MyButton.cpp : implementation file
//

#include "stdafx.h"
#include "editor.h"
#include "MyButton.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyButton

CMyButton::CMyButton()
{
}

CMyButton::~CMyButton()
{
}


BEGIN_MESSAGE_MAP(CMyButton, CButton)
 //{{AFX_MSG_MAP(CMyButton)
  // NOTE - the ClassWizard will add and remove mapping macros here.
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyButton message handlers

 


void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 // TODO: Add your code to draw the specified item
        CDC dc;
        dc.Attach(lpDrawItemStruct->hDC);//得到绘制的设备环境CDC
  VERIFY(lpDrawItemStruct->CtlType==ODT_BUTTON);


  // 得当Button上文字,这里的步骤是:1,先得到在资源里编辑的按钮的文字,然后将此文字重新绘制到按钮上,同时将此文字的背景色设为透明,这样,按钮上仅会显示文字

  const int bufSize = 512;
  TCHAR buffer[bufSize];
  GetWindowText(buffer, bufSize);

 int size=strlen(buffer);   //得到长度
  DrawText(lpDrawItemStruct->hDC,buffer,size,&lpDrawItemStruct->rcItem,DT_VCENTER|DT_SINGLELINE|DT_TABSTOP);   //绘制文字
        SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);   //透明


  if (lpDrawItemStruct->itemAction &ODA_DRAWENTIRE)  //当按下按钮时的处理
  {//
   //重绘整个控制
   CBrush brush(RGB(255,0,0));              //按下去的颜色设为红色
   dc.FillRect(&(lpDrawItemStruct->rcItem),&brush);//
   DrawText(lpDrawItemStruct->hDC,buffer,size,&lpDrawItemStruct->rcItem,DT_VCENTER|DT_SINGLELINE|DT_TABSTOP);   //因为这里进行了重绘,所
   SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);      //以文字也要重绘
  }
  else                                       //当按钮弹起时
  {
    CBrush brush(RGB(255,255,0));      //弹起进颜色设为黄色
   dc.FillRect(&(lpDrawItemStruct->rcItem),&brush);//
   DrawText(lpDrawItemStruct->hDC,buffer,size,&lpDrawItemStruct->rcItem,DT_VCENTER|DT_SINGLELINE|DT_TABSTOP);    //同上,进行重绘文字
   SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);
  }

  if ((lpDrawItemStruct->itemState &ODS_SELECTED)&&(lpDrawItemStruct->itemAction &(ODA_SELECT| ODA_DRAWENTIRE)))
  {//选中了本控件,高亮边框
            COLORREF fc=RGB(255-GetRValue(m_color),255-GetGValue(m_color), 255-GetBValue(m_color));//
   CBrush brush(fc);//
   dc.FrameRect(&(lpDrawItemStruct->rcItem),&brush);//

  }
  if (!(lpDrawItemStruct->itemState & ODS_SELECTED) &&(lpDrawItemStruct->itemAction & ODA_SELECT))
  {
   //控制的选中状态结束,去掉边框
   CBrush brush(RGB(0,255,0));
   dc.FrameRect(&lpDrawItemStruct->rcItem,&brush);//

  }
  dc.Detach();//
}

 

新类建好好,接下来就好办了,

新建一个对话框,新建一个按钮:IDC_TEST,

同时,用类向导为其添加一个成员变量:CMyButton m_test

(记得在testDlg.h里要加上:#include "mybutton.h")

然后在testDlg.cpp里的OnInitDialog()里加上:

 m_test.SubclassDlgItem(IDC_TEST,this);

同时,为按钮添加函数OnTest()

void CTestDlg::OnTest()
{
    MessageBox("OK"); 
}

运行一下,OK了!

由于公司FTP无法连接,

如果需要代码工程请跟我联系:

zhucde@163.com

MSN: zhucde@hotmail.com

 


 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

Eclipse 工作目录、控制台背景颜色的更改

转载请注明本地址, 经常用Eclipse的朋友都应该清楚,Eclipse的白背景不知道晃瞎了多少双眼。我也到网上找了各种更改背景的方法,但是都是只有更改输入区的背景颜色的,工作目录,控制台,Logca...
  • u013173247
  • u013173247
  • 2014年12月02日 11:54
  • 4778

修改CButton类按钮背景颜色和文字颜色

要想修改CButton类按钮背景颜色和文字颜色,必须利用自绘方法对按钮进行重新绘制。这可以通过定义一个以CButton为基类的新按钮类来实现。以下为具体的实现方法: 方法一: 加入一个新类...
  • ldkcumt
  • ldkcumt
  • 2015年09月22日 13:41
  • 4767

如何更改MFC按钮的背景色

今天打算给自己写的工程上点色。但是在给按钮上色的时候出了点问题。在网上找的方法基本上都不管用。说得跟真的一样,各种OnCtrlColor()和OnEraseBkground(),各种技术帝的方法看起来...
  • dongsoso
  • dongsoso
  • 2013年10月27日 10:40
  • 1695

改变Push Button背景色

在Windows中Edit,StaticBox的背景色都可以通过处理WM_CTLCOLOR消息来改变,但Push Button却不行。 唯一的方法是使用OwnerDraw风格的按钮。本文讲述的方法是...
  • playboy1
  • playboy1
  • 2011年10月19日 08:47
  • 264

WPF textblock搜索关键字,并修改字体格式(颜色和背景色),源工程代码

  • 2017年08月03日 11:07
  • 97KB
  • 下载

Windows Phone 7 Button修改前景色和背景色的问题和解决办法

private void button1_Click(object sender, RoutedEventArgs e) {     button1.Background = new SolidC...
  • L_serein
  • L_serein
  • 2012年12月16日 18:41
  • 1799

C++重绘button按钮控件,支持设置背景色,边框色,扁平化

  • 2017年08月04日 11:57
  • 2KB
  • 下载

解决iOS8以上系统下app底部UITabBarItem上自定义的背景色和图片,在首次启动或push之后再pop回去会变成系统默认颜色-蓝色问题

场景:         在ios8以下系统下正常显示,在ios8以上系统底部UITabBarItem会变成默认蓝色,遮挡图片上的字, 首先,在ios8以下没问题是因为在iOS8以下没问题是以下方水...
  • lgm252008
  • lgm252008
  • 2014年11月19日 17:18
  • 5584

MFC Button控件的背景色

一个继承于CButton的按钮控件类,实现Button背景色与文字的共存与改变,可以自行设计背景色。 头文件:CMyButton.h 如下: #pragma once #include "af...
  • nolatin
  • nolatin
  • 2014年02月06日 14:01
  • 1757

MFC Button控件的背景色

一个继承于CButton的按钮控件类,实现Button背景色与文字的共存与改变,可以自行设计背景色。   头文件:CMyButton.h 如下: #pragma once #inc...
  • dongsoso
  • dongsoso
  • 2013年10月27日 10:54
  • 1106
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Push Button背景色修改修正版(完整工程)
举报原因:
原因补充:

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