I will keep it simple
The attached sample contains complete source for the example.
In your Main window proc (the parent of the tab control) is where you will create the control
;##### Create Tab Control invoke CreateWindowEx, WS_EX_CONTROLPARENT, \ offset szWndClsTab, \ NULL, \ WS_CHILD or WS_VISIBLE or TCS_FOCUSONBUTTONDOWN, \ 5, 5, \ 590, 440, \ hWin, NULL, \ hInst, NULL mov hTab, eax mov esi, eax ;##### Add the tabs invoke HeapAlloc, hHeap, HEAP_ZERO_MEMORY, sizeof TCITEM mov ebx, eax ;##### Tab 1 mov (TCITEM PTR [ebx]).imask, TCIF_TEXT mov (TCITEM PTR [ebx]).pszText, offset sz1stTab invoke SendMessage, esi, TCM_INSERTITEM, 1, ebx ;##### Tab 2 mov (TCITEM PTR [ebx]).pszText, offset sz2ndTab invoke SendMessage, esi, TCM_INSERTITEM, 2, ebx ;##### Create windows for tabs ;##### Tab #1 window invoke CreateWindowEx, WS_EX_CONTROLPARENT, \ offset szWndClsTab1, \ NULL, \ WS_CHILDWINDOW or WS_VISIBLE, \ LEFT_TAB_CHILD, TOP_TAB_CHILD, \ WIDTH_TAB_CHILD, HEIGHT_TAB_CHILD, \ hTab, NULL, \ hInst, NULL mov hTab1, eax ;##### Tab #2 window invoke CreateWindowEx, WS_EX_CONTROLPARENT, \ offset szWndClsTab2, \ NULL, \ WS_CHILDWINDOW or WS_VISIBLE, \ LEFT_TAB_CHILD, TOP_TAB_CHILD, \ WIDTH_TAB_CHILD, HEIGHT_TAB_CHILD, \ hTab, NULL, \ hInst, NULL mov hTab2, eax mov WhichTabChosen, 0 invoke ShowWindow, hTab2, SW_HIDE
When creating the tabs, you will notice that I fill in the structure fields that are needed for the first tab, then for the second tab, only change
the displayed string for the second tab. You do not have to fill all the structure fields for each tab since the structure keeps the info between SendMessage Calls.
WhichTabChosen will be how we keep track of.... take a guess.... Which tab was chosen. I NEVER create variable names like a, b, etc... Make your variable names descriptive so you know
exactly what it is for.
When your main window is displayed, the last tab window created will be the one visible, so I just hide it.
Now, the "magic" happens in WM_NOTIFY
.elseif eax == WM_NOTIFY ;##### This is where the "magic" happens mov eax, lParam mov eax, (NMHDR ptr [eax]).code .if eax == TCN_SELCHANGE mov ebx, WhichTabChosen mov eax, [TabHandles + ebx * 4] invoke ShowWindow, eax, SW_HIDE invoke SendMessage, hTab, TCM_GETCURSEL, 0, 0 mov WhichTabChosen, eax mov ebx, [TabHandles + eax * 4] invoke ShowWindow, ebx, SW_SHOW .endif
We will only handle the TCH_SELCHANGE message in this example, but WM_NOTIFY is where you can prevent a tab from changing, check which tab the user is leaving etc.
TabHandles is a structure to hold our tab handles to make it easier to change...
line 7 - 8 we get the handle from our struct of the tab that HAD the selction and hide it
line 9 - 12 we get the index of the selected tab, get its handle from our struct and show it.
Attached File(s)
-
Tab Control.zip (4.15K)
Number of downloads: 484