MFC 如何动态更改对话框的背景颜色和文本颜色

wenxian8 2011-02-01 10:42:44
最近使用mfc做一个小工具,想像QQ那样,可以让QQ用户自己更改QQ的皮肤颜色,SetDialogBkColor函数是CWinApp类的保护成员函数,所以也只能在CXXApp类的Instance函数里调用。请问各路高手,如何才能在其他类的调用SetDialogBkColor函数呢?
更改对话框背景颜色和文本颜色:
void CWenLoveYouDlg::OnSkin()
{
SkinColor.SetDialogBkColor(RGB(240,255,240),RGB(30,144,255));
}

注释:SkinColor这个变量已经声明为CWinApp的类对象了,可是还是无法调用这个SetDialogBkColor函数,请问还有其他什么办法吗?
谢谢了
...全文
625 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenxian8 2011-02-01
  • 打赏
  • 举报
回复
楼上,虽然提供的方法能改变背景颜色,但是并不是像QQ那样,能让QQ用户自己更改背景颜色,看来楼上个个都不理解我的意思呢,我需要用户能够自己动态更改这个工具的背景颜色和文本颜色,而不是我们程序员自己写代码更改背景颜色。
void CWenLoveYouDlg::OnTimer(UINT nIDEvent)
{

static int count=600;//设置倒计时 秒钟
CDialog::OnTimer(nIDEvent);
if(nIDEvent==1)
{
CString str,str1;
int Minute,Second; //分,秒
Minute=count/60; //分
Second=count%60; //秒
if(Second==0)
{
Second=59;
if(Minute>0)
Minute=Minute-1;
}
else
{
Second=Second-1;
}
str1.Format("%02d分%02d秒",Minute,Second); //分 秒
str=str1;
SetDlgItemText(IDC_TIME,str);
int nSelect=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3);
if(Minute==0&&Second==0)
{ KillTimer(1); //销毁定时器
SetDlgItemText(IDC_TIME,"游戏结束");
if (nSelect==IDC_RADIO1)
{
SystemShutdown(EWX_POWEROFF);//关机
}
if (nSelect==IDC_RADIO2)
{
SystemShutdown(EWX_REBOOT); //重启系统
}

if (nSelect==IDC_RADIO3)
{
SetSystemState();//待机
CWenLoveYouDlg::OnStatic1(); //同时关闭对话框
}
}
count=count-1;
}
if(nIDEvent==2)
{
CString sDate;
CTime Today=CTime::GetCurrentTime();
sDate=Today.Format("北京时间:\n%Y年%m月%d日\n%H:%M:%S");
SetDlgItemText(IDC_BeiJing,sDate);
}
if(nIDEvent==3)
{
CString strWen;
if(GetDlgItemText(IDC_FangWen,strWen),strWen=="个人博客")
{
SetDlgItemText(IDC_FangWen,"点击访问");
}
else
{
SetDlgItemText(IDC_FangWen,"个人博客");
}
}
}
void CWenLoveYouDlg::OnFangWen()
{
ShellExecute(NULL,NULL,"http://www.95wangming.com",NULL,NULL,SW_SHOW);
ShellExecute(NULL,NULL,"http://blog.163.com/wenxianliang08@126",NULL,NULL,SW_SHOW);
}

这就是我的核心代码,我需要在此基础上 添加一个按钮功能:动态更改对话框背景颜色和文本颜色
wyx100 2011-02-01
  • 打赏
  • 举报
回复
还有就是 :OnCtlColor,找到了以前人的:
具体步骤:
1 给你的工程中的对话框类添加一个CBrush变量,如:
CBrush m_bkBrush; //准备一把背景刷子
2 在对话框的初始化函数OnInitDialog中return TRUE的前面添加一行代码:
m_bkBrush.CreateSolidBrush(RGB(255,255,0)); //创建一把黄色的背……
TandyT 2011-02-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fandh 的回复:]
还有就是 :OnCtlColor,找到了以前人的:
具体步骤:
1 给你的工程中的对话框类添加一个CBrush变量,如:
CBrush m_bkBrush; //准备一把背景刷子
2 在对话框的初始化函数OnInitDialog中return TRUE的前面添加一行代码:
m_bkBrush.CreateSolidBrush(RGB(255,255,0)); //创建一把黄色的背……
[/Quote]

在 OnCtlColor 中可以实现
fandh 2011-02-01
  • 打赏
  • 举报
回复
还有就是 :OnCtlColor,找到了以前人的:
具体步骤:
1 给你的工程中的对话框类添加一个CBrush变量,如:
CBrush m_bkBrush; //准备一把背景刷子
2 在对话框的初始化函数OnInitDialog中return TRUE的前面添加一行代码:
m_bkBrush.CreateSolidBrush(RGB(255,255,0)); //创建一把黄色的背景刷子
3 最后把你原来的代码改成如下:
HBRUSH CEX06aDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: 在此更改 DC 的任何属性
if(nCtlColor==CTLCOLOR_DLG) //如果是CTLCOLOR_EDIT edit背景色能改变,为什么改为
//edit edit box背景色改不了
return m_bkBrush; //返回刚才创建的背景刷子

// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}
fandh 2011-02-01
  • 打赏
  • 举报
回复
重载画背景的函数 OnEraseBkgnd ,在里面重新填充!

16,472

社区成员

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

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

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