ЛЕКЦИЯ 5
Создадим в ресурсах две формы, которые будут выполнять роль закладок:
На одной форме вставим например CHECK BOX:
Обратите внимание, что стартовая точка положения формы по Y установлена в 20. Это нужно, чтобы форма при появлении на окне не закрыла закладки окна.
На второй форма для примера нанесем два флажка:
На главной форме создадим дополнительную кнопку Форма Z, при нажатии которой будет вызываться форма с закладками:
В тексте главной программы вставим обработчик нажатия кнопки в следующем виде:
//Обработка сообщения о нажатии кнопки Форма Z
case IDC_BUTTON_ZAKL:
FormaZakladki();
break;
он вызывает процедуру открытия окна с закладками. Для примера эта процедура написана в отдельном файле с именем formaZ.c, вставленном в проект:
текст этого файла обеспечивает создание и начальное управление окном с закладками. Не пугайтесь. Внимательно прочитайте текст с пояснениями, наберите и откомпилируйте его.
Файл formaZ.c
#include <windows.h>
#include <commctrl.h>
#include "resource.h"
//нам понадобится описатель программы. Он во внешней переменной
extern HINSTANCE ghInstance;
void FormaZakladki(HWND);
//процедура обработки сообщений окна с закладками
LRESULT CALLBACK TabControlWndProc(HWND, UINT, UINT, LONG);
//процедура обработки сообщений окна одной закладки
//вообще-то у каждого окна закладки должна быть своя процедура обработки сообщений
//однако чисто для примера сдесь сделано не так
BOOL CALLBACK DialogProc(HWND hDlg, UINT Message, UINT wParam, LONG lParam);
//Текст процедуры создания окна с закладками
void FormaZakladki(HWND hWndDlg)
{
WNDCLASS WndClass;
MSG Msg;
HWND hWnd;
char szClassName[]="TabControl";
//опишем и создадим окно, в котором будут работать закладки
//далее по тексту обращайте внимание на выделенные операторы
//все остальное – обычное оконное приложение
WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc=TabControlWndProc;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hInstance=ghInstance;
WndClass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
WndClass.hCursor=LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
WndClass.lpszMenuName="";
WndClass.lpszClassName=szClassName;
if (!RegisterClass(&WndClass))
{ MessageBox(NULL,"Не регистрируется окно", "ERROR", MB_OK);
return;
}
hWnd=CreateWindow(szClassName, "Пример окна с закладками",
WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME &
~WS_MAXIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
hWndDlg, NULL, ghInstance, NULL);
if (!hWnd) {MessageBox(NULL,"Не создается окно", "ERROR", MB_OK); return;}
//инициируются элементы управления диалога, если раньше этого не делалось
//InitCommonControls();
ShowWindow(hWnd, 0);
UpdateWindow(hWnd);
while(GetMessage(&Msg, NULL, 0,0))
{ TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return;
}
//Процедура обработки сообщений окна с закладками
LRESULT CALLBACK TabControlWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam)
{
HWND hTabControlWnd;
RECT Rect;
LPNMHDR lpNMHdr;
LPTOOLTIPTEXT lpToolTipText;
static HWND hDlg = 0;
int nTab;
TC_ITEM TC_Item;
switch (Message)
{
case WM_CREATE:
//под размер созданного окна
GetClientRect(hWnd, &Rect);
//создается окно, имеющее закладки (свойство - WC_TABCONTROL)
hTabControlWnd = CreateWindow(WC_TABCONTROL, "", WS_VISIBLE |
WS_TABSTOP | WS_CHILD | TCS_TOOLTIPS,
0,0,Rect.right, Rect.bottom,
hWnd, NULL, ghInstance, NULL);
// заполняется структура закладки 1
TC_Item.mask = TCIF_TEXT;
TC_Item.iImage = 0;
TC_Item.pszText = "Страница 1";
//и закладка добавляется к окну
TabCtrl_InsertItem(hTabControlWnd, 0, &TC_Item);
// заполняется структура закладки 2
TC_Item.pszText = "Страница 2";
//и закладка добавляется к окну
TabCtrl_InsertItem(hTabControlWnd, 1, &TC_Item);
// заполняется структура закладки 3
TC_Item.pszText = "Страница 3";
TabCtrl_InsertItem(hTabControlWnd, 2, &TC_Item);
//заполняем структуру листа картинок, которые будут украшать закладки
himl = ImageList_LoadBitmap (ghInstance,
MAKEINTRESOURCE (IDB_BITMAP1),
16, //размер картинки по горизонтали в пикселях (по вертикали
// размер берется по имеющемуся рисунку
2, //число картинок в загруженном bitmape
CLR_NONE ) ;
//Привязка картинок к окну с закладками
TabCtrl_SetImageList(hTabControlWnd, himl);
//на экране создается изображение диалогового окна первой закладки
hDlg=CreateDialog(ghInstance, MAKEINTRESOURCE (IDD_ZAKL01), hTabControlWnd, DialogProc);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,Message, wParam, lParam);
}
//обобщенная процедура обработки сообщений от окон закладок
//(ничего не делает, потому и пригодна для всех)
BOOL CALLBACK DialogProc(HWND hDlg, UINT Message, UINT wParam, LONG lParam)
{
switch (Message)
{
}
return 0;
}
После компилирования, и запуска программы должно получится что-то вроде:
Обратите внимание на иконки в закладках. Они получены из ресурса bitmap с индексом IDB_BITMAP1:
Назначение параметров использованных функций, полей использованных структур смотрите, естественно, в MSDN.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.