- 注册时间
- 2013-4-19
- 最后登录
- 2026-1-21
- 阅读权限
- 200
- 积分
- 6551
- 精华
- 0
- 帖子
- 647
    
|
还可以参考 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;
}
|
|