MFC改变按钮颜色

yuanfang4123 2011-05-23 07:43:24
想把窗口中按钮的颜色设置为透明,在OnCtlColor函数中写了如下语句,但是按钮的颜色还是系统默认的灰色,不是我设的背景色(红色),请问这是什么原因。要使按钮颜色为透明,应该怎么做?

if(nCtlColor == CTLCOLOR_BTN)
{
pDC->SetBkMode(TRANSPARENT);
return mybrush;
}

也试过如下语句,也不起作用
if(nCtlColor == IDOK)
{
pDC->SetBkMode(TRANSPARENT);
return mybrush;
}
...全文
4733 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
dragon000000 2012-11-02
  • 打赏
  • 举报
回复
能不能改变多个按钮的颜色
laoAyang 2011-08-04
  • 打赏
  • 举报
回复
谢谢各位,我用上了、
向立天 2011-06-14
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
cdqhei 2011-05-25
  • 打赏
  • 举报
回复
将背景区域重绘到当前就行了
kiloopt 2011-05-25
  • 打赏
  • 举报
回复
刚写了一篇关于clayui的教程,在对话框上创建一个按钮,可以改变颜色,透明度等,你可以看看:http://blog.csdn.net/clayui/archive/2011/05/24/6443717.aspx
Mdesigner 2011-05-25
  • 打赏
  • 举报
回复
使按钮透明在OnCtlColor中
switch(pWnd->GetDlgCtrlID())
{
case IDC_MYID:
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
break;

default:
break;
}
coolsy1989 2011-05-25
  • 打赏
  • 举报
回复
按钮是比较特殊的,建议看孙鑫的vc,有绘图那一章,他是要重新定义一个类,然后重载DrawItem()这个虚函数来实现的
cdqhei 2011-05-25
  • 打赏
  • 举报
回复
CButtonST类很强大的,还是用它吧
零零发 2011-05-24
  • 打赏
  • 举报
回复
用CButtonST类吧,网上很多下载,觉得蛮好的
psbeond 2011-05-24
  • 打赏
  • 举报
回复
并没有所有的透明按钮。正如4楼所说的,要把父窗口中,被按钮覆盖掉的区域拿出来,画到按钮上,达到“透明”的效果。
ANTRK 2011-05-24
  • 打赏
  • 举报
回复
这个只能改变按钮字体颜色,不好意思 代码复制错了,下边这个可以改变按钮背景色和字体颜色

void CTestBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
UINT uStyle = BS_DEFPUSHBUTTON ;//DFCS_BUTTONPUSH;

// This code only works with buttons.
ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);

// If drawing selected, add the pushed style to DrawFrameControl.
if (lpDrawItemStruct->itemState & ODS_SELECTED)
uStyle |= DFCS_PUSHED;

// Draw the button frame.
::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem,
DFC_BUTTON, uStyle);

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

// Get the button's text.
CString strText;
GetWindowText(strText);

// Draw the button text using the text color red.
CBrush B;
CRect rect;
CRect focusRect;
focusRect.CopyRect(&lpDrawItemStruct->rcItem);
DrawFocusRect(lpDrawItemStruct->hDC, (LPRECT)&focusRect);
focusRect.left += 4;
focusRect.right -= 4;
focusRect.top += 4;
focusRect.bottom -= 4;

rect.CopyRect(&lpDrawItemStruct->rcItem);
pDC->Draw3dRect(rect, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHILIGHT));
B.CreateSolidBrush(RGB(0,255,0));//设置按钮背景颜色
::FillRect(lpDrawItemStruct->hDC,&rect, (HBRUSH)B.m_hObject);
::SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);
COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255,0,0));//设置字体颜色
::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),
&lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
::SetTextColor(lpDrawItemStruct->hDC, crOldColor);
}
ANTRK 2011-05-24
  • 打赏
  • 举报
回复
对于改变按钮颜色,需要重载按钮类的虚函数DrawItem,所以你上边的操作是不行的


我试过这个方法,希望对你有帮助

1、新建一个类CTestBtn(基于CButton类)
2、在CTButton类上添加虚函数,选择DrawItem,添加虚函数,添加代码如下:
void CTestBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
UINT uStyle = DFCS_BUTTONPUSH;

// This code only works with buttons.
ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);

// If drawing selected, add the pushed style to DrawFrameControl.
if (lpDrawItemStruct->itemState & ODS_SELECTED)
uStyle |= DFCS_PUSHED;

// Draw the button frame.
::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem,
DFC_BUTTON, uStyle);

// Get the button's text.
CString strText;
GetWindowText(strText);

// Draw the button text using the text color red.
COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255,0,0));//这里设置你要的按钮颜色
::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),
&lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
::SetTextColor(lpDrawItemStruct->hDC, crOldColor);

}

3、 把你要设置颜色的按钮 关联一个CTestBtn的变量m_btn1,m_btn1当然是添加到你的对话框类中了。
在你的对话框类头文件中 添加#include "TestBtn.h"
4、将你的按钮属性改一下,Style中的Owner draw勾选上(必须有这步,选择后支持自己改颜色。否则白扯)
5、运行成功

vcf_reader 2011-05-24
  • 打赏
  • 举报
回复
SetBkMode 用于设置在“设备”上输出文字的背景色。
而你想要设置的却是“窗口”的背景色,按钮是窗口的一种。
kobe198702 2011-05-24
  • 打赏
  • 举报
回复
怎么使 BUTTON尺寸变大呢?求教。
龙行天下之Sky 2011-05-23
  • 打赏
  • 举报
回复
自己继承一个按钮类,通过按钮子类化可以实现
疯狂-的-蜗牛 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 abxialiang 的回复:]
要制作透明按钮,需要把按钮所在的父窗口区域图片获取过来,然后画在按钮上,这样按钮就与背景色一至,从而达到"透明"的效果,当然你可以直接去网上找现成的实例,这种例子非常之多.
[/Quote]
这位说的不错,我以前也是这样做的,实现所谓的“透明”、
abxialiang 2011-05-23
  • 打赏
  • 举报
回复
要制作透明按钮,需要把按钮所在的父窗口区域图片获取过来,然后画在按钮上,这样按钮就与背景色一至,从而达到"透明"的效果,当然你可以直接去网上找现成的实例,这种例子非常之多.
Eleven 2011-05-23
  • 打赏
  • 举报
回复
SetBkMode()是使文字透明,不是按钮窗体透明
量子 2011-05-23
  • 打赏
  • 举报
回复
SetBkMode(TRANSPARENT); 的作用是设置DC上显示的文字背景色是透明的,而不是你想要的透明效果。要实现你的透明效果,需要自己通过算法实现。具体实现方法可以看一些游戏设计方面透明位图算法的介绍

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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