| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1125 人关注过本帖
标题:请教怎样修改才可以使颜色改变的过程能可见呢?
只看楼主 加入收藏
Scofield
Rank: 1
等 级:新手上路
威 望:1
帖 子:56
专家分:0
注 册:2006-5-30
收藏
 问题点数:0 回复次数:6 
请教怎样修改才可以使颜色改变的过程能可见呢?

HBRUSH CIntialdlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here
int a=10,b=10,c=0;
for(;c<=255;c=c+10)
{
Sleep(100);

if(nCtlColor==CTLCOLOR_STATIC)
{
pDC->SetTextColor(RGB(a,b,c+10)); //改变文字颜色
pDC->SetBkMode(TRANSPARENT); //设置背景模式

return m_nbrush;
}
}

return m_nbrush;
}

运行后对话框中间一直处于忙的状态,结束后文字颜色就已经改变结束了
请问怎么样能使这个过程可见呢?
多线程?
希望高手能指点一下,谢谢了!

搜索更多相关主题的帖子: pDC 颜色 nCtlColor CDC RGB 
2006-10-01 13:28
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

这个似乎不能这样吧~!!!


for(;c<=255;c=c+10)
{
Sleep(100);
if(nCtlColor==CTLCOLOR_STATIC)
{
pDC->SetTextColor(RGB(a,b,c+10)); //改变文字颜色
pDC->SetBkMode(TRANSPARENT); //设置背景模式
return m_nbrush;
}
}

WM_CTLCOLOR不是无时无刻的出现的。
它只把所有控件都游走一回,给你改变他们一次的机会。
比如不是static控件,它一样会进入循环,直到c>255.然后轮到下一个控件。。。

就算到达了static以后,他中途退出了第一个就会轮到下一个控件去了,而不会轮流的无限制的不停循环所有控件。


中途的SLeep就这样浪费了。

不知道我说的对不对,你可以试着分析下。

现在我说说我的想法:

HBRUSH CIntialdlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
static int c=0;
if(nCtlColor==CTLCOLOR_STATIC&&c<=245)
{
pDC->SetTextColor(RGB(10,10,c+10)); //改变文字颜色
pDC->SetBkMode(TRANSPARENT); //设置背景模式
c+=10;
hbr=m_nbrush;
}
return hbr;
}

可以再加一个按扭什么的,响应函数时,弄一个SetTimer(1,100,NULL).
OnTimer(UINT nEvent)
里面SendMessage();//发送WM_CTLCOLOR.


不知道这样行不行


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-10-01 15:02
Scofield
Rank: 1
等 级:新手上路
威 望:1
帖 子:56
专家分:0
注 册:2006-5-30
收藏
得分:0 

谢谢楼上的朋友,不过不知道为什么在OnTimer里修改m_nbrush,对话框的背景颜色不会变化呢?

void CIntialdlg::OnTimer(UINT nIDEvent)
{
m_nbrush.CreateSolidBrush(RGB(255,0,0));

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

CDialog::OnTimer(nIDEvent);
}


2006-10-01 17:52
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

你这样肯定不行了。

关键是我们还没弄清楚WM_CTLCOLOR消息Windows是怎么发送的.
我跟踪的时候:
nCtlColor=4 //进入
nCtlColor=3
nCtlColor=3
nCtlColor=6
nCtlColor=4
nCtlColor=4
nCtlColor=4
....
nCtlColor=4


而又有:
CTLCOLOR_BTN Button control
CTLCOLOR_DLG Dialog box
CTLCOLOR_EDIT Edit control
CTLCOLOR_LISTBOX List-box control
CTLCOLOR_MSGBOX Message box
CTLCOLOR_SCROLLBAR Scroll-bar control
CTLCOLOR_STATIC Static control

m_ctrl=CTLCOLOR_BTN;//3
m_ctrl=CTLCOLOR_DLG;//4
m_ctrl=CTLCOLOR_EDIT;//1
m_ctrl=CTLCOLOR_LISTBOX;//2
m_ctrl=CTLCOLOR_MSGBOX;//0
m_ctrl=CTLCOLOR_SCROLLBAR;//5
m_ctrl=CTLCOLOR_STATIC;//6
也就是说进入点是DIALOG
然后是确定和退出两个BUTTON
再就是static
然后就一直是DIALOG
然后我试着在其他地方往里面SendMessage(WM_CTLCOLOR);
结果仍然一直是nControl=4;

即使我这样。
WORD lParam=MAKEWORD(0,6);
GetDlgItem(IDC_STATIC)->SendMessage(WM_CTLCOLOR,(LPARAM)lParam);
也没用。
所以不知道还能不能插进去。

[此贴子已经被作者于2006-10-1 22:29:39编辑过]


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-10-01 22:18
Scofield
Rank: 1
等 级:新手上路
威 望:1
帖 子:56
专家分:0
注 册:2006-5-30
收藏
得分:0 
谢谢楼上朋友精彩的讲解!
我再看看

2006-10-02 12:28
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
希望你知道答案以后来这里说说

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-10-02 18:35
Bekky
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:354
专家分:0
注 册:2006-5-29
收藏
得分:0 
你手动发送一下WM_CTLCOLOR看行不行??

我的编译环境为WinXp + VC 6.0 http://blog..cn/yobo
2006-10-03 14:41
快速回复:请教怎样修改才可以使颜色改变的过程能可见呢?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023503 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved