本节中的示例创建一个选项卡控件,并将其显示在应用程序主窗口的客户区中。应用程序在选项卡控件的显示区域中显示第三个窗口(静态控件)。当父进程处理WM_SIZE消息时,父窗口可以对选项卡控件和静态控件进行位置和大小。
有七个标签,一个为一周的每一天。当用户选择选项卡时,应用程序将在静态控件中显示相应日期的名称。在此示例中使用以下全局变量。
//全局变量
HINSTANCE g_hinst; //应用程序实例的句柄
char g_achTemp[256]; //字符串的临时缓冲区
HWND g_hwndMain; //主应用程序窗口
HWND g_hwndTab; //标签控件
HWND g_hwndDisplay; //处理静态控制
//标签控件的显示区域
以下功能创建选项卡控件,并为一周中的每一天添加一个选项卡。日期的名称被定义为字符串资源,连续编号以IDS_FIRSTDAY(在应用程序的头文件中定义)开头。父窗口和标签控件都必须具有WS_CLIPSIBLINGS窗口样式。应用程序的初始化函数在创建主窗口后调用此函数。
// DoCreateTabControl - 创建一个标签控件,大小适合
//指定父窗口的客户区,并添加一些选项卡。
//返回标签控件的句柄。
// hwndParent - 父窗口(应用程序的主窗口)
HWND WINAPI DoCreateTabControl(HWND hwndParent)
{
RECT rcClient;
HWND hwndTab;
TC_ITEM tie;
int i;
//获取父窗口的客户区域的尺寸,以及
//创建一个这个大小的tab控件子窗口。
GetClientRect(hwndParent, &rcClient);
InitCommonControls();
hwndTab = CreateWindow(
WC_TABCONTROL, "",
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
0,0,rcClient.right,rcClient.bottom,
hwndParent,NULL,g_hinst,NULL
);
if (hwndTab == NULL)
return NULL;
//为每周的每一天添加标签。
tie.mask = TCIF_TEXT | TCIF_IMAGE;
tie.iImage = -1;
tie.pszText = g_achTemp;
for (i = 0; i < 7; i++) {
LoadString(g_hinst,IDS_FIRSTDAY + i,
g_achTemp, sizeof(g_achTemp));
if (TabCtrl_InsertItem(hwndTab, i, &tie) == -1) {
DestroyWindow(hwndTab);
return NULL;
}
}
return hwndTab;
}
以下函数创建占据选项卡控件的显示区域的静态控件。应用程序的初始化函数在创建主窗口和Tab控件后调用此函数。
// DoCreateDisplayWindow - 创建一个子窗口(一个静态的)
//控制)占据标签控件的显示区域。
//返回静态控件的句柄。
// hwndParent - 父窗口(应用程序的主窗口)
HWND WINAPI DoCreateDisplayWindow(HWND hwndParent)
{
HWND hwndStatic = CreateWindow("STATIC", "",
WS_CHILD | WS_VISIBLE | WS_BORDER,
0, 0, CW_USEDEFAULT, CW_USEDEFAULT,
hwndParent, NULL, g_hinst, NULL);
return hwndStatic;
}
以下是应用程序窗口过程的相关部分。该应用程序处理WM_SIZE消息以定位和调整选项卡控件和静态控件的大小。为了确定静态控件的适当位置和大小,本示例通过使用TabCtrl_AdjustRect宏将标签控件发送TCM_ADJUSTRECT消息。
当选择选项卡时,选项卡控件发送WM_NOTIFY消息,指定TCN_SELCHANGE通知消息。应用程序通过设置静态控件的文本来处理此通知消息。
// MainWindowProc - 处理主窗口类的消息。
//返回值取决于消息。
// hwnd - 窗口的句柄
// uMsg - 消息的标识符
// wParam - 消息特定的参数
// lParam - 消息特定的参数
LRESULT CALLBACK MainWindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
if(!OnCreate(hwnd))
)
{
开关(uMsg){
case WM_SIZE: {
HDWP hdwp;
RECT rc;
//计算显示矩形,假设
// tab控件是客户端区域的大小。
SetRect(& rc,0,0,
LOWORD(lParam), HIWORD(lParam));
TabCtrl_AdjustRect(g_hwndTab, FALSE, &rc);
//将标签控件设置为适合客户端区域。
hdwp = BeginDeferWindowPos(2);
DeferWindowPos(HDWP,g_hwndTab,NULL,0,0,
LOWORD(lParam),HIWORD(lParam),
SWP_NOMOVE | SWP_NOZORDER
);
//定位和调整静态控件的大小
//标签控件的显示区域,并确保
//静态控件位于Tab控件的前面。
DeferWindowPos(hdwp,
g_hwndDisplay,HWND_TOP,rc.left,rc.top,
rc.right - rc.left,rc.bottom - rc.top,0
);
EndDeferWindowPos(hdwp);
}
break;
case WM_NOTIFY:
开关(HIWORD(wParam)){
case 0:
.
. //菜单命令处理
.
case TCN_SELCHANGE: {
int iPage = TabCtrl_GetCurSel(g_hwndTab);
LoadString(g_hinst,IDS_FIRSTDAY + iPage,
g_achTemp, sizeof(g_achTemp));
SendMessage(g_hwndDisplay,WM_SETTEXT,0
(LPARAM) g_achTemp);
}
break;
}
break;
.
. //附加消息处理
.
默认:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}