关于OnSysColorChange(系统颜色改变)的问题

gunNrose12987055 2006-09-28 10:38:41
我正在修改一个老程序,
其中的OnSysColorChange有问题,但一时我又找不到好的修改方法
而我尝试着将ON_WM_SYSCOLORCHANGE和ON_WM_SETTINGCHANGE消息屏蔽掉后,原来的显示错误不但没有了,而且在系统颜色等设置改变后,一切也都正常。

因此下面的问题,请帮忙解答一下:(100分相送)

1.不知道是不是Windows有这种自动修改颜色功能,而不需要在自己的程序中重写OnSysColorChange函数?

2.如果这种情况下不需要重写OnSysColorChange函数,那OnSysColorChange应该在什么情况下,必须应用呢?
...全文
407 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jazy 2006-09-28
  • 打赏
  • 举报
回复
我猜这个控件本来还有个开关,可以选择是否使用系统颜色,这里是强制控件使用系统颜色的,如果控件初始化为使用系统颜色的,这里当然是白做功,删掉也没事。

lz还是再搜索一下,这个控件是不是可以设置为不使用系统颜色的,如果能作这种设置,这段代码可能就有必要保留了。
lixiaosan 2006-09-28
  • 打赏
  • 举报
回复
Top level windows that use common controls must forward the WM_SYSCOLORCHANGE message to the controls; otherwise, the controls will not be notified of the color change. This ensures that the colors used by your common controls are consistent with those used by other user interface objects. For example, a toolbar control uses the "3D Objects" color to draw its buttons. If the user changes the 3D Objects color but the WM_SYSCOLORCHANGE message is not forwarded to the toolbar, the toolbar buttons will remain in their original color while the color of other buttons in the system changes.
pioneer_public 2006-09-28
  • 打赏
  • 举报
回复
你使用新的消息后,将代码拷贝过来,看看有什么不同之处就是了啊
gunNrose12987055 2006-09-28
  • 打赏
  • 举报
回复
是呀,这么改很有危险,但是原程序已经被改的面目全非了,看懂别人的程序......

最早的原程序是在codeproject上下载的Chris Maunder写的
// MFC Grid Control v2.26
// Written by Chris Maunder <chris@codeproject.com>

// If system colours change, then redo colours
void CGridCtrl::OnSysColorChange()
{
CWnd::OnSysColorChange();

if (GetDefaultCell(FALSE, FALSE)->GetTextClr() == m_crWindowText) // Still using system colours
GetDefaultCell(FALSE, FALSE)->SetTextClr(::GetSysColor(COLOR_WINDOWTEXT)); // set to new system colour
if (GetDefaultCell(FALSE, FALSE)->GetBackClr() == m_crWindowColour)
GetDefaultCell(FALSE, FALSE)->SetBackClr(::GetSysColor(COLOR_WINDOW));

if (GetDefaultCell(TRUE, FALSE)->GetTextClr() == m_crWindowText) // Still using system colours
GetDefaultCell(TRUE, FALSE)->SetTextClr(::GetSysColor(COLOR_WINDOWTEXT)); // set to new system colour
if (GetDefaultCell(TRUE, FALSE)->GetBackClr() == m_crWindowColour)
GetDefaultCell(TRUE, FALSE)->SetBackClr(::GetSysColor(COLOR_WINDOW));

if (GetDefaultCell(FALSE, TRUE)->GetTextClr() == m_crWindowText) // Still using system colours
GetDefaultCell(FALSE, TRUE)->SetTextClr(::GetSysColor(COLOR_WINDOWTEXT)); // set to new system colour
if (GetDefaultCell(FALSE, TRUE)->GetBackClr() == m_crWindowColour)
GetDefaultCell(FALSE, TRUE)->SetBackClr(::GetSysColor(COLOR_WINDOW));

if (GetDefaultCell(TRUE, TRUE)->GetTextClr() == m_crWindowText) // Still using system colours
GetDefaultCell(TRUE, TRUE)->SetTextClr(::GetSysColor(COLOR_WINDOWTEXT)); // set to new system colour
if (GetDefaultCell(TRUE, TRUE)->GetBackClr() == m_crWindowColour)
GetDefaultCell(TRUE, TRUE)->SetBackClr(::GetSysColor(COLOR_WINDOW));

if (GetGridBkColor() == m_crShadow)
SetGridBkColor(::GetSysColor(COLOR_3DSHADOW));

m_crWindowText = ::GetSysColor(COLOR_WINDOWTEXT);
m_crWindowColour = ::GetSysColor(COLOR_WINDOW);
m_cr3DFace = ::GetSysColor(COLOR_3DFACE);
m_crShadow = ::GetSysColor(COLOR_3DSHADOW);
}

根据其中的注释看,
“// Still using system colours
// set to new system colour”
感觉OnSysColorChange的作用就是当系统颜色改变后重新设定控件(CELL等)的颜色为系统的默认颜色(不知道我的看法对吗?)。而且我在屏蔽了ON_WM_SYSCOLORCHANGE消息后,也是同样的效果。
wangk 2006-09-28
  • 打赏
  • 举报
回复
你要先弄明白老程序在OnSysColorChange干了什么,否则这么做的话有可能导致某些比较隐蔽的Bug。
zhucde 2006-09-28
  • 打赏
  • 举报
回复
1. 当然有,一般都不需要重载
2.只有不想使用系统默认的才需要重载。

看起来像费话!。。。汗!

16,472

社区成员

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

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

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