【求助】关于QQ2010界面标题栏字体颜色随背景颜色改变而改变的实现方案!

ji1bing 2011-06-10 06:28:16
最近在模仿QQ界面写程序,遇到一个问题:
QQ2010主界面上方标题栏、昵称、在线状态,以及聊天窗口上方的标题栏文字的颜色会随着更换背景的不同而变白字或者黑字,这个是如何实现的? 各位有没有具体的解决方案或者思路提供以下!
万分感激!
...全文
765 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ji1bing 2011-06-20
  • 打赏
  • 举报
回复
别沉啊 自己顶起来!
ji1bing 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hkf314 的回复:]

看看http://topic.csdn.net/u/20110613/18/a7ea7564-5924-4ea0-90f0-46e77f2065b5.html?90161
[/Quote]

这个程序我看了,界面做的很不错,主界面基本的效果都出来了,源码可以分享一下吗?
但是字体配色方案还是不太准确。有时候背景很亮时候,文字还是白色的,有些看不清,做上光晕就好了……
邮箱:songjian123@126.com
菜鸟二号 2011-06-13
  • 打赏
  • 举报
回复
看看http://topic.csdn.net/u/20110613/18/a7ea7564-5924-4ea0-90f0-46e77f2065b5.html?90161
niuren3000 2011-06-13
  • 打赏
  • 举报
回复
MARK
ji1bing 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ji1bing 的回复:]

引用 5 楼 cometnet 的回复:

RGB转换成HSL:
C/C++ code
#include <algorithm>
using std::min;
using std::max;

void RGB2HSL(TColor AColor, double &amp;H,double &amp;S,double &amp;L)
{
double……
[/Quote]

黑字背景色(RGB):60 190 70、 215 60 183、 215 118 60
白字背景色(RGB):60 191 70、 215 60 184、 215 119 60
ji1bing 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cometnet 的回复:]

RGB转换成HSL:
C/C++ code
#include <algorithm>
using std::min;
using std::max;

void RGB2HSL(TColor AColor, double &H,double &S,double &L)
{
double R,G,B,Max,Min,del_R,del_G,del_B,del_M……
[/Quote]

谢谢您的帮助,之前在网上也找到了RGB转换成HSL的代码,但是QQ好像不是这么搞得。
下面一组是我自己找到的几组QQ黑字和白字的临近背景值,您看一下它是不是用了其他方法。

黑字背景色(RGB):60 190 70 215 60 183 215 118 60
白字背景色(RGB):60 191 70 215 60 184 215 119 60
从HSL角度来计算的话,上面貌似不符合啊
菜鸟二号 2011-06-13
  • 打赏
  • 举报
回复
亮度总是取RGB中最大值
ji1bing 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hkf314 的回复:]

亮度总是取RGB中最大值,所以楼主不需要转成HSL OR HSV,根据亮度是否是128,决定字体颜色就差不多了,或者你可以缩小范围
[/Quote]

不转换成HSL 怎么去RGB的亮度?
菜鸟二号 2011-06-13
  • 打赏
  • 举报
回复
但是在QQ界面调色时依然需要这么做
菜鸟二号 2011-06-13
  • 打赏
  • 举报
回复
亮度总是取RGB中最大值,所以楼主不需要转成HSL OR HSV,根据亮度是否是128,决定字体颜色就差不多了,或者你可以缩小范围
菜鸟二号 2011-06-13
  • 打赏
  • 举报
回复
但是我觉得楼主没必要纠结在这个地方,和QQ做到完全一样是很难的,就是那个背景的算法都不是太容易搞,楼主能做到大概像就很不错了。
邓学彬 2011-06-10
  • 打赏
  • 举报
回复
RGB转换成HSL:
#include <algorithm>
using std::min;
using std::max;

void RGB2HSL(TColor AColor, double &H,double &S,double &L)
{
double R,G,B,Max,Min,del_R,del_G,del_B,del_Max;
R = GetRValue(AColor) / 255.0; //Where RGB values = 0 ÷ 255
G = GetGValue(AColor) / 255.0;
B = GetBValue(AColor) / 255.0;

Min = min(R, min(G, B)); //Min. value of RGB
Max = max(R, max(G, B)); //Max. value of RGB
del_Max = Max - Min; //Delta RGB value

L = (Max + Min) / 2.0;

if (del_Max == 0) //This is a gray, no chroma...
{
//H = 2.0/3.0; //Windows下S值为0时,H值始终为160(2/3*240)
H = 0; //HSL results = 0 ÷ 1
S = 0;
}
else //Chromatic data...
{
if (L < 0.5) S = del_Max / (Max + Min);
else S = del_Max / (2 - Max - Min);

del_R = (((Max - R) / 6.0) + (del_Max / 2.0)) / del_Max;
del_G = (((Max - G) / 6.0) + (del_Max / 2.0)) / del_Max;
del_B = (((Max - B) / 6.0) + (del_Max / 2.0)) / del_Max;

if (R == Max) H = del_B - del_G;
else if (G == Max) H = (1.0 / 3.0) + del_R - del_B;
else if (B == Max) H = (2.0 / 3.0) + del_G - del_R;

if (H < 0) H += 1;
if (H > 1) H -= 1;
}
}

HSL转换为RGB:
TColor HSL2RGB(double H,double S,double L)
{
double R,G,B;
double var_1, var_2;
if (S == 0) //HSL values = 0 ÷ 1
{
R = L * 255.0; //RGB results = 0 ÷ 255
G = L * 255.0;
B = L * 255.0;
}
else
{
if (L < 0.5) var_2 = L * (1 + S);
else var_2 = (L + S) - (S * L);

var_1 = 2.0 * L - var_2;

R = 255.0 * Hue2RGB(var_1, var_2, H + (1.0 / 3.0));
G = 255.0 * Hue2RGB(var_1, var_2, H);
B = 255.0 * Hue2RGB(var_1, var_2, H - (1.0 / 3.0));
}
return TColor(RGB(R,G,B));
}
//---------------------------------------------------------------------------

double Hue2RGB(double v1, double v2, double vH)
{
if (vH < 0) vH += 1;
if (vH > 1) vH -= 1;
if (6.0 * vH < 1) return v1 + (v2 - v1) * 6.0 * vH;
if (2.0 * vH < 1) return v2;
if (3.0 * vH < 2) return v1 + (v2 - v1) * ((2.0 / 3.0) - vH) * 6.0;
return (v1);
}

如果要得到Windows里的HSL值,可以重载这两个函数,参数换成int类型:
RGB转换成HSL:
#include <Math.hpp>
void RGB2HSL(TColor AColor, int &H,int &S,int &L)
{
double h,s,l;
RGB2HSL(AColor,h,s,l);
H = RoundTo(h * 240,0);
S = RoundTo(s * 240,0);
L = RoundTo(l * 240,0);
}

HSL转换为RGB:
TColor HSL2RGB(int H, int S, int L)
{
double h,s,l;
h = H / 240.0;
s = S / 240.0;
l = L / 240.0;
return HSL2RGB(h,s,l);
}

ouyang_njupt 2011-06-10
  • 打赏
  • 举报
回复
GDI+应该是可以的
ji1bing 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cometnet 的回复:]

取背景颜色亮度(HSL),根据亮度决定文字颜色是白色或者黑色。
我以前就是这样写的。
[/Quote]

怎么取得? 用GDI+可以吗? 有什么方法吗?
psbeond 2011-06-10
  • 打赏
  • 举报
回复
楼上正解。
邓学彬 2011-06-10
  • 打赏
  • 举报
回复
取背景颜色亮度(HSL),根据亮度决定文字颜色是白色或者黑色。
我以前就是这样写的。

15,980

社区成员

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

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