关于再问BitBtn按扭背景颜色如何改变的问题

pmes 2003-02-06 01:10:46
小弟最近搞一个程序
为把版面做得漂亮一点想把按扭的颜色变一下
本以为很简单,可是搞了两天也没搞好!
本人为了这个问题搜索了很多贴子
原来这个问题是比较难的!
很多人也讨论了这个问题如:
http://expert.csdn.net/Expert/topic/874/874294.xml?temp=.2922632

本来可以简单一点弄个BMP放在Glyph里就OK的

可是,我的程序BitBtn上的Caption 是根据数据库的内容变的,(即是不定的)

没可能生成这样的BMP吧?

真的没有方法把BitBtn 的“灰色”改为我喜欢的颜色吗?我愿意出500分求教!

...全文
489 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Taiji02 2003-02-24
  • 打赏
  • 举报
回复
回复人: jishiping(JSP 季世平) ( ) 信誉:131

他不是告诉你了吗?
killedkiss 2003-02-24
  • 打赏
  • 举报
回复
自己画:
HDC dc = GetDC(BitBtn1->Handle);
TCanvas * can = new TCanvas();
can->Handle = dc;
can->Pen->Color = clLime;
can->MoveTo(100,100);
can->LineTo(200,200) ;
can->Rectangle(Rect(0,0,BitBtn1->Width,BitBtn1->Height));
can->TextOutA(10,10,"name");
delete can;
ReleaseDC(BitBtn1->Handle,dc);
以上代码我已经调过
lingbin 2003-02-24
  • 打赏
  • 举报
回复
那个我下载看了一下,很难看得懂,我只想要改变按钮背景色的那一部分就可以了。
  • 打赏
  • 举报
回复
控件是 BCB 代码作的, 不是呆匪的, 放心没问题的 :-)
  • 打赏
  • 举报
回复
直接改BitBtn的颜色很费劲的, 不如重做一个可改变颜色的按钮
这里有完整的 C++ Builder 代码,包括按钮控件和演示程序
http://www.cppfans.com/d_vcl_files/ybidevcl103.asp
lingbin 2003-02-19
  • 打赏
  • 举报
回复
有没有BCB改变BitBtn背景色的源码啊,我急需,谢谢各位了。
shclhs 2003-02-08
  • 打赏
  • 举报
回复
如何在VC中改变控件的背景色编程资料及技术技巧

星软首页>>>>资料大全>>>> 如何在VC中改变控件的背景色
提要:

  在VC编程中要改变控件(诸如CView, CFrameWnd, or
CWnd等)的背景色可通过处理特定的消息来实现。但如果想改变按钮的颜色,就只能使用自绘制的按钮(也可以用位图按钮,此处未做说明)而不能通过OnCtlColor()改变。


正文:

  一、在一个MFC应用程序中,要改变控件的背景色可通过重载OnCtlColor()函数来实现。方法是在该函数中设置所需颜色后再返回一个画刷句柄便可重绘控件背景色。OnCtlColor()函数对于控件背景色的处理是通过捕捉相应的控件消息来实现的。常用的此类消息有:

CTLCOLOR_DLG 对话框

CTLCOLOR_EDIT 编辑框

CTLCOLOR_LISTBOX 列表框

CTLCOLOR_MSGBOX 消息框

CTLCOLOR_SCROLLBAR 滑动条

CTLCOLOR_STATIC 静态文本框、矩形等。


以下示例代码说明如何更改以上控件的背景色:

//CmyDialog.h定义

class CMyDialog : public Cdialog //派生自己的对话框类

{

……..

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(CMyDialog)

afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);

…….

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};


//CmyDialog.cpp 定义

……

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

switch (nCtlColor) {

case CTLCOLOR_EDIT:

case CTLCOLOR_MSGBOX:

case CTLCOLOR_DLG :

case CTLCOLOR_EDIT : //在此加入你想要改变背景色的控件消息

pDC->SetBkMode(TRANSPARENT);

HBRUSH B = CreateSolidBrush(COLOR); //COLOR是你想设置的颜色

return (HBRUSH) B;

default: //其他控件设置自己默认的颜色和背景刷.

return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

}}

说明:1、可分别处理以上消息以实现不同控件不同背景色。

2、此方法不适用于按纽控件。


二、通过定制来实现不同颜色按纽。

以下通过定制方形彩色按纽来说明:

第一步:派生出自己的按纽类。

//CcolorButton.h

class CColorButton : public CButton

{

DECLARE_DYNAMIC(CColorButton)

public:

CColorButton();

virtual ~CColorButton();


BOOL Attach(const UINT nID, CWnd* pParent,

const COLORREF BGColor = RGB(192, 123, 192), // 按纽的背景色

const COLORREF FGColor = RGB(1, 1, 1), // 文本颜色

);

protected:

virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS); //重定义虚拟函数DrawItem

void DrawFrame(CDC *DC, CRect R); //绘制按纽框

void DrawFilledRect(CDC *DC, CRect R, COLORREF color); //填充按纽框

void DrawLine(CDC *DC, CRect EndPoints, COLORREF color);

void DrawLine(CDC *DC, long left, long top, long right, long bottom,
COLORREF color);

void DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF
TextColor);

//绘制按纽上的文本


COLORREF GetFGColor() { return m_fg; }

COLORREF GetBGColor() { return m_bg; }

private:

COLORREF m_fg, m_bg;

};

#endif


第二步:定义各函数

//CcolorButton.cpp

……

// CColorButton

IMPLEMENT_DYNAMIC(CColorButton, CButton)

CColorButton::CColorButton()

{ }

CColorButton::~CColorButton()

{

}


//定义Attach()函数

BOOL CColorButton::Attach(const UINT nID, CWnd* pParent, const
COLORREF BGColor, const COLORREF FGColor)

{

if (!SubclassDlgItem(nID, pParent))

return FALSE;

m_fg = FGColor;

m_bg = BGColor;

return TRUE;

}


//重载DrawItem()

void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)

{

CDC* pDC = CDC::FromHandle(lpDIS->hDC);

UINT state = lpDIS->itemState;

CRect focusRect, btnRect;

focusRect.CopyRect(&lpDIS->rcItem); //按纽的选中虚线框

btnRect.CopyRect(&lpDIS->rcItem);


// 设置表示按纽被选中的虚线框

focusRect.left += 4;

focusRect.right -= 4;

focusRect.top += 4;

focusRect.bottom -= 4;


// 按纽标题

const int bufSize = 512;

TCHAR buffer[bufSize];

GetWindowText(buffer, bufSize);


// 绘制并标志按纽

DrawFilledRect(pDC, btnRect, GetBGColor());

DrawFrame(pDC, btnRect);

DrawButtonText(pDC, btnRect, buffer, GetFGColor());


// 如果按纽处于选中状态则在其上绘制选中虚线框

if (state & ODS_FOCUS) {

DrawFocusRect(lpDIS->hDC, (LPRECT)&focusRect);

}

}

void CColorButton::DrawFrame(CDC *DC, CRect R)

{ //绘制按纽,用户通过定制该函数可实现不同形状的按纽。

DrawLine(DC, R.left, R.top, R.right, R.top, RGB(255, 255, 255));

DrawLine(DC, R.left, R.top, R.left, R.bottom, RGB(255, 255, 255));

//以下绘制按纽的外围框线以使按纽有立体感

DrawLine(DC, R.left + 1, R.bottom - 1, R.right, R.bottom - 1, RGB(1,
1, 1));

//绘制按纽左框线和上框线

DrawLine(DC, R.right - 1, R.top + 1, R.right - 1, R.bottom, RGB(1,
1, 1));

//绘制按纽右框线和下框线

}

//用色彩填充按纽框

void CColorButton::DrawFilledRect(CDC *DC, CRect R, COLORREF color)

{

CBrush B;

B.CreateSolidBrush(color);

DC->FillRect(R, &B);

}

// DrawLine用于绘制按纽,其为多态函数

void CColorButton::DrawLine(CDC *DC, CRect EndPoints, COLORREF
color)

{

……

}

void CColorButton::DrawLine(CDC *DC, long left, long top, long
right, long bottom, COLORREF color)

{

……

}

//绘制按纽文本

void CColorButton::DrawButtonText(CDC *DC, CRect R, const char *Buf,
COLORREF TextColor)

{

COLORREF prevColor = DC->SetTextColor(TextColor);

DC->SetBkMode(TRANSPARENT);

DC->DrawText(Buf, strlen(Buf), R,
DT_CENTER|DT_VCENTER|DT_SINGLELINE);

DC->SetTextColor(prevColor);

}


第三步:引用定制类

定制任意对话框CColorDlg,在其上画一按键控件。ID为IDOK。

//CColorDlg.h

class CColorDlg : public CDialog

{

…..

// Implementation

protected:

CColorButton m_btnOK;

}


//CColorDlg.cpp

…….

BOOL CColorBtnSampleDlg::OnInitDialog()

{

CDialog::OnInitDialog();

…….

VERIFY(m_btnOK.Attach(IDOK, this, RED, BLUE, YELLOW));

…….

}

……

【关闭】


星软软件制作室
Copyright ?2002 All Rights Reserved
shclhs 2003-02-08
  • 打赏
  • 举报
回复
收藏先
jishiping 2003-02-07
  • 打赏
  • 举报
回复
重载TForm的虚拟函数WndProc就可以了。
class TForm1 : public TForm
{
__published: // IDE-managed Components
TBitBtn *BitBtn1;
TBitBtn *BitBtn2;
private: // User declarations
void __fastcall WndProc(TMessage &Message);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//-------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//-------------------------------------------------------------
void __fastcall TForm1::WndProc(TMessage &Message)
{
DRAWITEMSTRUCT* pdis;
TControlCanvas* Canvas;
Graphics::TBitmap* Bmp;

TForm::WndProc(Message);

pdis = (DRAWITEMSTRUCT*)Message.
LParam;
if (Message.Msg==WM_DRAWITEM &&
pdis->CtlType==ODT_BUTTON) {
Bmp = new Graphics::TBitmap;
Bmp->Width = pdis->rcItem.right;
Bmp->Height = pdis->rcItem.bottom;
Canvas = new TControlCanvas;
Canvas->Control = FindControl(
GetDlgItem(Handle, Message.
WParam));
Bmp->Canvas->CopyRect(pdis->rcItem,
Canvas, pdis->rcItem);
Bmp->TransparentMode = tmFixed;
Bmp->TransparentColor = clBtnFace;
Bmp->Transparent = true;
Canvas->Brush->Color = clBlue; //这儿设定底色
Canvas->Rectangle(pdis->rcItem);
Canvas->Draw(0, 0, Bmp);
delete Bmp; delete Canvas;
}
}
  • 打赏
  • 举报
回复
看看这个按钮 VCL 控件,含完整的源代码(纯粹的C++语言编写)和演示程序

http://www.cppfans.com/d_vcl_files/ybidevcl103.asp

可改变颜色,可鼠标感应变色(文字、背景),可鼠标感应动画,
可单个位图 Enabled=false 变色,可设置整个按钮为位图
位图可自动拉伸至按钮大小,可鼠标感应更换位图
可改变按钮风格: 普通,Flat, UltraFlat, 位图 等
Killmyself 2003-02-07
  • 打赏
  • 举报
回复
用不着放一张灰的,只要放一张图片,如果enable为false的话,他自己会变会的啊?你试试看
pmes 2003-02-07
  • 打赏
  • 举报
回复
to killmysel 我试过你的方法了!

这样好象有点取巧但也不很好看

我的程序有很多个这样的按扭,如果每个都这样不是很麻烦吗?

如果用panel的话我不如
在panel的mousedown里把BelevelOuter设成bvLowered
在mouseup 里把BelevelOuter设成bvRaised


我说的在enable=false里变灰是指图片变灰啊!
我看到bitbtn里如果把Kind设成bkCancel之类的
在Glyph里就会有两个图片,一个是灰的一个是不灰的

我这里只有不灰的图片,也想在Enable=false里使图片变灰
是否一定要在这张图片上加多一张灰的?
如果这样的话是不是比较麻烦啊?







Killmyself 2003-02-07
  • 打赏
  • 举报
回复
只要enable=false,图片不是自己会变灰吗??要让button变色很简单,你只要将speedbutton的flat属性设为true,这样按钮的颜色会随着背景色改变而改变,然后你拖一个pane在窗体,那个speedbutton在panel中,你把panel的长宽设的和speedbutton一样,颜色射成你要得颜色,speedbutton颜色也会变了,而且panel是突起的,这样那个speedbutton虽然是flat的,但看上去就像一般的按扭一样的。我可以给你程序的
pmes 2003-02-06
  • 打赏
  • 举报
回复
我想高手们都回乡了?

或者这个问题没有价值?

还是这个问题无解啊?不可能吧!
pmes 2003-02-06
  • 打赏
  • 举报
回复
请问netsys2怎样自画啊 有程序吗?

另外,如果我在Glyph里放BMP文件

怎样才能在Enabled=false的情况下使图片
变灰,我试过要两张图片才能实现的,能否只用一张彩色的图片就可实现

Enabled=false 时变灰?
Killmyself 2003-02-06
  • 打赏
  • 举报
回复
你把那个flat属性设为true,这样背景色可以自己变了,不过按牛类型变成了平坦型的了
jian9 2003-02-06
  • 打赏
  • 举报
回复
up
netsys2 2003-02-06
  • 打赏
  • 举报
回复
你定义自画不就得了,
大家用惯了BSskin和VCLskin,但是这个跟专业! 支持的开发语言 Borland Delphi 4/5/6 Borland Delphi 7 Borland Delphi 8 Borland Delphi 2005 Borland Delphi 2006 CodeGear Delphi 2007 支持的操作系统 Windows Vista Wndows 2000/XP/2003 Windows NT4.0 Windows Me Windows 98/98SE Windows 95 版本信息 当前版本:3.0 文件大小:24.9MB 更新日期:2006-12-6 下载次数:22670 软件概述 Skin++ For Delphi目前全面支持Delphi4、Delphi5、Delphi6、Delphi7、Delphi8、Delphi2005、Delphi2006。 迄今为止,Delphi支持4种类型的应用程序: 1、VCL Forms Application – Delphi for Win32 (该类型在Delphi4/5/6/7/2005/2006所有版本包含); 2、VCL Forms Application – Delphi for .Net (该类型在Delphi8/2005/2006中包含); 3、Windows Forms Application – C# Builder (该类型在Delphi2005/2006中包含); 4、Windows Forms Application – Delphi for .Net (该类型在Delphi8/2005/2006中包含)。 Skin++对以上4种Delphi程序类型做了全面的支持。 试用版本描述与运行截图 1.在本安装盘中,包含了Delphi的各个版本(D6,D7,D8,D2005,D2006)Skin++测试例子; 2.关于如何使用Skin++,请参考文档《Skin++ For Delphi [All Edition]使用帮助》; 3.要查询Skin++所有的接口,请参考文档《Skin++接口描述》; 4.本安装盘提供一套试用皮肤PixOS.ssk,正式版用户将获得网站上更多更精美的皮肤。并可获得定期更新; 5.Skin++正式版中提供强大的皮肤设计工具Skin++Builder。 该工具完成皮肤所有的设计工作,并可以全自动导入Windows主题、第三方主题; Skin++Builder使用详情请参考《Skin++Builder Help》; 6.案例说明: 我们以Delphi2006 VCL Win32的测试例子为例,描述其组成。 打开\Delphi 2006\VCL Forms Application - Delphi For Win32\目录中的MDIAPP.exe 该例子是一个MDI类型的程序。主窗口部分演示Skin++在MDI方面处理的各个细节。 如:主菜单条、主弹出菜单、系统菜单、工具条、状态条、MDI客户区、MDI子窗口、MDI子窗口最大化后等各个部分的换肤细节。 Skin++ 3.0 可以对皮肤进行动态的色调设置 这个功能可以使您的程序可以瞬间拥有N套色调的皮肤。 更改色调样例1: 我们分以下几个页面对Delphi的全部控件进行了演示: Buttons、Static、Controls with ScrollBar(带滚动条的控件)、Splitter、TabControls、TrackBar & Progress、Misc Controls、Dialog、DataControls 6.1 Buttons 该部分我们演示了Skin++对Delphi的各种类型的按钮进行的换肤支持, 包括BitBtn按钮、SpeedButton、Tbutton、CheckBox、RadioBox 在该部分,还演示了对按钮进行多风格的换肤效果,“Style 2”按钮和其他按钮不同,呈现了其特有样式。 这种效果一般用在网络电话、多媒体软件、网络聊天等需要同时支持多种按钮风格的地方。 每个按钮具有其固定的5中状态:正常、按下、高量、禁用、默认。在该窗体中演示了每种按钮的5中状态。 并且在Skin++ 3.0 中,支持Focus的效果。通过Tab或方向键可以看到焦点在每个按钮上移动。 6.2 Static 该部分演示了Skin++ 对Label、GroupBox、右键菜单、Panel、FlowPanel、GridPanel等控件的支持。 值得一提的是,Skin++对Label的支持是彻底,并且不像其他的换肤软件需要在窗体上放置一个
一共2个部分,分别下载。 用过BSskin或者VCLskin的哥们 支持的开发语言 Borland Delphi 4/5/6 Borland Delphi 7 Borland Delphi 8 Borland Delphi 2005 Borland Delphi 2006 CodeGear Delphi 2007 支持的操作系统 Windows Vista Wndows 2000/XP/2003 Windows NT4.0 Windows Me Windows 98/98SE Windows 95 版本信息 当前版本:3.0 文件大小:24.9MB 更新日期:2006-12-6 下载次数:22670 软件概述 Skin++ For Delphi目前全面支持Delphi4、Delphi5、Delphi6、Delphi7、Delphi8、Delphi2005、Delphi2006。 迄今为止,Delphi支持4种类型的应用程序: 1、VCL Forms Application – Delphi for Win32 (该类型在Delphi4/5/6/7/2005/2006所有版本包含); 2、VCL Forms Application – Delphi for .Net (该类型在Delphi8/2005/2006中包含); 3、Windows Forms Application – C# Builder (该类型在Delphi2005/2006中包含); 4、Windows Forms Application – Delphi for .Net (该类型在Delphi8/2005/2006中包含)。 Skin++对以上4种Delphi程序类型做了全面的支持。 试用版本描述与运行截图 1.在本安装盘中,包含了Delphi的各个版本(D6,D7,D8,D2005,D2006)Skin++测试例子; 2.关于如何使用Skin++,请参考文档《Skin++ For Delphi [All Edition]使用帮助》; 3.要查询Skin++所有的接口,请参考文档《Skin++接口描述》; 4.本安装盘提供一套试用皮肤PixOS.ssk,正式版用户将获得网站上更多更精美的皮肤。并可获得定期更新; 5.Skin++正式版中提供强大的皮肤设计工具Skin++Builder。 该工具完成皮肤所有的设计工作,并可以全自动导入Windows主题、第三方主题; Skin++Builder使用详情请参考《Skin++Builder Help》; 6.案例说明: 我们以Delphi2006 VCL Win32的测试例子为例,描述其组成。 打开\Delphi 2006\VCL Forms Application - Delphi For Win32\目录中的MDIAPP.exe 该例子是一个MDI类型的程序。主窗口部分演示Skin++在MDI方面处理的各个细节。 如:主菜单条、主弹出菜单、系统菜单、工具条、状态条、MDI客户区、MDI子窗口、MDI子窗口最大化后等各个部分的换肤细节。 Skin++ 3.0 可以对皮肤进行动态的色调设置 这个功能可以使您的程序可以瞬间拥有N套色调的皮肤。 更改色调样例1: 我们分以下几个页面对Delphi的全部控件进行了演示: Buttons、Static、Controls with ScrollBar(带滚动条的控件)、Splitter、TabControls、TrackBar & Progress、Misc Controls、Dialog、DataControls 6.1 Buttons 该部分我们演示了Skin++对Delphi的各种类型的按钮进行的换肤支持, 包括BitBtn按钮、SpeedButton、Tbutton、CheckBox、RadioBox 在该部分,还演示了对按钮进行多风格的换肤效果,“Style 2”按钮和其他按钮不同,呈现了其特有样式。 这种效果一般用在网络电话、多媒体软件、网络聊天等需要同时支持多种按钮风格的地方。 每个按钮具有其固定的5中状态:正常、按下、高量、禁用、默认。在该窗体中演示了每种按钮的5中状态。 并且在Skin++ 3.0 中,支持Focus的效果。通过Tab或方向键可以看到焦点在每个按钮上移动。 6.2 Static 该部分演示了Skin++ 对Label、GroupBox、右键菜单、Panel、FlowPanel、GridPanel等控件的支持。 值得一提的是,Skin++对Label的支持是彻底,并且不像其他的换肤软件需要在窗体

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧