如何在主窗口中创建选项卡控件
本部分中的示例演示如何创建一个选项卡控件,并将其显示在应用程序主窗口的工作区中。 应用程序会在选项卡控件的显示区域中显示第三个窗口(静态控件)。 在处理 WM_SIZE 消息时,父窗口会定位和调整选项卡控件和静态控件的大小。
本示例中有七个选项卡,一周中的每一天各一个。 当用户选择某个选项卡时,应用程序就会在静态控件中显示相应日期的名称。
需要了解的事项
技术
先决条件
- C/C++
- Windows 用户界面编程
说明
在主窗口中创建选项卡控件
以下函数创建选项卡控件,并为一周的每一天添加一个选项卡。 日期的名称定义为字符串资源,从 IDS_SUNDAY 开始连续编号(在应用程序的资源头文件中定义)。 父窗口和选项卡控件都必须具有 WS_CLIPSIBLINGS 窗口样式。 应用程序初始化函数在创建主窗口后调用此函数。
#define DAYS_IN_WEEK 7
// Creates a tab control, sized to fit the specified parent window's client
// area, and adds some tabs.
// Returns the handle to the tab control.
// hwndParent - parent window (the application's main window).
//
HWND DoCreateTabControl(HWND hwndParent)
{
RECT rcClient;
INITCOMMONCONTROLSEX icex;
HWND hwndTab;
TCITEM tie;
int i;
TCHAR achTemp[256]; // Temporary buffer for strings.
// Initialize common controls.
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_TAB_CLASSES;
InitCommonControlsEx(&icex);
// Get the dimensions of the parent window's client area, and
// create a tab control child window of that size. Note that g_hInst
// is the global instance handle.
GetClientRect(hwndParent, &rcClient);
hwndTab = CreateWindow(WC_TABCONTROL, L"",
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
0, 0, rcClient.right, rcClient.bottom,
hwndParent, NULL, g_hInst, NULL);
if (hwndTab == NULL)
{
return NULL;
}
// Add tabs for each day of the week.
tie.mask = TCIF_TEXT | TCIF_IMAGE;
tie.iImage = -1;
tie.pszText = achTemp;
for (i = 0; i < DAYS_IN_WEEK; i++)
{
// Load the day string from the string resources. Note that
// g_hInst is the global instance handle.
LoadString(g_hInst, IDS_SUNDAY + i,
achTemp, sizeof(achTemp) / sizeof(achTemp[0]));
if (TabCtrl_InsertItem(hwndTab, i, &tie) == -1)
{
DestroyWindow(hwndTab);
return NULL;
}
}
return hwndTab;
}
以下函数创建驻留在选项卡控件的显示区域中的静态控件。 应用程序初始化函数在创建主窗口和选项卡控件后调用此函数。
请注意,静态控件位于选项卡控件的显示区域中,但它本身是选项卡控件的同级控件,而不是子控件。 这样,静态控件就能参与共享父窗口的 Tab 键顺序。 这对于静态控件来说并不重要,但如果它被按钮等键盘可访问的控件所取代,这是一种很好的做法。
// Creates a child window (a static control) to occupy the tab control's
// display area.
// Returns the handle to the static control.
// hwndTab - handle of the tab control.
//
HWND DoCreateDisplayWindow(HWND hwndTab)
{
HWND hwndStatic = CreateWindow(WC_STATIC, L"",
WS_CHILD | WS_VISIBLE | WS_BORDER,
100, 100, 100, 100, // Position and dimensions; example only.
GetParent(hwndTab), NULL, g_hInst, // g_hInst is the global instance handle
NULL);
return hwndStatic;
}
以下示例函数从应用程序的窗口过程调用。 应用程序在处理 WM_SIZE 消息时调用 OnSize
函数,以定位选项卡控件并调整其大小以适应主窗口的工作区。
选中选项卡后,选项卡控件会发送 WM_NOTIFY 消息,指定 TCN_SELCHANGE 通知代码。 应用程序的 OnNotify
函数通过设置静态控件的文本来处理此通知代码。
// Handles the WM_SIZE message for the main window by resizing the
// tab control.
// hwndTab - handle of the tab control.
// lParam - the lParam parameter of the WM_SIZE message.
//
HRESULT OnSize(HWND hwndTab, LPARAM lParam)
{
RECT rc;
if (hwndTab == NULL)
return E_INVALIDARG;
// Resize the tab control to fit the client are of main window.
if (!SetWindowPos(hwndTab, HWND_TOP, 0, 0, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), SWP_SHOWWINDOW))
return E_FAIL;
return S_OK;
}
// Handles notifications from the tab control, as follows:
// TCN_SELCHANGING - always returns FALSE to allow the user to select a
// different tab.
// TCN_SELCHANGE - loads a string resource and displays it in a static
// control on the selected tab.
// hwndTab - handle of the tab control.
// hwndDisplay - handle of the static control.
// lParam - the lParam parameter of the WM_NOTIFY message.
//
BOOL OnNotify(HWND hwndTab, HWND hwndDisplay, LPARAM lParam)
{
TCHAR achTemp[256]; // temporary buffer for strings
switch (((LPNMHDR)lParam)->code)
{
case TCN_SELCHANGING:
{
// Return FALSE to allow the selection to change.
return FALSE;
}
case TCN_SELCHANGE:
{
int iPage = TabCtrl_GetCurSel(hwndTab);
// Note that g_hInst is the global instance handle.
LoadString(g_hInst, IDS_SUNDAY + iPage, achTemp,
sizeof(achTemp) / sizeof(achTemp[0]));
LRESULT result = SendMessage(hwndDisplay, WM_SETTEXT, 0,
(LPARAM) achTemp);
break;
}
}
return TRUE;
}
相关主题