控件–SysTabControl32-WindowsAPI论坛-WindowsAPI-津桥芝士平台

控件–SysTabControl32

使用WindowsAPI,创建SysTabControl32控件:

#include <windows.h>
#include <commctrl.h>
#pragma comment(lib, "comctl32.lib")

HINSTANCE hInst;
HWND hwndTab;  // 标签控件句柄
HWND hwndTab1, hwndTab2, hwndTab3;  // 各标签页内容的句柄

void CreateTabItemContents(HWND hwndParent) 
{
    // 创建标签页面的内容控件
    hwndTab1 = CreateWindow(
        L"STATIC", L"Content for Tab 1",
        WS_CHILD | WS_VISIBLE | SS_CENTER,
        0, 100, 300, 100,
        hwndParent, nullptr, hInst, nullptr);

    hwndTab2 = CreateWindow(
        L"STATIC", L"Content for Tab 2",
        WS_CHILD | SS_CENTER,
        0, 100, 300, 100,
        hwndParent, nullptr, hInst, nullptr);

    hwndTab3 = CreateWindow(
        L"STATIC", L"Content for Tab 3",
        WS_CHILD | SS_CENTER,
        0, 100, 300, 100,
        hwndParent, nullptr, hInst, nullptr);
}

void ShowTabContent(int tabIdx) 
{
    ShowWindow(hwndTab1, tabIdx == 0 ? SW_SHOW : SW_HIDE);
    ShowWindow(hwndTab2, tabIdx == 1 ? SW_SHOW : SW_HIDE);
    ShowWindow(hwndTab3, tabIdx == 2 ? SW_SHOW : SW_HIDE);
}


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{
    switch (msg) 
    {
    case WM_CREATE:
    {
        // 创建标签控件
        hwndTab = CreateWindowEx(
            0, WC_TABCONTROL, L"", WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
            10, 10, 360, 200, hwnd, (HMENU)1, hInst, NULL);

        TCITEM tie = { 0 };
        tie.mask = TCIF_TEXT;
        TCHAR tabNames[4][10] = { L"Tab 1", L"Tab 2", L"Tab 3" };
        for (int i = 0; i < 3; ++i) 
        {
            tie.pszText = tabNames[i];
            SendMessage(hwndTab, TCM_INSERTITEM, i, (LPARAM)(&tie));
        }

        CreateTabItemContents(hwnd);
        ShowTabContent(0);  // 默认显示第一个标签内容
    }
        break;

    case WM_NOTIFY: 
    {
        NMHDR* nmhdr = (NMHDR*)lParam;
        if (nmhdr->hwndFrom == hwndTab && nmhdr->code == TCN_SELCHANGE) 
        {
            // 当选定的标签改变时
            int selectedTab = TabCtrl_GetCurSel(hwndTab);
            ShowTabContent(selectedTab);
        }
    } 
        break;
    

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
    INITCOMMONCONTROLSEX icex;
    icex.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&icex);

    hInst = hInstance;
    WNDCLASS wc = {};

    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = L"SysTabControl32 Control";
    wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);

    if (!RegisterClass(&wc)) 
    {
        MessageBox(NULL, L"Window registration failed!", L"Error", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    HWND hwnd = CreateWindowEx(
        0, L"SysTabControl32 Control", L"SysTabControl32",
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 360, 300,
        nullptr, nullptr, hInstance, nullptr);

    if (hwnd == NULL) 
    {
        MessageBox(NULL, L"Window creation failed!", L"Error", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return static_cast<int>(msg.wParam);
}

效果图:

image

请登录后发表评论

    没有回复内容