2. Открыть файл Buttons.cpp, нажать сочетание клавиш Ctrl+F для вызова РѕРєРЅР° РїРѕРёСЃРєР°, ввести строку case WM_CREATE Рё найти место РІ РєРѕРґРµ, РіРґРµ используется этот текст. Ртот блок РєРѕРґР° выглядит так, как показано РІ листинге 4.13.
Листинг 4.13
case WM_CREATE:
g_hwndCB = CreateRpCommandBar(hWnd);
memset (&s_sai, 0, sizeof (s_sai));
s_sai.cbSize = sizeof (s_sai);
break;
3.В Ртот блок РєРѕРґР° обрабатывает событие создания формы. Р’ этот момент РЅР° форме создается полоса меню. Р’ этот блок РєРѕРґР° Р±СѓРґСѓС‚ добавлены строки, создающие РЅР° форме РєРЅРѕРїРєРё. Данный блок РєРѕРґР° нужно изменить так, как это показано РІ листинге 4.14. Листинг 4.14
case WM_CREATE:
g_hwndCB = CreateRpCommandBar(hWnd);
memset (&s_sai, 0, sizeof (s_sai));
s_sai.cbSize = sizeof (s_sai);
CreateWindow(TEXT (В«BUTTONВ»), TEXT (В«ButtonВ»),
BS_PUSHBUTTON | BS_NOTIFY | WS_VISIBLE | WS_CHILD,
10, 20, 100,25, hWnd, (HMENU)200, g_hInst, NULL);
CreateWindow(TEXT (В«BUTTONВ»), TEXT (В«CheckBoxВ»),
BS_CHECKBOXВ | WS_VISIBLE | WS_CHILD,
10, 50, 100,25, hWnd, (HMENU)201, g_hInst, NULL);
CreateWindow(TEXT (В«BUTTONВ»), TEXT (В«AutoCheckВ»),
BS_AUTOCHECKBOXВ | WS_VISIBLE | WS_CHILD,
10, 80, 100, 25, hWnd, (HMENU)202, g_hInst, NULL);
CreateWindow(TEXT (В«BUTTONВ»), TEXT (В«AutoChec_3StateВ»),
BS_AUTO3STATE | WS_VISIBLE | WS_CHILD,
10, 110, 100, 25, hWnd, (HMENU)203, g_hInst, NULL);
CreateWindow(TEXT (В«BUTTONВ»), TEXT (В«RadioButton1В»),
BS_AUTORADIOBUTTON | WS_VISIBLE | WS_CHILD,
10, 140, 100, 25, hWnd, (HMENU)204, g_hInst, NULL);
CreateWindow(TEXT (В«BUTTONВ»), TEXT (В«RadioButton2В»),
BS_AUTORADIOBUTTON | WS_VISIBLE | WS_CHILD,
10, 170, 100, 25, hWnd, (HMENU)205, g_hInst, NULL);
CreateWindow(TEXT (В«BUTTONВ»), TEXT (В«OwnerDrawButtonВ»),
BS_PUSHBUTTON | BS_OWNERDRAW | WS_VISIBLE | WS_CHILD,
10, 200, 100, 25, hWnd, (HMENU)206, g_hInst, NULL);
CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, TEXT (В«BUTTONВ»), TEXT (В«ButtonВ»),
BS_PUSHBUTTON | BS_NOTIFY | WS_VISIBLE | WS_CHILD,
125, 20, 100,25, hWnd, (HMENU)207, g_hInst, NULL);
CreateWindowEx(WS_EX_WINDOWEDGE, TEXT (В«BUTTONВ»), TEXT (В«ButtonВ»),
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
125, 50, 100,25, hWnd, (HMENU)208, g_hInst, NULL);
CreateWindowEx(WS_EX_STATICEDGE, TEXT (В«BUTTONВ»), TEXT (В«ButtonВ»),
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
125, 80, 100, 25, hWnd, (HMENU)209, g_hInst, NULL);
CreateWindowEx(WS_EX_TOOLWINDOW, TEXT (В«BUTTONВ»), TEXT (В«ButtonВ»),
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
125, 110, 100, 25, hWnd, (HMENU)210, g_hInst, NULL);
CreateWindowEx(WS_EX_CLIENTEDGE, TEXT (В«BUTTONВ»), TEXT (В«ButtonВ»),
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_BORDER,
125, 140, 100, 25, hWnd, (HMENU)211, g_hInst, NULL);
CreateWindowEx(WS_EX_CLIENTEDGE, TEXT (В«BUTTONВ»), TEXT (В«ButtonВ»),
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_CAPTION,
125, 170, 100, 25, hWnd, (HMENU)212, g_hInst, NULL);
CreateWindowEx(WS_EX_CLIENTEDGE, TEXT (В«BUTTONВ»), TEXT (В«ButtonВ»),
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_OVERLAPPED,
125, 200, 100, 25, hWnd, (HMENU)213, g_hInst, NULL);
break;
4. Следующий за этим блок кода, обрабатывающий событие прорисовки формы, приведен в листинге 4.15. Листинг 4.15
case WM_PAINT:
RECT rt;
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rt);
FillRect(hdc, &rt, CreateSolidBrush(0xFFFF00));
//LoadString(g_hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
//DrawText(hdc, szHello, _tcslen(szHello), &rt,
//DT_SINGLELINE | DT_VCENTER | DT_CENTER);
EndPaint(hWnd, &ps);
break;
Следует обратить внимание РЅР° закомментированные строки. Рто именно то изменение, которое нужно внести РІ РєРѕРґ. Переведя эти строки РІ состояние комментария, можно предотвратить вывод РЅР° форму надписи В«Hello, Word!В». Добавленный РІ РєРѕРґ метод FillRect закрашивает ее РІ цвет Magenta. Теперь нужно скомпилировать проект Рё запустить его. Результат выполнения программы показан РЅР° СЂРёСЃ.В 4.5.
Рис. 4.5. Результат выполнения программы Buttons.
Стоит заметить, что две нижние кнопки в правом ряду можно перетаскивать при помощи мыши. 5. Внимательно расмотрев код, можно понять, что, несмотря на разницу в поведении и внешнем виде, практически все кнопки были созданы одной и той же функцией CreateWindow. Правый ряд кнопок был создан при помощи усовершенствованного варианта этой функции CreateWindowEx.
Р’РќРРњРђРќРР•!
Несмотря РЅР° разницу РІ поведении Рё назначении, РІСЃРµ основные элементы управления Windows (РєРЅРѕРїРєРё, полосы прокрутки, поля РІРІРѕРґР° текста Рё С‚.В Рґ.) представляют СЃРѕР±РѕР№ РѕРєРЅР° WindРѕws. РћРЅРё генерируют сообщение WM_COMMAND, создаются РїСЂРё помощи функции Create-Window, Рё разница между создаваемыми элементами определяется только аргументами, которые передаются этой функции. Ртот СЂСЏРґ элементов управления РЅРѕСЃРёС‚ общее название Windows Control.
Функции CreateWindow и CreateWindowEx Синтаксис функции CreateWindow достаточно прост.
HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hInstance,
PVOID lpParam);
Расшифровка аргументов этой функции приведена в следующем списке.
? Параметр IpClassName при создании элементов управления всегда получает одно из предопределенных значений.
• Значение BUTTON создает стандартную кнопку, которая посылает в родительское окно сообщение о том, что пользователь выбрал данную кнопку.
• Значение EDIT создает поле ввода текста, которое позволяет пользователю вводить и редактировать текст.
• Значение LISTB0X создает список, из которого пользователь может выбрать одну из строк.
• Значение C0MB0B0X действует как сочетание EDIT и LISTB0X. В получившемся органе управления пользователь может как выбрать одну из строк, так и ввести ее самостоятельно.
• Значение SCROLLBAR создает полосу прокрутки.
• Значение Image создает элемент управления, предназначенный для отображения текста или графического изображения.
? Параметр IpWindowName содержит текст, который должен быть отображен в элементе управления.
? Параметр dwStyle задает стиль окна, которое будет создано. Стиль задается при помощи сочетания предопределенных значений.
• Значение WS_B0RDER создает окно с тонкой рамкой.
• Значение WS_CAPTION создает окно со строкой заголовка (включает в себя стиль WSB0RDER).
• Значение WS_CHILD создает дочернее РѕРєРЅРѕ. Ртот стиль несовместим СЃРѕ стилем WSP0PUP.
• Значение WS_CLIPCHILDREN для родительского окна отключает перерисовку тех зон окна, которые заняты дочерними окнами.
• Значение WS_CLIPSIBLINGS исключает рисование в перекрытых дочерних окнах. Если одно из перекрытых дочерних окон перерисовывается, то перекрытые им области других окон не будут перерисованы.
• Значение WS_DISABLED создает неактивное окно.
• Значение WS_DLGFRAME создает РѕРєРЅРѕ СЃ рамкой, типичной для диалоговых РѕРєРѕРЅ. Рто РѕРєРЅРѕ РЅРµ может иметь заголовка.