改变static控件的字体颜色,但是没有成功,望高手指教!谢谢

f2081 2014-05-13 03:58:43
网上找的方法不成功。
1、现象就是不能刷新,如果拖动窗口,会发现字体颜色更改了,但是窗口的状态栏和边框都会显示不全,窗口显示的支离破碎的,本人才疏学浅。哪位高人,告我我这是什么原因。
2、如果用钩子如何实现更改static文字颜色?

下面是网上的代码:
// case   WM_CTLCOLORSTATIC:
// {
// if((HWND)lParam == shenqing_static_hwnd[1])
// {
// SetTextColor((HDC)wParam, 0xff0000);//RGB(0,0,0));//更改字体颜色
// }
// else
// {
// SetTextColor((HDC)wParam, GetSysColor(COLOR_WINDOWTEXT));
// }
// SetBkColor((HDC)wParam, GetSysColor(COLOR_BTNFACE));//绘制背景颜色
// SetWindowLong(mainhwnd, DWL_MSGRESULT, (LONG)TRUE);//执行上面的更改
// return (LRESULT)GetSysColorBrush(NULL_BRUSH);//COLOR_BTNFACE);//返回一个画刷,这样系统才能利用这个画刷重绘控件的颜色
// return (INT_PTR)CreateSolidBrush(RGB(255,255,255));
// break;
// }
...全文
217 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2014-06-19
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
schlafenhamster 2014-05-19
  • 打赏
  • 举报
回复
还没搞好? 上传到你的资源。
f2081 2014-05-19
  • 打赏
  • 举报
回复
没人说话了吗
china_119 2014-05-15
  • 打赏
  • 举报
回复
引用 10 楼 ringphone 的回复:
WM_CTLCOLORSTATIC代码的两个问题: return (INT_PTR)CreateSolidBrush(RGB(255,255,255)); CreateSolidBrush是创建画刷,需要调用DeleteObject释放的,直接return,没有释放,时间长了资源耗尽。应该事先创建好,然后返回,退出时释放,而不是每次都创建。 如果是对话框,并且消息需要返回的不是BOOL值,要调用SetWindowLong(mainhwnd,DWL_MSGRESULT,返回值);来使返回值生效,WM_CTLCOLORSTATIC需要返回画刷句柄,因此应该是 SetWindowLong(mainhwnd,DWL_MSGRESULT,(LONG)hbr);//hbr是调用CreateSolidBrush的返回值。
学习了。谢谢!!!
ringphone 2014-05-15
  • 打赏
  • 举报
回复
WM_CTLCOLORSTATIC代码的两个问题: return (INT_PTR)CreateSolidBrush(RGB(255,255,255)); CreateSolidBrush是创建画刷,需要调用DeleteObject释放的,直接return,没有释放,时间长了资源耗尽。应该事先创建好,然后返回,退出时释放,而不是每次都创建。 如果是对话框,并且消息需要返回的不是BOOL值,要调用SetWindowLong(mainhwnd,DWL_MSGRESULT,返回值);来使返回值生效,WM_CTLCOLORSTATIC需要返回画刷句柄,因此应该是 SetWindowLong(mainhwnd,DWL_MSGRESULT,(LONG)hbr);//hbr是调用CreateSolidBrush的返回值。
f2081 2014-05-15
  • 打赏
  • 举报
回复
哦对了。ringphone 画刷可以不用创建。直接用GetSysColorBrush()获得系统提供的画刷。这样就没有释放的问题了。
f2081 2014-05-15
  • 打赏
  • 举报
回复
谢谢ringphone 我还没完全看懂。学习中。 我记得前几天看过一个人说过用hook拦截static的消息 1、static比较特殊,是先向父窗口发送重绘的消息,然后父窗口的消息处理函数,来处理,最后父窗口消息函数返回一个画刷。static就用这个画刷来重绘。所以,如果用hook的话,WH_CALLWNDPROC类型的hook只能拦截static发送出来的消息。但是不能返回画刷。所以无法通知static重绘。 2、不过,在WM_CTLCOLORSTATIC中,会出现父窗口显示不全,不能自动刷新等显示问题。不知道是什么原因。
schlafenhamster 2014-05-14
  • 打赏
  • 举报
回复
SetWindowLong(mainhwnd, DWL_MSGRESULT, (LONG)TRUE);//执行上面的更改 mainhwnd 是 对话框 ?
f2081 2014-05-14
  • 打赏
  • 举报
回复
嗯。好谢谢楼上。我去看看
gz_qmc 2014-05-14
  • 打赏
  • 举报
回复
连钩子都用上了 就是不愿直接画图输出 一个又一个奇葩啊
wyx100 2014-05-14
  • 打赏
  • 举报
回复
引用 4 楼 china_119 的回复:
SDK下我不熟,不过像这种设定后要拖动一下或变一下大小才会转到设定效果的情况多办是忘了通知父窗口重绘。你从这个方向去尝试一下.
f2081 2014-05-14
  • 打赏
  • 举报
回复
mainhwnd是父窗口句柄
china_119 2014-05-13
  • 打赏
  • 举报
回复
SDK下我不熟,不过像这种设定后要拖动一下或变一下大小才会转到设定效果的情况多办是忘了通知父窗口重绘。你从这个方向去尝试一下.
f2081 2014-05-13
  • 打赏
  • 举报
回复
我是在sdk下不是在mfc。 没有这个 WM_COLORCTRL 消息 问题是,通过消息显示的窗口,不全,而且不能自动刷新。需要鼠标拖拽一下。而且父窗口顶部的蓝色状态栏,也没有显示了。惨淡也是黑色。这个现象,如何解释。我才疏学浅啊。
china_119 2014-05-13
  • 打赏
  • 举报
回复
响应WM_COLORCTRL

HBRUSH CUI_NEWDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
if(CTLCOLOR_STATIC == nCtlColor)
{
pDc->SetTextColor(RGB(0,0,0)); //设字色彩
pDc->SetBkColor(RGB(0,0,0)); //设字背景色彩(注意不是整个控件的背景色彩)
pDc->SetBkMode(1); //设字背景色彩模式(是否透明)
//如果需要对整个控件区域的背景色彩进行修改需在此
return (HBRUSH) CreateSolidBrush(RGB(255,0,0));
}
}
fdsdfdsf 2014-05-13
  • 打赏
  • 举报
回复
应该是选一个画笔进去吧

15,979

社区成员

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

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