break;
//Окончание добавленного кода
case IDM_HELP_ABOUT:
DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDOK:
SendMessage(hWnd, WM_ACTIVATE, MAKEWPARAM(WA_INACTIVE,0), (LPARAM)hWnd);
SendMessage (hWnd, WM_CLOSE, 0, 0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
11. Теперь этот код следует детально рассмотреть. Ветка case 200 перехватывает сообщение от первой кнопки в левом столбце и в качестве реакции посылает команду установки текста WM_SETTEXT этой же кнопке (gJiwndBl).
12. Ветка case 207 перехватывает сообщение от первой кнопки в правом столбце и посылает первой кнопке в левом столбце команду присвоить другое значение тексту.
13. Ветка case 208 перехватывает сообщение от второй кнопки в правом столбце и выводит окно сообщения с заданным текстом и заголовком.
Окна сообщений
Р’СЃРµ РѕРєРЅР° сообщений выводятся РЅР° экран РїСЂРё помощи функции MessageBox. Рта функция несколько раз использовалась РІ примерах, Рё РЅРµ нуждается РІ детальном рассмотрении. Оговорить надо лишь последний параметр, РІ котором передается константа, определяющая тип сообщения. Возможные значения приведены РІ следующем СЃРїРёСЃРєРµ.
? МВ_0К – системная кнопка OK в правом углу сообщения.
? MBOKCANCEL – кнопки OK и Cancel.
? MBABORTRETRYIGNORE – кнопки Abort, Retry и Ignore.
? MBYESNOCANCEL – кнопки Yes, No и Cancel.
? MB_YESN0 – кнопки Yes и No.
? MB_RETRYCANCEL – кнопки Retry и Cancel.
Константы, определяющие рисунок на сообщении, приведены отдельно.
? MB_ICONHAND – красный круг с восклицательным знаком.
? MB_ICONQUESTION – белый круг с вопросительным знаком.
? MB_ICONEXCLAMATION – желтый треугольник с восклицательным знаком.
? MBICONASTERISK – белый круг с буквой I.
Рти РґРІР° типа констант РјРѕРіСѓС‚ быть использованы РІ объединении. Например, если нужно вывести сообщение СЃ тремя кнопками Рё СЂРёСЃСѓРЅРєРѕРј вопросительного знака, то РІ качестве последнего параметра следует использовать следующую конструкцию:
MB_YESNOCANCEL | MB_ICONQUESTION
Функция MessageBox возвращает значение типа int, которое соответствует номеру кнопки, которая была нажата. Например, если были отображены кнопки Yes, No и Cancel, а пользователь нажал кнопку No, то будет возвращено значение 2. Пример реакции на нажатие кнопки приведен в рассматриваемом упражнении.
Упражнение 4.3 (продолжение)
14.В Рзменить РєРѕРґ реакции РЅР° нажатие РєРЅРѕРїРєРё СЃ идентификатором 208, как показано РІ листинге 4.17.
Листинг 4.17.
case 208:
msgResult = MessageBox (hWnd, L" Рто тело сообщения!",
L" А это заголовок", MB_OKCANCEL|MB_ICONQUESTION);
if (msgResult==1)
SendMessage (g_hwndB1, WM_SETTEXT, 0, (LPARAM)(LPSTR)L" Да!!!");
if(msgResult==2)
SendMessage (g_hwndB1, WM_SETTEXT, 0, (LPARAM)(LPSTR)L" Нет!!!");
break;
15. В начале функции WndProc нужно объявить целочисленную переменную msgResult.
16. Запустить проект. При нажатии второй кнопки в правом столбце будет выведено сообщение с кнопками OK и Cancel, и вопросительным знаком. Щелчок на кнопке OK выведет на кнопку 200 надпись Да!!! а кнопка Cancel приведет к появлению надписи Нет!!!.
17. Теперь нужно узнать, как можно получить значение состояния радиокнопки или флажка. Для этого нужно добавить объявление еще одной переменной в начало функции WndProc.
wchar_t *szStr;
18.В Рзменить объявление переменной хэндлера Рё добавить переменную, которая будет хранить идентификатор еще РѕРґРЅРѕР№ РєРЅРѕРїРєРё.
HWNDg_hwndB1, g_hwndB2;
19.В Рзменить РєРѕРґ обработки щелчка РЅР° РєРЅРѕРїРєРµ 207, как показано РІ листинге 4.18. Листинг 4.18
case 207:
msgResult=SendMessage (g_hwndB2, BM_GETCHECK, 0, 0);
switch (msgResult)
{
case 0: szStr = L" UnChecked";
break;
case 1: szStr = L" Checked";
break;
case 2: szStr = L" GrayChecked";
break;
}
SendMessage (g_hwndB1, WM_SETTEXT, 0, (LPARAM)(LPSTR)szStr);
break;
20. Функция SendMessage может возвращать полезные сведения, РєРѕРіРґР° это поведение диктуется соответственным типом сообщения. Р’ данном случае флажку было послано сообщение BM_GETCHECK. Рто сообщение интерпретируется как запрос Рѕ его состоянии, Рё соответствующий компонент вернул ответ РІ РІРёРґРµ целого числа.
21. Запустить проект. При нажатии правой кнопки, в левую кнопку записывается текущее состояние кнопки AutoCheck3State.
EDIT, LISTBOX Рё COMBOBOX
Рти компоненты объединены РІ РѕРґРЅРѕРј разделе потому, что орган управления ComboBox, объединяет РІ себе функциональность РґРІСѓС… РґСЂСѓРіРёС…, являясь комбинацией органов управления Edit Рё ListBox. Функциональность этих компонентов рассматривается РІ РЅРѕРІРѕРј упражнении.
Упражнение 4.4
1. Создать новый проект (File ? New ? Projects ? WCE Pocket PC 2002 Application) и назвать его CombEdLi. На следующем шаге мастера нужно выбрать тип приложения A typical «Hello Word» application, после чего нажать кнопку Finish.
2. Сразу же закомментировать вызов функций LoadString и DrawText, как это было сделано в предыдущем упражнении.
3. В начале файла объявить в разделе Global Variables несколько переменных:
HWNDg_hwndComB, g_hwndLnEd, g_hwndPass, g_hwndList, g_hwndMlnEd; HWNDg_hwndBtn1, g_hwndBtn2, g_hwndBtn3;
Рто идентификаторы всех элементов, которые Р±СѓРґСѓС‚ созданы РЅР° форме.
4. В начале функции WndProc, там, где объявляются локальные переменные, допишите объявление еще нескольких переменных, как показано в листинге 4.19.
Листинг 4.19
int i;
wchar_t *mstr[]={L" Elly", L" Totoshka", L" Strashila", L" Bastinda", L" Gingema", L" Elly",
L" Totoshka", L" Strashila", L" Bastinda", L" Gingema", L" Elly", L" Totoshka",
L" Strashila", L" Bastinda", L" Gingema"};
wchar_t tmp[128];
5. В этой же функции, в начале блока, помеченного комментарием Parse the menu selections, нужно разместить код, приведенный в листинге 4.20. Листинг 4.20
switch (wmId)
{
//Начало нашего кода:
case 200:
if(wmEvent == CBN_SELCHANGE)
{
SendMessage (g_hwndComB, CB_SETCURSEL, SendMessage (g_hwndComB,
CB_GETCURSEL, 0, 0), 0);
SendMessage (g_hwndComB, WM_COPY, 0, 0);
SendMessage (g_hwndMlnEd, WM_PASTE, 0, 0);
SendMessage (g_hwndMlnEd, EM_REPLACESEL, 0, (LPARAM)(LPCSTR)L"rn");
}
break;
case 201:
if (wmEvent == LBN_DBLCLK)
{