Zadajesz pytania tak, że nie wiadomo o co Tobie chodzi. Jeżeli jednak chodzi o to co jest w załączniku, to mamy tam losowanie kolorów i wyświetlanie wyników nie na Button'ach lecz na Panel'ach. Jak wiadomo każdy kolor to składowa RGB, czyli Red, Green, Blue. Wartość każdej składowej zawiera się w przedziale od 0 do 255. Żeby wylosować kolor, wystarczy wylosować wartość każdej składowej z przedziału 0-255, i podstawić pod kolor, potem ustawić na ten kolor Panel.Losowanie dla jednego obiektu typy
TPanel może wyglądać tak:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Randomize(); /* uruchomienie generatora liczb losowych */
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
COLORREF cPanelColor = RGB( Random(255), Random(255), Random(255) );
Panel1->ParentBackground = false;
Panel1->Color = (TColor)cPanelColor;
}
To było dla jednego Panel-u, ale w programie mamy ich aż 64. Można by umieścić na formularzu tyle Panel-i, ale to mało oryginalne, dlatego ja posłużę się Panel-ami tworzonymi dynamicznie. Na etapie programowania ich nie będzie, ale zostaną rozmieszczone w chwili tworzenia aplikacji. W kodzie znajdzie się również zdarzenie OnClick, dla tych Panel-i. Teraz nie będzie do niczego potrzebne, ale przyda się w dalszych pracach nad programem:Plik nagłówkowy np. Unit1.h
private:
TPanel *Panel[64];
void __fastcall PanelsClick(TObject *Sender);
void CreatePanels(void);
void RandomColors(void);
Plik źródłowy np. Unit1.cpp
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Randomize();
CreatePanels();
}
//---------------------------------------------------------------------------
void TForm1::CreatePanels(void)
{
int col = 0, row = 0;
for(int p = 0; p < 64; p++)
{
if( (p % 8) == 0 && p > 0) row++;
Panel[p] = new TPanel(this);
Panel[p]->Parent = this;
Panel[p]->Name = "Panel" + (String)p;
Panel[p]->Caption = "";
Panel[p]->Tag = p;
Panel[p]->OnClick = PanelsClick;
Panel[p]->ParentBackground = false;
Panel[p]->Width = 48;
Panel[p]->Height = 48;
Panel[p]->Top = (row * 52) + 8;
Panel[p]->Left = (col * 52) + 8;
col++;
if( (col % 8) == 0 ) col = 0;
}
}
//---------------------------------------------------------------------------
void TForm1::RandomColors(void)
{
for(int p = 0; p < 64; p++)
{
COLORREF cPanelColor = RGB( Random(255), Random(255), Random(255) );
if(Panel[p] != NULL) Panel[p]->Color = (TColor)cPanelColor;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PanelsClick(TObject *Sender)
{
;/* do wykorzystania później */
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
RandomColors();
}
//---------------------------------------------------------------------------
Losowanie kolorów odbywa się w zdarzeniu
OnClick przycisku
Button1.
Teraz generowanie kolorów pośrednich, czyli miksowanie.
Pioter napisał(a):w programie mozna wybrac dwa kolory, kliknac na nie(jaki uzyc tu komponent by przypisac kolor do buttona?) a pozniej po wcisnieciu GENERUJ to dzieli kolor zapisany binarnie na dwie czesci i łączy na krzyz ze sobą (tu koloruje czcionke by pokazac to lepiej)
KOLOR 1 = [1234 | 5678]
KOLOR 2 = [4578 | 1743]
po wcisnieciu przycisku GENERUJ mialo by wykonac taką operacja
[1234 | 1743 ]
[4578 |5678]
Ten opis niestety nic nie mówi o sposobie miaszania. Nic z niego nie wynika. Po wybraniu dwóch kolorów (dwóch Panel-i) otrzymasz dwa kolory do mieszania. Każdy z tych kolorów będzie zbudowany z trzech składowych RGB, czyli np:
Kolor 1:
R1 = 125
G1 = 26
B1 = 78
Kolor 2:
R2 = 236
G2 = 12
B2 = 94
Trzeba mieszać, te składowe, ale według jakiego klucza chcesz to zrobić?
Ja w przykładzie wyciągnąłem średnią, ale to raczej nie to, czyli skorzystałem z takiego wzorca:
Kolor 1:
R1 = 125
G1 = 26
B1 = 78
Kolor 2:
R2 = 236
G2 = 12
B2 = 94
Zakres losowanych kolorów:
R3 = (R1 + R2) : 2
G3 = (G1 + G2) : 2
B3 = (B1 + B2) : 2
Losowanie:
R = Random(R3)
G = Random(G3)
B = Random(B3)
Co odpowiada Twojemu opisowi:
to dzieli kolor zapisany binarnie na dwie czesci i łączy
Z tym
binarnie to już przegiąłeś...
Przy mieszaniu kolory muszą być ponownie losowane, ale tylko w pewnym zakresie, więc nie można ustalić jednego koloru na sztywno, tak jak Ty to podałeś, gdyż wtedy wszystkie Panel-e miałyby jeden kolor.
Plik nagłówkowy np. Unit1.h
private:
TPanel *Panel[64];
void __fastcall PanelsClick(TObject *Sender);
void CreatePanels(void);
void RandomColors(void);
void GenerateColors(void);
int iMemGen[2];
Plik źródłowy np. Unit1.cpp
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Randomize();
CreatePanels();
RandomColors();
}
//---------------------------------------------------------------------------
void TForm1::CreatePanels(void)
{
iMemGen[0] = -1;
iMemGen[1] = -1;
int col = 0, row = 0;
for(int p = 0; p < 64; p++)
{
if( (p % 8) == 0 && p > 0) row++;
Panel[p] = new TPanel(this);
Panel[p]->Parent = this;
Panel[p]->Name = "Panel" + (String)p;
Panel[p]->Caption = "";
Panel[p]->Tag = p;
Panel[p]->OnClick = PanelsClick;
Panel[p]->ParentBackground = false;
Panel[p]->Width = 48;
Panel[p]->Height = 48;
Panel[p]->Top = (row * 52) + 8;
Panel[p]->Left = (col * 52) + 8;
col++;
if( (col % 8) == 0 ) col = 0;
}
}
//---------------------------------------------------------------------------
void TForm1::RandomColors(void)
{
for(int p = 0; p < 64; p++)
{
COLORREF cPanelColor = RGB( Random(255), Random(255), Random(255) );
if(Panel[p] != NULL) Panel[p]->Color = (TColor)cPanelColor;
}
}
//---------------------------------------------------------------------------
void TForm1::GenerateColors(void)
{
TColor cColor1 = Panel[iMemGen[0]]->Color;
TColor cColor2 = Panel[iMemGen[1]]->Color;
int R1, R2, G1, G2, B1, B2;
R1 = GetRValue(cColor1);
R2 = GetRValue(cColor2);
G1 = GetGValue(cColor1);
G2 = GetGValue(cColor2);
B1 = GetBValue(cColor1);
B2 = GetBValue(cColor2);
int R = (R1 + R2) / 2;
int G = (G1 + G2) / 2;
int B = (B1 + B2) / 2;
for(int p = 0; p < 64; p++)
{
COLORREF cPanelColor = RGB( Random(R), Random(G), Random(B) );
if(Panel[p] != NULL) Panel[p]->Color = (TColor)cPanelColor;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PanelsClick(TObject *Sender)
{
int iPGen = dynamic_cast<TPanel *>(Sender)->Tag;
if(iMemGen[0] == iPGen)
{
Panel[iPGen]->BevelWidth = 1;
iMemGen[0] = -1;
Button2->Enabled = false;
return;
}
if(iMemGen[1] == iPGen)
{
Panel[iPGen]->BevelWidth = 1;
iMemGen[1] = -1;
Button2->Enabled = false;
return;
}
if( iMemGen[0] < 0 )
{
Panel[iPGen]->BevelWidth = 10;
iMemGen[0] = iPGen;
}
else
{
if( iMemGen[1] < 0 )
{
Panel[iPGen]->BevelWidth = 10;
iMemGen[1] = iPGen;
}
}
if(iMemGen[0] >= 0 && iMemGen[1] >= 0) Button2->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
RandomColors();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
GenerateColors();
}
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.