automatyczny rozmiar Label'a

0

Mam pewien problem natury nie tyle duchowo-algorytmicznej, co kosmetycznej (żeby program ładnie wygladał)

Stworzyłem kontrolkę, na ktorej mam Label. Szerokość kontrolki jest ściśle okreslona, więc i labela też. Jako tekst labela zadany bedzie string, o niemożliwej do przewidzenia z góry długości. Jak zrobić tak, żeby wysokość labela dostosowywała się do ilości linijek potrzebnych do wyswietlenia danego stringa w całości?
Brzmi zawile, wiec podam przykład:
label ma 100 pixeli szerokości. Jeżeli jako Text zadam string treści 'abc', to spokojnie zmieści się w jednej linijce. Jeżeli zadam "sdfjsbnkjbgsjkdfgkjdsgnfkdjsfngksdnfgsdgfdgsdfg" to bedzie potrzebne np 5 czy 6 linijek. Muszę określić jaką wysokość ma kontrolka po zadaniu stringa. Coś jak AutoSize, tylko w pionie. Oczywiście AutoEllipse mam ustawione na true.

0

Po pierwsze to to nie moze być label tylko np. richTextBox (żeby można było w tym pisać). Po drugie musimy dodać do tego richTextBoxa zdarzenie:

this->richTextBox1->TextChanged += gcnew System::EventHandler(this, &Form1::txtBox1_textChanged);

A w treści zdarzenia:

                System::Void txtBox1_textChanged(System::Object ^,System::EventArgs ^)
		{
			int pixels = 1; //aktualna ilosc pixeli zajmowana przez wszystkie litery
			int old = 1; //ilosc linijek do tej pory + 1

			for (int i = 0; i < richTextBox1->TextLength; ++i) //zliczanie wszystkich pixeli
			{
                                //kazdemu znakowi nalezy najpierw nadac ilosc zajmowana przez ten znak pixeli:
				switch (richTextBox1->Text[i]) 
				{
				case '0':
					pixels += 5;
                                case 'i':
                                         pixels += 1;
					// ...
				case 'Z':
					pixels += 5;
                                case default:
                                        pixels += 6; //dziala dla min. literek 'a' i 'b'
				}

				if (int(pixels / (richTextBox1->Width - 5)) >= old) //czy przechodzimy do nowej lini
				{
					pixels += 2;
					++old;
				}

				label1->Text = pixels.ToString();
			}

			label2->Text = richTextBox1->Width.ToString();

                        //ustawienie szerokosci
			richTextBox1->Height = 14 * int((pixels) / (richTextBox1->Width - 5)) + 20; 
		}

Pozdr. Btw to jest taki kod na szybko więc nie był za dlugo testowany ale mniej więcej o to chodzi ;p

0

Rozwiązanie wydaje się w porządku, chociaż jest średnio eleganckie (ale ważne żeby działało). Będę nad tym jeszcze pracował, ale dzięki za podpowiedź ;]

btw. ten kod to chyba bardziej w c++ niż C#, ale algorytm powinien dać radę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1