新手关于按钮的问题

xhd3767 2008-03-31 12:47:31
我想改变一个按钮的颜色:
HBRUSH test::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here
CBrush cRedBrush;
cRedBrush.CreateSolidBrush(RGB(255,0,0));

// TODO: Return a non-NULL brush if the parent's handler should not be called
return (HBRUSH)cRedBrush;
}
这样的不行吗??
这个函数需要调用吗?在哪调用?
并且这么消息是在哪产生的呀!
还有CDC …*pDC= Getdc();到底应该怎么用呀,或者说到底应该在哪里用,并且怎么确定它返回的是按钮的DC还是其他的DC呀!!
在这个函数有必要对nCtlColor进行判断吗??
还有invaliable();UpdateData(),有什么区别吗??

问题多了点。
...全文
110 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xhd3767 2008-04-01
谢谢楼上的。。。。。。。截贴拉
回复
iyranly 2008-04-01
http://www.codeproject.com/KB/miscctrl/subclassdemo.aspx
回复
xhd3767 2008-04-01
上面的我知道了,可是颜色总是闪呀!!
回复
xhd3767 2008-04-01
我定义了一个类,然后再里面重写了DrawItem(); 内容如下:

CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
DWORD nState = lpDrawItemStruct->itemState;
DWORD nAction = lpDrawItemStruct->itemAction;
CRect rc = lpDrawItemStruct->rcItem;
UINT uStyle = DFCS_BUTTONPUSH;

pDC->SetBkMode(TRANSPARENT);
CString strText;
GetWindowText(strText);
CBrush red;
red.CreateSolidBrush(RGB(255,0,0));
pDC->SelectObject(red);
//COLORREF
CRect rect((rc.TopLeft()).x,(rc.TopLeft()).y,(rc.BottomRight()).x,(rc.BottomRight()).y);
pDC->FillRect(&rect,&red);
// pDC->FillSolidRect((rc.TopLeft()).x,(rc.TopLeft()).y,(rc.BottomRight()).x,(rc.BottomRight()).y,RGB(255,0,0));

然后再DloG里面声明了此类的一个对象(用classwizard);
但是还是不能显示颜色,为什么呀!!!

还有什么要注意的吗?
回复
scq2099yt 2008-04-01
GetDlgItem(按钮ID)
回复
xhd3767 2008-04-01
九楼给的样例挺好的,可是看不懂呀!!
回复
fm4366 2008-03-31
最好继承CButton,重新定义一个类,然后将它重绘
回复
快乐鹦鹉 2008-03-31
用OnCtlColor改不了按钮的颜色,一般要进行按钮对象的自绘
回复
wgm001 2008-03-31
自绘吧!呵呵
回复
Eleven 2008-03-31
想改变按钮的话,要重载DrawItem()虚函数!
回复
菜牛 2008-03-31
基础太差,建议先系统学习一下Windows编程或者VC的教材。
回复
ZiSheng 2008-03-31
把你的风格改为ownerdraw,在对话框资源的属性里边
回复
babyofbaby 2008-03-31
我也是WINDOWS编程初学者,一起学习一下
回复
Mr-Chen 2008-03-31
http://www.codeproject.com/buttonctrl/cbuttonst.asp
回复
xhd3767 2008-03-31
我还是不太懂。。,就是GetDC与相对应的控件,能不能用代码讲一下呀!!
这个消息是在什么时候产生的呀!
我知道也有一个onctlcolor()函数,里面有相应的cwnd的句柄。但是这个既然没有那个参数应该就不用比较吧,
回复
cnzdgs 2008-03-31
你需要响应对话框的WM_CTLCOLOR消息(WM_CTLCOLOR已经被WM_CTLCOLORBTN取代),这个函数在收到WM_CTLCOLOR消息时调用,如果你利用VC来添加消息响应函数,VC会替你写相关代码。
改变一个按钮颜色需要判断控件的句柄是不是你要改的按钮。
当你要获取控件DC的时候用GetDC,调哪个类实例的GetDC,返回的就是该类实例对应的控件的DC。
没必要对nCtlColor做判断,除非你要改一类颜色。
不知道你说的invaliable是什么,Invalidate是刷新控件;UpdateData对话框中的控件与关联变量间更新数据。
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-03-31 12:47
社区公告

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