[VC++] Tab Page immer offen halten

the incredible Leitman

Erfahrenes Mitglied
Hallo Leute :D

Ja, ich weiß eh, heute ist nicht mein Tag :p

Aber ich hoffe ihr seid trotzdem noch so motiviert mir zu helfen *gg*

Aaaalso... ich habe ein TabControl, mit 10 TabPages... das ganze läuft auf einem System mit 4 Bildschirmen... hoffe klar soweit...

Wie das bei TabControls so ist, kann man natürlich die einzelnen Pages durchklicken,
das ist eigentlich voll ok, jedoch muss ich eine kleine Sperre einbaun...

Also eine bestimmte Page (jetzt beispielsweise 1) muss IMMER offen bleiben!
Sie soll beim Start auf jeden Fall angezeigt werden und darf nicht weggeklickt werden...

Zwar soll es möglich sein, diese bestimmte Seite auf anderen Bildschirmen aufzumachen, jedoch soll sie immer mindestens einmal offen sein...
Hoffe es ist klar, was ich bezwecken möchte :)

Wie kann ich da vorgehen?
Arbeite ich am Besten mit Events? TabPageChanged? oder definiere ich irgendwie diese eine Page als "V.I.P" oder so, damit sie nicht geschlossen werden kann?

Hoffe jemand hat Ideen und eine Hilfestellung dazu, tap nämlich komplett im Dunkeln -.-

Big THX1oneone ... :p
Leitman
 
Zuletzt bearbeitet:
Aaaalso... ich habe ein TabControl, mit 10 TabPages... das ganze läuft auf einem System mit 4 Bildschirmen... hoffe klar soweit...
Da ich weiss was Du machen willst (haben ja schonmal darüber diskutiert :D),
behaupte ich mal, das dass als Beschreibung nicht ausreicht. :p

Du hast 4 TabControls (also auf jedem Bildschirm eines) und zeigst lediglich die UserControls,
die sich in den TabPages befinden, auf dem jeweilgen Bildschirm in der jeweilig aktivierten TabPage an.
Dabei kann immer nur ein UserControl auf einem Bildschirm angezeigt werden.

:D

So, nun zu deiner Frage. Also Du kannst im TabChanged Event abfragen ob deine VIP-TabPage verlassen wurde
und den Index wieder entsprechend setzen. Das hätte aber zu Folge, dass die TabPages kurtzzeitig hin und her wechseln.

Eleganter könntest das evtl. viá WndProc lösen.
C#:
protected override void WndProc(ref Message m) {
	if( m.Msg == TAB_CHANGE_REQUESTED ){
		if( this.SelectedTab.Controls[0] is MyUserControlType ) {
			//indicate msg has been processed
			m.Result = (IntPtr) 1;
		}
	}
}
Da ich sowas aber auch noch nicht gemacht habe,
musst mal selber nach der Message suchen die angibt, dass die TabPage geswiched werden soll.
Kannst ja mal zum Spaß alle Messages in die Trace schreiben und Dir im Output (Augabefenster) anschauen,
welches Messages duch die WndProc der TabPage geschickt werden.
Ich kann Dir aber nicht versprechen, dass Du eines finden wirst.
 
Also Du kannst im TabChanged Event abfragen ob deine VIP-TabPage verlassen wurde
und den Index wieder entsprechend setzen. Das hätte aber zu Folge, dass die TabPages kurtzzeitig hin und her wechseln.
Das war auch mein Bedenken -.-
Eleganter könntest das evtl. viá WndProc lösen.
C#:
protected override void WndProc(ref Message m) {
	if( m.Msg == TAB_CHANGE_REQUESTED ){
		if( this.SelectedTab.Controls[0] is MyUserControlType ) {
			//indicate msg has been processed
			m.Result = (IntPtr) 1;
		}
	}
}
MIST...das hatte ich befürchtet...

Naja, aber was solls,
irgendwann muss ich mich ja mal in diese ganze WndProc, MessageQues und WindowsMessages einlesen -.- Spätestens, wenn ich wieder die ganze Sperren gegen bestimmte Tastenkombinationen einbauen soll :(
Also warum nicht gleich jetzt? :)

...
Kannst ja mal zum Spaß alle Messages in die Trace schreiben und Dir im Output (Augabefenster) anschauen,
welches Messages duch die WndProc der TabPage geschickt werden.
*lol* Zum Spaß Was bist du denn für ein lustiger Typ *rofl* :p

Nagut, dann werd ich mich gleich mal ans Werk machen und ein bisschen im Internet stöbern, und was die MSDN ins Sachen WndProc für mich bereit hält...

Meld mich halt wieder wenn ich mehr hab...
oder genug Spaß hatte *rofl* ;-)
...
falls es jemanden interressiert... :)
 
kk erledigt... ^^

War nur schon lange nicht mehr auf Tutorials.de

Also, habs gelöst... einfach mit dem TabControl Deselecting Event ^^

Code:
C++:
//
// Das ganze gilt für ein Array von TabPages in einem Array von TabControls
// Die einzelnen Pages werden nach dem Namen überprüft,
// ich weiß, da gibts noch bessere Möglichkeiten  aber so funzts einmal :P
//
private: System::Void tabControl_Deselecting(System::Object^  sender, System::Windows::Forms::TabControlCancelEventArgs^  e) 
		{
			int count = 0;

			if (e->TabPage->Name == "tabPage0")
			{
				for each(System::Windows::Forms::TabControl^ tab in this->tabControls)
				{
					if(tab->SelectedTab->Name == "tabPage0")
					{
						count ++;
					}
				}

				if (count <= 1)
					e->Cancel = true;
			}
		}

Ist eigentlich ganz einfach... wenn mans weiß ^^
 
Ja das Event ist neu in .NET 2.0. Und da ich leider immer noch auf Arbeit mit .NET 1.1 hantieren muss, ergo noch keine großartige Erfahrung damit habe, wusste ich es leider nicht. :-( Das spricht mal wieder dafür, dass man den Objektbrowser öfter ausgiebig konsultieren sollte...
Wenigstens ist der Thread jetzt erledigt. :D
 

Neue Beiträge

Zurück