button改变背景色的问题

anne82820 2009-08-21 02:04:23
我CButton派生一个类,加载 DrawItem ,自己在里面写代码的

if(m_edit1 < 0.1) //不超限
{
button1按钮为绿色
}
else //超限
{
button按钮为红色
}

为什么当数据超限还显示绿色,只有当我单击一下按钮,按钮的颜色才显示红色,我要实现的是当数据超限后按钮自己直接变为红色
请各位给我看看哦,在线等

...全文
127 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dushuchen 2009-08-23
  • 打赏
  • 举报
回复
我查了一下,是EN_CHANGE通知吗
响应WM_COMMAND,
(WORD)wParam >> 16;(高位字存放通知吗)
判定wParam是否为EN_CHANGE
若是,UpdateDate();
判断m_edit是否超限
然后设定按钮颜色

迎刃而解
dushuchen 2009-08-23
  • 打赏
  • 举报
回复
当edit控件里的内容变了 会向主窗口发送一消息(具体是什么消息忘了)
你响应它 在处理函数里首先
updatedata();

判断m_edit是否超限
然后设定按钮颜色(发消息或用函数)
雪影 2009-08-23
  • 打赏
  • 举报
回复
楼主干嘛自己写一个CButton类,有现成的类可以使用。
你搜索一个CButtonST,完全能满足你的要求
ranweiwu 2009-08-23
  • 打赏
  • 举报
回复
重载button,然后自己设置

void CXPButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
//从lpDrawItemStruct获取控件的相关信息
CRect rect = lpDrawItemStruct->rcItem;
CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
int nSaveDC=pDC->SaveDC();
UINT state = lpDrawItemStruct->itemState;
POINT pt ;
TCHAR strText[MAX_PATH + 1];
::GetWindowText(m_hWnd, strText, MAX_PATH);



//画按钮的外边框,它是一个半径为5的圆角矩形
pt.x = 5;
pt.y = 5;
CPen* hOldPen = pDC->SelectObject(&m_BoundryPen);
pDC->RoundRect(&rect, pt);

//获取按钮的状态
if (state & ODS_FOCUS)
{
m_bFocus = TRUE;
m_bSelected = TRUE;
}
else
{
m_bFocus = FALSE;
m_bSelected = FALSE;
}


if (state & ODS_SELECTED || state & ODS_DEFAULT)
{
m_bFocus = TRUE;
}


pDC->SelectObject(hOldPen);

rect.DeflateRect(CSize(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE)));

//根据按钮的状态填充按钮的底色
CBrush* pOldBrush;
if (m_bOver)
{
pOldBrush = pDC->SelectObject(&m_FillActive);
DoGradientFill(pDC, &rect);
}
else
{
pOldBrush = pDC->SelectObject(&m_FillInactive);
DoGradientFill(pDC, &rect);
}

//根据按钮的状态绘制内边框
if (m_bOver || m_bSelected)
DrawInsideBorder(pDC, &rect);

pDC->SelectObject(pOldBrush);

//显示按钮的文本
if (strText!=NULL)
{
CFont* hFont = GetFont();
CFont* hOldFont = pDC->SelectObject(hFont);
CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText));
CPoint pt( rect.CenterPoint().x - szExtent.cx / 2, rect.CenterPoint().y - szExtent.cy / 2);
if (state & ODS_SELECTED)
pt.Offset(1, 1);
int nMode = pDC->SetBkMode(TRANSPARENT);
if (state & ODS_DISABLED)
pDC->DrawState(pt, szExtent, strText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);
else
pDC->DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);
pDC->SelectObject(hOldFont);
pDC->SetBkMode(nMode);
}


pDC->RestoreDC(nSaveDC);
}

//绘制按钮的底色
void CXPButton::DoGradientFill(CDC *pDC, CRect* rect)
{
CBrush brBk[64];
int nWidth = rect->Width();
int nHeight = rect->Height();
CRect rct;

for (int i = 0; i < 64; i ++)
{
if (m_bOver)
{
if (m_bFocus)
brBk[i].CreateSolidBrush(RGB(255 - (i / 4), 255 - (i / 4), 255 - (i / 3)));
else
brBk[i].CreateSolidBrush(RGB(255 - (i / 4), 255 - (i / 4), 255 - (i / 5)));
}
else
{
if (m_bFocus)
brBk[i].CreateSolidBrush(RGB(255 - (i / 3), 255 - (i / 3), 255 - (i / 4)));
else
brBk[i].CreateSolidBrush(RGB(255 - (i / 3), 255 - (i / 3), 255 - (i / 5)));
}
}

for (int i = rect->top; i <= nHeight + 2; i ++)
{
rct.SetRect(rect->left, i, nWidth + 2, i + 1);
pDC->FillRect(&rct, &brBk[((i * 63) / nHeight)]);
}

for (int i = 0; i < 64; i ++)
brBk[i].DeleteObject();
}
「已注销」 2009-08-23
  • 打赏
  • 举报
回复
把关键代码贴出来啊
  • 打赏
  • 举报
回复
MARK! 学习!
  • 打赏
  • 举报
回复
需要调用刷新
webing520 2009-08-21
  • 打赏
  • 举报
回复
可以做一个刷新的,当你if-else时对按钮的颜色刷新。
bingo0717 2009-08-21
  • 打赏
  • 举报
回复
响应=WM_CTLCOLOR消息,在此消息里设置背景色等
HBRUSH CMyButton::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: 在此更改 DC 的任何属性
pDC->SetTextColor( m_ForeColor ); //设置文字颜色
pDC->SetBkColor( m_BackColor ); //设置背景色
return (HBRUSH)m_brush.GetSafeHandle(); //返回背景刷

// TODO: 如果不应调用父级的处理程序,则返回非空画笔
//return NULL;
}
  • 打赏
  • 举报
回复
m_edit1 是什么。m_edit1 < 0.1 要有把握
颜色改变时要Invalidate,

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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