मैं एक बटन बनाने की कोशिश कर रहा हूं जो माउस पर इंगित करता है जब चमकता है। इन रंगों में एक चिकनी लुप्तप्राय को नियंत्रित करने के लिए पृष्ठभूमि में एक टाइमर होना चाहिए। यह एक रंग से अगले रंग तक नहीं कूदता है, यह धीरे-धीरे अगले रंग में फहराता है।रीयल-टाइम चमकते प्रभाव देने के लिए रंगों का उपयोग कैसे करें?
अब मेरी समस्या यह है कि जब यह अपने नियमित रंग में वापस आ जाता है, तो यह अपने अंतिम रंग में बंद नहीं होता है। वास्तव में, यह प्रकाश से अंधेरे में कूदता रहता है।
यह मेरा एक कस्टम बटन है, जिसे मैं कोड पोस्ट नहीं कर रहा हूं, लेकिन यह कोड माउस एंटर/एक्ज़िट इवेंट और रंगीन संपत्ति के साथ कुछ भी रखा जा सकता है।
यह एक चर FMenuDestColor
सेट करके काम करता है। ExtractColor
रंग के आधार पर आरजीबी मान प्राप्त करता है। टाइमर वर्तमान रंग और गंतव्य रंग के बीच प्रत्येक आरजीबी चैनल की तुलना करता है। फिर टाइमर अगले रंग को फीका करने के लिए वर्तमान रंग को संशोधित करता है। ये गणना CalcColorFade
नामक फ़ंक्शन में की जाती है - प्रत्येक चैनल के लिए 3 बार चलाएं।
procedure ExtractColor(const Color: TColor; var R, G, B: Byte);
begin
R:= GetRValue(Color);
G:= GetGValue(Color);
B:= GetBValue(Color);
end;
function CalcColorFade(const C1, C2: Byte): Byte;
const
RGB_MULT = 1.2;
RGB_SENS = 5;
begin
if C1 <> C2 then begin
if (C1 >= C2 - RGB_SENS) and (C1 <= C2 + RGB_SENS) then
Result:= C2
else
if C1 > C2 then
Result:= EnsureRange(Trunc(C1/RGB_MULT), 0, 255)
else
Result:= EnsureRange(Trunc(C1 * RGB_MULT), 0, 255);
end else begin
Result:= C2;
end;
end;
procedure TfrmMain.tmrMenuGlowTimer(Sender: TObject);
var
R1, G1, B1: Byte;
R2, G2, B2: Byte;
R3, G3, B3: Byte;
begin
if MenuButton.Color <> FMenuDestColor then begin
ExtractColor(MenuButton.Color, R1, G1, B1);
ExtractColor(FMenuDestColor, R2, G2, B2);
R3:= CalcColorFade(R1, R2);
G3:= CalcColorFade(G1, G2);
B3:= CalcColorFade(B1, B2);
MenuButton.Color:= RGB(R3, G3, B3);
end;
end;
procedure TfrmMain.MenuButtonMouseEnter(Sender: TObject);
begin
FMenuDestColor:= clBlue;
end;
procedure TfrmMain.MenuButtonMouseLeave(Sender: TObject);
begin
FMenuDestColor:= clNavy;
end;
माउस को उस पर इंगित करें, और यह अगले रंग में फीका होगा। लेकिन माउस को इसके बाहर ले जाएं, और यह थोड़े अपने मूल रंग में स्थिति में बंद नहीं होता है - यह प्रकाश और अंधेरे के बीच आगे और पीछे हिलाता है।
मुझे लगता है कि मैं जो कर रहा हूं उसे पूरा करने के लिए एक क्लीनर दृष्टिकोण होना चाहिए, और मैं उन सुझावों के लिए भी खुला हूं।
टाइमर का अंतराल 70 पर है और 1.2 की स्थिरता, 1.1 में बदलकर, यह ठीक काम करता है। तो 1.2 को बदलने के बारे में कुछ ऐसा है जो इसे गड़बड़ कर देता है।
मुझे लगता है कि यदि आप समान कोड हैंडलिंग आर, जी, और बी और कारक को स्वयं की प्रक्रिया में रखते हैं और इसे तीन बार कहते हैं तो आपको अपना कोड पढ़ने में आसान लगेगा: 'आर 1' और 'आर 2 में गुजरना पहले रन पर, दूसरे रन पर 'जी 1' और' जी 2 'इत्यादि। – sarnold
@ कर्नाल्ड अच्छी युक्ति जो मैं वैसे भी घायल हो जाती, हालांकि सवाल से असंबंधित। –
पर्याप्त सच है, इसलिए मैंने इसे एक टिप्पणी के रूप में छोड़ा - मैं उस समस्या को नहीं देख सकता जिसे आप _actually_ हल करने की कोशिश कर रहे हैं। बस संकेत देते हुए कि यह उन ब्लॉकों में तीन गुना के बजाय केवल एक बार ठीक करना आसान होगा ... :) – sarnold