Tab Control Demo

To create a tab control, specify WC_TABCONTROL as the window class and register the control by specifying the ICC_TAB_CLASSES flag in the accompanying INITCOMMONCONTROLSEX structure before calling InitCommonControlsEx().

#define _WIN32_WINNT 0x0501 #include <windows.h> #include <commctrl.h> #pragma comment(lib,"comctl32.lib") #define ID_TABCTRL 1 #define ID_EDIT 2 #define BTN_ADD 3 #define BTN_DEL 4 #define BTN_CLR 5 #define MAX_TAB_LEN 15 HWND hTab; HWND hEdit; LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; WNDCLASS wc; wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("TabControlClass"); RegisterClass(&wc); CreateWindow( TEXT("TabControlClass"), TEXT("Tab Control Demo"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 400, 230, NULL, NULL, hInstance, NULL); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CREATE: { INITCOMMONCONTROLSEX icex; // Load tab control class icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_TAB_CLASSES; InitCommonControlsEx(&icex); // Create tab control hTab = CreateWindowEx( 0, WC_TABCONTROL, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 10, 10, 210, 150, hwnd, (HMENU)ID_TABCTRL, NULL, NULL); // Edit box for tab name hEdit = CreateWindow( TEXT("EDIT"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL, 250, 20, 100, 25, hwnd, (HMENU)ID_EDIT, NULL, NULL); // Limit text length SendMessage( hEdit, EM_LIMITTEXT, MAX_TAB_LEN, 0); CreateWindow( TEXT("BUTTON"), TEXT("Add"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 250, 55, 100, 25, hwnd, (HMENU)BTN_ADD, NULL, NULL); CreateWindow( TEXT("BUTTON"), TEXT("Delete"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 250, 90, 100, 25, hwnd, (HMENU)BTN_DEL, NULL, NULL); CreateWindow( TEXT("BUTTON"), TEXT("Clear"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 250, 125, 100, 25, hwnd, (HMENU)BTN_CLR, NULL, NULL); break; } case WM_COMMAND: { switch(LOWORD(wParam)) { case BTN_ADD: { TCHAR text[32]; GetWindowText( hEdit, text, 32); if(lstrlen(text)>0) { TCITEM item; ZeroMemory( &item, sizeof(item)); item.mask = TCIF_TEXT; item.pszText = text; int count; count = TabCtrl_GetItemCount(hTab); TabCtrl_InsertItem( hTab, count, &item); } break; } case BTN_DEL: { int pos; pos = TabCtrl_GetCurSel(hTab); if(pos != -1) { TabCtrl_DeleteItem( hTab, pos); } break; } case BTN_CLR: { TabCtrl_DeleteAllItems( hTab); break; } } break; } case WM_NOTIFY: { LPNMHDR hdr; hdr=(LPNMHDR)lParam; if(hdr->idFrom == ID_TABCTRL) { if(hdr->code == TCN_SELCHANGE) { MessageBox( hwnd, TEXT("Tab changed"), TEXT("Notification"), MB_OK); } if(hdr->code == TCN_SELCHANGING) { // Tab is about to change } } break; } case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc( hwnd, msg, wParam, lParam); } return 0; }