C++MFC如何在另外一个类改变主窗口的static text 的颜色

Timon---老赵 2020-08-22 11:06:42
在主窗口内通过这个可以改变OnCtlColor,那么如何在另外一个类调用方法改变他的颜色?
...全文
526 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
待续_1006 2021-04-21
  • 打赏
  • 举报
回复
sendmessage给它发绘制消息不行吗?
gz_qmc 2021-04-16
  • 打赏
  • 举报
回复
我听有人说C#是宝马车
我是来看热闹的


Eleven 2021-04-15
  • 打赏
  • 举报
回复
你可以给主窗口发送消息,在消息响应函数中修改颜色变量,然后调用InvalidateRect()刷新static text控件区域即可。
geziliu 2021-04-14
  • 打赏
  • 举报
回复
自己重写static 或网上找现成的static继承他
顾小白xx 2021-04-13
  • 打赏
  • 举报
回复
闪烁 的问题基本上用双缓存就能解决
field_mouse 2020-08-24
  • 打赏
  • 举报
回复
线程里 线程里
void ChangeColorFunction::ChangeColor()
{
	if (MainDlg == NULL)
		return;
	RandColor();
	CWnd *cwnd = CWnd::FromHandle(GetDlgItem(MainDlg, StaticID));
	cwnd->Invalidate(1);
}

void ChangeColorFunction::RandColor()
{
	colorChange = RGB(rand() % 256, rand() % 256, rand() % 256);
}
窗口内
void CStaticTestDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (nIDEvent == 1)
	{
		changeFunction->ChangeColor();
	}
	CDialogEx::OnTimer(nIDEvent);
}


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

	// TODO:  在此更改 DC 的任何特性

	if (pWnd->GetDlgCtrlID())
	{
		//pDC->SetBkColor(changeFunction->colorChange);//背景色为绿色
		pDC->SetTextColor(changeFunction->colorChange);//文字为红色
	}

	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	return hbr;
}
走好每一步 2020-08-24
  • 打赏
  • 举报
回复
引用 12 楼 Timon---老赵 的回复:
[quote=引用 11 楼 zgl7903的回复:][quote=引用 9 楼 Timon---老赵 的回复:][quote=引用 4 楼 zgl7903的回复:]先置好想要的状态 Invalidate InvalidateRect 等引发控件窗口的重绘
这个不行,我基本一秒变四五次,不太实用,会闪烁[/quote] 要避免闪烁就双缓冲 [/quote] 有没有简单的,像c#中不就可以直接改变颜色[/quote] c#是宝马车, mfc是牛车,不能比 楼主要弄的,花点费用,可以帮你弄
dd_zhouqian 2020-08-24
  • 打赏
  • 举报
回复
引用 13 楼 schlafenhamster 的回复:
一秒变四五次后 Invalidate 控件
1秒4~5次,200ms/次,定时器够用了
sichuanwww 2020-08-24
  • 打赏
  • 举报
回复
SendMessage
field_mouse 2020-08-24
  • 打赏
  • 举报
回复
我用invalidate 30毫秒一刷新也没见主窗口闪烁。晚上回去整理下代码发出来。
field_mouse 2020-08-24
  • 打赏
  • 举报
回复
建议类里面调用static text 的 invalidate , 同时OnCtlColor 中 调用类的RGB值; postmessage/ sendmessage 发送WM_CTLCOLOR , 我没用成功,找了资料也没见成功的包括高低位
schlafenhamster 2020-08-23
  • 打赏
  • 举报
回复
一秒变四五次后 Invalidate 控件
Timon---老赵 2020-08-22
  • 打赏
  • 举报
回复
引用 11 楼 zgl7903的回复:
[quote=引用 9 楼 Timon---老赵 的回复:][quote=引用 4 楼 zgl7903的回复:]先置好想要的状态
Invalidate InvalidateRect 等引发控件窗口的重绘

这个不行,我基本一秒变四五次,不太实用,会闪烁[/quote]

要避免闪烁就双缓冲

[/quote] 有没有简单的,像c#中不就可以直接改变颜色
zgl7903 2020-08-22
  • 打赏
  • 举报
回复
引用 9 楼 Timon---老赵 的回复:
[quote=引用 4 楼 zgl7903的回复:]先置好想要的状态
Invalidate InvalidateRect 等引发控件窗口的重绘

这个不行,我基本一秒变四五次,不太实用,会闪烁[/quote]

要避免闪烁就双缓冲

Timon---老赵 2020-08-22
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster的回复:
定时器 + static重绘
不能用事件触发吗?我的频率比较高
Timon---老赵 2020-08-22
  • 打赏
  • 举报
回复
引用 4 楼 zgl7903的回复:
先置好想要的状态 Invalidate InvalidateRect 等引发控件窗口的重绘
这个不行,我基本一秒变四五次,不太实用,会闪烁
Timon---老赵 2020-08-22
  • 打赏
  • 举报
回复
其他的类返回不同值,改变不同颜色,怎么传给这个函数改变?
schlafenhamster 2020-08-22
  • 打赏
  • 举报
回复
定时器 + static重绘
an_bachelor 2020-08-22
  • 打赏
  • 举报
回复
OnCtlColor是由框架来调用(询问)采用什么颜色,可以通过动态返回不同的值来改变子控件颜色。 所以你不应该尝试去“调用”它,而应该给予它不同的返回值来间接绘制不同的颜色。
加载更多回复(5)

15,980

社区成员

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

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