[VC++] TabControl SizeMode

  • #1
L

leitman

Mitglied
Themenersteller
Dabei seit
19.07.2006
Beiträge
7
Reaktionspunkte
0
Hallo zusammen :)

Ich habe ein Problem mit TabControls:
Habe eine Anwendung, die ein TabControl mit standartmäßig 4 Pages besitzt,
bei der der User mittels Buttons Pages hinzufügen / entfernen kann.
Nun möchte ich die Page(Header, also das, wo TabPage1 usw. steht) an die Größe des Controls anpassen.

Das Problem ist, das die Eigenschaft SizeMode->FillToRight erst in Kraft tritt, wenn eine 2.Reihe Pages vorhanden ist, bei meiner Anwendung soll die Länge der Pages aber immer angepasst werden!

Wie kann ich das lösen?
Ich denke, eine Möglichkeit wäre, ein eigenes TabControl von der TabControl Klasse abzuleiten und das Propery zu überschreiben.
Aber das kann ich nicht, habe zwar bereits CustomControls erstellt und damit gearbeitet, aber hier komme ich nicht weiter :(
Habe auch schon danach gegoogelt, aber nichts brauchbares gefunden und die MSDN hat mir auch nicht weitergeholfen,

BITTE, weiß hier irgendjemand weiter?
steh komplett im Dunkeln

[MSVS 2005 Pro Ed]
 
  • #2
Aber das kann ich nicht, habe zwar bereits CustomControls erstellt und damit gearbeitet, aber hier komme ich nicht weiter

Wie Du von TabControl ableitest, weisst Du ja sicher: Automatisch kannst Du es z.B. wie bei einem User Control machen: Rechtsklick auf Dein Projekt im Solution Explorer, Add ... New Item, User Control wählen, Namen eingeben, OK. Dann->System::Windows::Forms::UserControl' durch->System::Windows::Forms::TabControl' ersetzen und die Zeile mit->AutoScaleMode' löschen).

Ich denke, eine Möglichkeit wäre, ein eigenes TabControl von der TabControl Klasse abzuleiten und das Propery zu überschreiben.

Das bringt nichts, im Property wird bloß sizeMode (privat) gesetzt bzw. ausgelesen. Nur kümmern sich die für die grafische Darstellung des Controls zuständigen Funktionen nicht darum, wenn nur eine TabPage vorhanden ist. Könnte man wohl als Bug bezeichnen.

Du müsstest also entweder selbst zeichnen (wäre etwas aufwändig) oder einen Workaround finden. Da fällt mir aber auch nur die Möglichkeit ein, SizeMode auf fixed zu setzen und die Breite der TabPage so anzupassen, dass sie die gesamte Breite einnimmt. Natürlich nur in dem Moment, in dem nur eine TabPage angezeigt wird. Wenn dann welche hinzugefügt werden, SizeMode wieder auf FillToRight setzen.

Falls Du es in einer abgeleiteten Klasse machen willst (Du kannst SizeMode aber natürlich auch ohne eigene Klasse einfach von außen setzen) so ähnlich:

Code:
// ...
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>

void InitializeComponent(void)
{
  this->SuspendLayout();
  this->ControlAdded += gcnew System::Windows::Forms::ControlEventHandler(this, &DeinTabControl::controlAdded);
  this->ControlRemoved += gcnew System::Windows::Forms::ControlEventHandler(this, &DeinTabControl::controlRemoved);
  this->ResumeLayout(false);
}
#pragma endregion

private:
  System::Void controlAdded(System::Object^  sender, System::Windows::Forms::ControlEventArgs^  e) {
    fixSize();
  }

  System::Void controlRemoved(System::Object^  sender, System::Windows::Forms::ControlEventArgs^  e) {
    fixSize();             
  }
  
  System::Void fixSize() {  
    if(TabCount == 1)
      SizeMode = TabSizeMode::Fixed;
    else
      SizeMode = TabSizeMode::FillToRight;
  }
};

// ...

Die Größe (ItemSize) setzt Du entweder in->fixSize' oder einfacher noch gleich beim Erzeugen/Initialisieren der TabControl:
deinTabControl->ItemSize = System::Drawing::Size([breite], [höhe]);
Also die Breite so wählen, dass die TabPage die korrekte (volle) Breite hat. Wenn dann auf TabSizeMode::Fixed umgeschaltet wird, müsste dieser Wert herangezogen werden. Bei TabSizeMode::FillToRight wird wieder alles automatisch berechnet, falls Multiline true ist. Ich setze dabei natürlich voraus, dass die Größe des TabControls sich nicht zur Laufzeit ändert ...

Ohne Gewähr ;) ...
 
  • #3
Hey, DANKE! :D

Habe es inzwischen auch über TabSizeMode::Fixed gelöst, folgendermaßen:
Code:
// 
// tabControl1
//

// save all ScreenProperties in an array
array<Screen^>^screens = Screen::AllScreens;
rec = screens[i]->Bounds;

// set Size to Screen Size:
this->tabControl1->Size = System::Drawing::Size(rec->size);
this->tabControl1->Location = System::Drawing::Point(rec->Location);

this->tabControl1->SizeMode = System::Windows::Forms::TabSizeMode::Fixed;
// set ItemSize ... -5 to avoid those left /  right Buttons on the top of the TabControl
this->tabControl1->ItemSize = System::Drawing::Size(this->tabControl1->Width/this->tabControl1->TabPages->Count-5, 30);
...
..

Natürlich nur in dem Moment, in dem nur eine TabPage angezeigt wird. Wenn dann welche hinzugefügt werden, SizeMode wieder auf FillToRight setzen
das war ja mein Problem, FillToRight funktioniert nur, wenn ich eine 2. Reihe von Pages habe,
da ich aber mit einer Auflösung von 6400x1200 arbeite, brauche ich keine 2. Reihe sondern nur eine!
Aber die Idee mit fixed wa gut, habs jetzt auch so gelöst (s.o.)
Danke für deine Hilfe

Ahja, und dein Code:
könnte man den so nicht kürzer schreiben :  ;)

Code:
void InitializeComponent(void)
{
  this->SuspendLayout();
  this->ControlAdded += gcnew System::Windows::Forms::ControlEventHandler(this, &DeinTabControl::fixSize);
  this->ControlRemoved += gcnew System::Windows::Forms::ControlEventHandler(this, &DeinTabControl::fixSize);
  this->ResumeLayout(false);
}
#pragma endregion

private:
  System::Void fixSize(System::Object^  sender, System::Windows::Forms::ControlEventArgs^  e) 
 {
    if(TabCount == 1)
      SizeMode = TabSizeMode::Fixed;
    else
      SizeMode = TabSizeMode::FillToRight;

  }
};

// ...


c ya, mfG

Leitmen
 
  • #4
erst in Kraft tritt, wenn eine 2.Reihe Pages vorhanden

Ich habe hier Reihe überlesen und gleich an den von mir beschriebenen Bug gedacht (bei einer TabPage wirkt FillToRight nicht mehr, auch wenn Multiline gesetzt ist). Na ja, zumindest die Richtung stimmte grob :).

könnte man den so nicht kürzer schreiben

Schon, aber ich wähle auch bei solchen Kleinigkeiten meist die Alternative, bei der sich das Ganze lokal erweitern lässt (hier also separat bei Add/Remove), ohne dass man auf einer höheren Ebene etwas ändern muss.
 
  • #5
OK, schon verstanden :D

Ich danke dir vielmals, war mir wirklich eine große Hilfe *gg*
Kann ich in diesem Forum den Thread irgendwie als erledigt markieren, hab alles was ich brauche DANKESCHÖN! :)
 
  • #6
leitman schrieb:
Kann ich in diesem Forum den Thread irgendwie als erledigt markieren

Klar, hast Du doch im anderen Thread (VC++ Forms dynamisch erstellen ) auch gemacht, glaube ich. Wie es geht, kann ich Dir aber nicht sagen, nur dass es geht (habe noch nie in diesem Forum ein Thema erstellt). Finde ich übrigens gut, dass Du das machst bzw. fragst, denn manchmal antwortet man und weiß dann nicht, ob man nun geholfen oder bloß den Grad der Verwirrung erhöht hat (z.B. weil die Antwort nicht ganz zur Frage passte? ;)), da weder geantwortet noch der Thread als erledigt markiert wurde.
 
  • #7
:D
Freut mich, dass es dir gefällt *rofl* *lol*

Verdammt bin ich blöd... :'(
links unten ist ein Button (nicht unbedingt groß, aber doch gut lesbar) auf dem steht erledigen

naja... werd ich den halt mal drücken
 
Thema:

[VC++] TabControl SizeMode

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.963
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben