asysbang

 找回密码
 立即注册
查看: 3992|回复: 0
打印 上一主题 下一主题

tabcontrol

[复制链接]

520

主题

2

好友

6551

积分

管理员

Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

最佳新人 活跃会员 热心会员 推广达人 宣传达人 灌水之王 突出贡献 优秀版主 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2019-9-26 11:23:58 |只看该作者 |倒序浏览
还可以参考 http://www.doc88.com/p-7768260467725.html




/*
* TabDemo.cpp
*
*  Created on: 2019年9月26日
*      Author: chaotian
*/

#include <iostream>
#include <windows.h>
#include <commctrl.h>
#include <winuser.h>

using namespace std;
HINSTANCE hInst;
HWND Page[100];

LRESULT CALLBACK Page2Proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
        HDC hdc;
        PAINTSTRUCT ps;
        switch (message) {
        case WM_PAINT: {
                hdc = BeginPaint(hWnd, &ps);
                //////////////代码位置/////////////////
//                Graphics graphics(hdc);
//                graphics.SetSmoothingMode(SmoothingModeAntiAlias);//反锯齿设置
//                Pen      pen(Color(255, 255, 0, 255));
//                graphics.DrawLine(&pen, 100, 200, 200, 100);
                TextOut(hdc, 140, 135, TEXT("tab2"), lstrlen(TEXT("tab2")));
                //graphics.DrawRectangle(&pen, 100, 100, 200, 200);
                ////////////////////////////////////
                EndPaint(hWnd, &ps);
        }
                return 0;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
}
LRESULT CALLBACK Page1Proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
        HDC hdc;
        PAINTSTRUCT ps;
        switch (message) {
        case WM_CREATE:
                cout << "=====page 1 create "<<endl;
                return 0;
        case WM_PAINT: {
                hdc = BeginPaint(hWnd, &ps);
                cout << "=====page 1 WM_PAINT "<<endl;
                //////////////代码位置/////////////////
                ////////////////////////////////////
                TextOut(hdc, 140, 135, TEXT("tab1"), lstrlen(TEXT("tab1")));
                EndPaint(hWnd, &ps);
        }
                return 0;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
}
//功能:向Tab中添加标签
int InsertTabItem(HWND hTab, LPTSTR pszText, int iid) {
        TCITEM ti = { 0 };
        ti.mask = TCIF_TEXT;
        ti.pszText = pszText;
//        ti.cchTextMax = wcslen(pszText);
        return (int) SendMessage(hTab, TCM_INSERTITEM, iid, (LPARAM) &ti);
}
ATOM RegisterPageClass() {
        WNDCLASSEX wcex;

        wcex.cbSize = sizeof(WNDCLASSEX);
        wcex.style = CS_HREDRAW | CS_VREDRAW;
        wcex.cbClsExtra = 0;
        wcex.cbWndExtra = 0;
        wcex.hInstance = hInst;
        wcex.hIcon = NULL;
        wcex.hIconSm = NULL;
        wcex.lpszMenuName = NULL;
        wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
        wcex.lpszClassName = TEXT("Page");
        wcex.lpfnWndProc = DefWindowProc;
        return RegisterClassEx(&wcex);
}

HWND CreatePageWnd(HWND hTab, WNDPROC PageWndProc) {
        RECT rcTabDisplay;
        //获取Tab控件客户区的的大小(Tab窗口坐标系)
        GetClientRect(hTab, &rcTabDisplay);                //获取Tab窗口的大小(而不是在屏幕坐标系中)
        TabCtrl_AdjustRect(hTab, FALSE, &rcTabDisplay);                //通过窗口大小,获取客户区大小。
        //创建与Tab控件客户区大小的画布
        HWND hPage = CreateWindowEx(
        NULL,                //window extend Style
                        TEXT("Page"),   // window class name
                        NULL,  // window caption
                        WS_CHILD,      // window style
                        rcTabDisplay.left,            // initial x position
                        rcTabDisplay.top,            // initial y position
                        rcTabDisplay.right,            // initial x size
                        rcTabDisplay.bottom,            // initial y size
                        hTab,                     // parent window handle
                        NULL,                     // window menu handle
                        hInst,                // program instance handle
                        NULL);                    // creation parameters
        SetWindowLongPtr(hPage, GWLP_WNDPROC, (LONG_PTR) PageWndProc);                    //子类化窗口
        return hPage;
}

BOOL addPage(HWND hTab, LPTSTR strPageLabel, WNDPROC PageWndProc) {
        static int iPageIndex = 0;
        InsertTabItem(hTab, strPageLabel, iPageIndex);
        HWND hPage = CreatePageWnd(hTab, PageWndProc);
        Page[iPageIndex++] = hPage;
        return TRUE;
}

BOOL InitPages(HWND hTab) {
        RegisterPageClass();
        addPage(hTab, TEXT("Page1"), Page1Proc);
        addPage(hTab, TEXT("Page2"), Page2Proc);
        addPage(hTab, TEXT("Page3"), Page2Proc);
        return TRUE;
}

HWND InitTabControl(HWND hParentWnd, HWND hWndFocus, LPARAM lParam) {
        // 创建TabControl控件,其实就是一个子窗口和该窗口上的标签,这些标签是Tab控件具有的,但没有与具体的页面相连,只是Tab控件的特有属性而已。
        //////////////////////////////创建Tab控件/////////////////////////////////////////////////////
        RECT rc;
        GetClientRect(hParentWnd, &rc);
        HWND hTab = CreateWindowEx(0, WC_TABCONTROL, 0,
        TCS_FIXEDWIDTH | WS_CHILD | WS_VISIBLE, rc.left + 2, rc.top + 2, rc.right - 4, rc.bottom - 4, hParentWnd, NULL, hInst, 0);
        // Set the font of the tabs to a more typical system GUI font
        SendMessage(hTab, WM_SETFONT, (WPARAM) GetStockObject(DEFAULT_GUI_FONT), 0);
        //根据页面来初始化页面
        InitPages(hTab);
        ShowWindow(Page[0], SW_SHOW);        //显示第一个页面
        return hTab;
}

//三种窗口状态:SIZE_MINIMIZE,SIZE_MAXIMIZE,SIZE_RESTORED
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
        static HWND hTab;

        switch (message) {
        case WM_CREATE:
                hTab = InitTabControl(hWnd, NULL, lParam);        //主窗口创建的时候,同时创建Tab子窗口
                break;
        case WM_SIZE:        //改变完成之后
                HIWORD(lParam); //客户区Height
                LOWORD(lParam); //Width
                RECT rcTab;
                // 缩放Tab
                //HIWORD(lParam)-----hWnd height,LOWORD(lParam)-----hWnd width
                MoveWindow(hTab, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
                //缩放Page
                GetClientRect(hTab, &rcTab);
                TabCtrl_AdjustRect(hTab, FALSE, &rcTab);
                for (int i = 0; i < TabCtrl_GetItemCount(hTab); i++)
                        MoveWindow(Page, rcTab.left, rcTab.top, rcTab.right, rcTab.bottom, TRUE);
                break;
        case WM_NOTIFY:                //WM_NOTIFY消息中,lParam是一个NMHDR结构,code字段是具体通知消息,hwndFrom是发出通知的窗口Handle
                switch (((LPNMHDR) lParam)->code) {
                case TCN_SELCHANGING:                //Tab改变前
                {
                        int iPage = TabCtrl_GetCurSel(hTab);
                        ShowWindow(Page[iPage], SW_HIDE);
                        return FALSE;
                }
                case TCN_SELCHANGE:                //Tab改变后
                {
                        int iPage = TabCtrl_GetCurSel(hTab);
                        ShowWindow(Page[iPage], SW_SHOW);
                        return TRUE;
                }
                }
                break;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
        HWND hWnd;
        MSG msg;
        WNDCLASS wndClass;
        hInst = hInstance;
        wndClass.style = CS_HREDRAW | CS_VREDRAW;
        wndClass.lpfnWndProc = MainWndProc;
        wndClass.cbClsExtra = 0;
        wndClass.cbWndExtra = 0;
        wndClass.hInstance = hInstance;
        wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
        wndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
        wndClass.lpszMenuName = NULL;
        wndClass.lpszClassName = TEXT("GettingStarted");
        RegisterClass(&wndClass);
        hWnd = CreateWindow(
                        TEXT("GettingStarted"),                // window class name
                        TEXT("Getting Started"),// window caption
                        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,// window style
                        CW_USEDEFAULT,// initial x position
                        CW_USEDEFAULT,// initial y position
                        CW_USEDEFAULT,// initial x size
                        CW_USEDEFAULT,// initial y size
                        NULL,// parent window handle
                        NULL,// window menu handle
                        hInstance,// program instance handle
                        NULL);// creation parameters
        ShowWindow(hWnd, iCmdShow);
        UpdateWindow(hWnd);
        while (GetMessage(&msg, NULL, 0, 0)) {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
        return msg.wParam;
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|aSys-帮 ( 京ICP备13033689号 )

GMT+8, 2026-1-28 20:53 , Processed in 0.043995 second(s), 19 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部