TabControl setzt Index-Werte selber?
-
Hallo C++ Fans,
ich beschäftige mich gerade sehr ausführlich mit dem TabControl und frage mich, ob ich etwas falsch mache, oder ob es normal ist, dass ich auf den Index eines neuen Tabs keinen Einfluss nehmen kann.
Beispiel:
HWND hTabControl = CreateWindow(WC_TABCONTROL,NULL,WS_CHILD|WS_VISIBLE,0,0,400,20,hParentWindow,NULL,hInstance,NULL); TCITEM TabItem; TabItem.mask = TCIF_TEXT; TabItem.pszText = "Registerkarte"; TabCtrl_InsertItem(hTabControl,100,&TabItem); //Neuen Tab mit Index 100 aufnehmen if (TabCtrl_GetItem(hTabControl,100,&TabItem) //Fragen, ob der Tab mit Index existiert { MessageBox(hParentWindow,"Alles funktioniert einwandfrei!","Funktionackelt!",MB_OK); } else { MessageBox(hParentWindow,"Hier ist eine Verschwörung im Gange!","Was ist hier los!?",MB_OK); } // Joa, else wird angesprungen ... Verschwörung ...Ich hab das weiter getestet und mir den Index vom kreirten Tab geholt, er ist 0.
Dann hab ich einen zweiten Tab mit Index 150 erstellt, er bekam Index 1.So wie ich das sehe, ist der angegebene Index beim Erstellen absolut schnurz, er wird in Insert-Reihenfolge von 0 an immer +1 vom System gegeben. Bei TabCtrl_GetItem() kann die Angabe des Index' ja noch etwas helfen, sofern man sich der InsertItem-Reihenfolge bewusst ist (der dritte erstelle Tab, Index 2 etc).
Wofür soll ich den Index dann aber bitte beim erstellen angeben, wenn er eh schnuppe ist?
Gibt es da einen tieferen Sinn und ich bin als 16jähriger noch nicht im Stande ihn zu erkennen?
Ich hoffe mir kann das einer näherbringen.lg und Thx im Voraus,
MaxPost Scriptum:
Ich denke das beste ist, TabCtrl_InsertItem() mit dem Index TabCtrl_GetItemCount() zu nutzen, so wird der neue Tab auch als letzter angezeigt.
Ich muss mich nämlich verbessern:
Wenn man drei Tabs erstellt (0,1,2) und jetzt einen neuen mit Index 0, dann wird dieser ganz nach vorn, also vor alle anderen geschoben. Das heißt wiederum, der Index bei TabCtrl_InsertItem() ist doch zu was nütze: dem primitiven ordnen
Insgesamt finde ich das WC_TABCONTROL wirklich ziemlich vergabelt, aber jedem das seine.
In diesem Sinne werde ich meine Gedanken nun auch wieder ordnen und wünsche Euch eine gute Nacht!

-
1. Was Du als Index angibst ist der Wunsch Index. Der reale Index wird dir von der Funktion zurückgegeben. Siehe
http://msdn2.microsoft.com/en-us/library/bb760678(VS.85).aspx
2. Die bisherigen n Tabs werden von 0, bis n-1 durchnummeriert. Wenn Du einen Wert größer n-1 angibst wird der neue Tab mit dem Index n am Ende eingefügt.
Ginst Du einen Wert kleiner n an, dann wird der Tab eingefügt und alle anderen Tabs nach hinten verschoben.Dieses Verhalten ist Standard bei alen Controls (Listview, ListBox, ComboBox, ComboBoxEx etc.).
-
Aha, vielen Dank für die Erläuterung!

Mein eigentlicher Wunsch war es absolute IDs zu setzen die nichts mit der Reihenfolge der Tabs zu tun haben.
Ich hab mir hier folgende Funktion geschrieben:
ID und IDTemp sind beide Zeiger vom Typ int
void CTabControl::Insert(char *Text) { memset(&TabItem,0,sizeof(TCITEM)); TabItem.mask = TCIF_TEXT; TabItem.pszText = Text; TabCtrl_InsertItem(hWnd,TabCtrl_GetItemCount(hWnd),&TabItem); if (IDs <= 0) { ID = new int[1]; ID[0] = atoi(Text); IDs = 1; } else { IDTemp = new int[(IDs+1)]; for (i = 0; i < IDs; i++) IDTemp[i] = ID[i]; IDTemp[i] = atoi(Text); delete[] ID; ID = new int[(IDs+1)]; for (i = 0; i < IDs; i++) ID[i] = IDTemp[i]; delete[] IDTemp; IDs++; } }So, wenn ich den ersten Tab erstelle funktioniert das auch wunderbar, dann hat ID[0] nachweislich den Wert atoi(Text), aber danach bekomme ich immer wieder eine riesige negative Zahl (-1163005939) als ID eingetragen und ich verstehe nicht wieso.
Wahrscheinlich mache ich einen simplen Fehler, doch erkennen kann ich ihn leider nicht ...

Ich freue mich auf Eure Gedanken
lg Max
-
MaDsTyLe schrieb:
Ich freue mich auf Eure Gedanken
Die riesige negative Zahl ist eine verschlüsselte Botschaft. Rechne sie mal um zu einer 32-bit-Hexadezimalzahl.
-
Gerne ... nur wie mach ich das?

lg Max
-
Absolute IDs für die Tabs würde ich dem Element "lParam" der TC_ITEM Struktur mit auf den Weg geben. Das mach ich zumindest immer wenn es sich um Listviews oder Treeviews handelt und die Element ein Tabcontrol unterscheiden sich da nicht wesentlich, so kannst du gewärleisten daß jeder Tab seine einzigartigen ID hat unabhängig wo er sich gerade befindet.
-
Danke! Mit der zusätzlichen Angabe von TCIF_PARAM in TCITEM::mask funktioniert das perfekt!
Falls das jemandem nochmal helfen sollte, hier die ganze Klasse:
CTabControl.h
#include <windows.h> #include <commctrl.h> class CTabControl { private: TCITEM TabItem; public: HWND hWnd; int ActiveTab; CTabControl(void); bool Create(HINSTANCE hInstance,DWORD dwStyle,HWND Parent); void Move(int x,int y,int width,int height); void Insert(int Index,char *Text); bool TabExists(int Index); int GetActiveTab(void); bool Delete(int Index); };CTabControl.cpp
#include "CTabControl.h" CTabControl::CTabControl() { memset(&TabItem,0,sizeof(TCITEM)); hWnd = NULL; ActiveTab = -1; } bool CTabControl::Create(HINSTANCE hInstance,DWORD dwStyle,HWND Parent) { hWnd = CreateWindow(WC_TABCONTROL,NULL,dwStyle,0,0,0,0,Parent,NULL,hInstance,NULL); if (hWnd == NULL) return false; return true; } void CTabControl::Move(int x,int y,int width,int height) { MoveWindow(hWnd,x,y,width,height,true); } void CTabControl::Insert(int Index,char *Text) { TabItem.mask = TCIF_PARAM|TCIF_TEXT; TabItem.lParam = Index; TabItem.pszText = Text; TabCtrl_InsertItem(hWnd,TabCtrl_GetItemCount(hWnd),&TabItem); } bool CTabControl::TabExists(int Index) { for (int i = 0; i < TabCtrl_GetItemCount(hWnd); i++) { TabCtrl_GetItem(hWnd,i,&TabItem); if (TabItem.lParam == Index) return true; } return false; } int CTabControl::GetActiveTab() { ActiveTab = TabCtrl_GetCurSel(hWnd); return ActiveTab; } bool CTabControl::Delete(int Index) { for (int i = 0; i < TabCtrl_GetItemCount(hWnd); i++) { TabCtrl_GetItem(hWnd,i,&TabItem); if (TabItem.lParam == Index) return TabCtrl_DeleteItem(hWnd,i); } return false; }Der Parameter Index steht immer für den absoluten Index.
Vielen Dank nochmal!
lg Max