创建制表控件

【勇芳软件工作室】汉化HomePreviousNext

本节中的示例创建一个选项卡控件,并将其显示在应用程序主窗口的客户区中。应用程序在选项卡控件的显示区域中显示第三个窗口(静态控件)。当父进程处理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;

}