Вы находитесь на странице: 1из 20

Элементы управления

на форме
https://learn.microsoft.com/en-us/windows/win32/controls/window-controls
Форма
Ресурсы программы
Форма

hWndDialog = CreateDialogParam(hInstance, //главный процесс


MAKEINTRESOURCE(IDD_DIALOG1), //ID формы диалога
NULL, //окно родитель
(DLGPROC)PviewDlgProc, //процедура обработки сообщений
(LONG)0); //данные, передаваемые в lParam
Варианты создания диалогового окна
DialogBox( . . . )
CreateDialog( . . . )
CreateDialogParam ( . . . )
CreateDialogIndirect( . . . )
CreateDialogIndirectParam( . . . )
Например:
hWndDialog = (HWND)DialogBox(hInstance,
MAKEINTRESOURCE(IDD_DIALOG1), 0,
PviewDlgProc);
Edit – текстовое поле
HWND hEdit1 = GetDlgItem(hWnd, IDC_EDIT1);
Дескриптор окна родителя
Идентификатор
//проверка события на текстовом поле компонента

switch(HIWORD(wParam)){
case EN_CHANGE ://изменение в поле
//получить строку из поля
SendMessage((HWND)lParam, EM_GETLINE, 0, (LPARAM)szListText);
Или: SendMessage(hEdit1, EM_GETLINE, 0, (LPARAM)szListText);
Или: GetWindowText(hEdit1, szListTex, 255);
Или: SendDlgItemMessage(hWnd, IDC_EDIT1, EM_GETLINE, 0,
(LPARAM)szListText);
//Вывести строку в поле
SetWindowText(hEdit1, szListText);
Или: SetDlgItemText(hWnd, IDC_EDIT1, (LPARAM)szListText);
Нотификации Edit controls
Код уведомления Действия пользователя
Пользователь изменил текст в элементе
EN_CHANGE
управления
не достаточно памяти для выполнения
RU_ERRSPACE
определенного запроса.
Пользователь щелкнул горизонтальную полосу
EN_HSCROLL
прокрутки
Пользователь выбрал другой элемент
RU_KILLFOCUS
управления.
превысил указанное количество символов
EN_MAXTEXT

Пользователь выбрал этот элемент управления


EN_SETFOCUS

Пользователь изменил текст в элементе


EN_UPDATE
управления
Пользователь щелкнул вертикальную полосу
EN_VSCROLL
прокрутки
ComboBox
case WM_INITDIALOG:

hCombo1 = GetDlgItem (hWnd, IDC_COMBO1);


ListIndex = SendMessage (hCombo1, CB_ADDSTRING, 0, "СТРОКА-001");
SendMessage (hCombo1, CB_SETITEMDATA, ListIndex, 0);

for (InstanceIndex=1; InstanceIndex<4;InstanceIndex++)


{sprintf(szListText, "СТРОКА-%d", InstanceIndex);
ListIndex = SendMessage (hCombo1, CB_ADDSTRING, 0, szListText);
SendMessage (hCombo1, CB_SETITEMDATA, ListIndex, InstanceIndex);
}

SendMessage (hCombo1, WM_SETREDRAW, TRUE, 0);


SendMessage (hCombo1, CB_SETCURSEL, 0, 0);

break;
Выбор строки в ComboBox

case IDC_COMBO1:
if (HIWORD(wParam) == CBN_SELENDOK) {//выбрана строка
//Получить индекс выбранной строки
ListIndex = SendMessage(hCombo1, CB_GETCURSEL, 0, 0);
//Получить строку по индексу
SendMessage(hCombo1, CB_GETLBTEXT, ListIndex, (LPARAM)szListText);

//Отобразить строку в текстовом поле


SetWindowText(hEdit1, szListText);
}
Флажки и радиокнопки
case IDC_CHECK1:
chk = SendDlgItemMessage(hWnd, IDC_CHECK1, BM_GETCHECK, 0, 0);
if (chk==0)MessageBox(hWnd, " флажок СНЯТ!", "ЗАГОЛОВОК", 0);
else MessageBox(hWnd, "Нажат флажок!", "ЗАГОЛОВОК", 0);
break;
 
Начальная установка метки
SendMessage(hRB1, BM_SETCHECK, 1, 0);
или
SendDlgItemMessage(hWnd, IDC_RADIO1, BM_SETCHECK, 1, 0);
LIST BOX (СПИСОК )
case WM_INITDIALOG:
//получить дескриптор окна списка
hList1 = GetDlgItem (hWnd, IDC_LIST1);
//заполнить список четырьмя строками (технология аналогична
COMBOBOX)
for (InstanceIndex=0; InstanceIndex<4; InstanceIndex++){
sprintf(szListText,"строка-%d",InstanceIndex);
ListIndex = SendMessage (hList1, LB_ADDSTRING, 0, (long)szListText);
}
SendMessage (hList1, WM_SETREDRAW, TRUE, 0);
break;
Обработка событий на ListBox
case IDC_LIST1:
switch (HIWORD(wParam)) {
case LBN_SELCHANGE: //переход со строки на строку
break;

case LBN_DBLCLK: // реакция на двойное нажатие мыши


//получить индекс выделенной строки
ListIndex = SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0);
//получить текст из списка
//SendMessage((HWND)lParam, LB_GETTEXT, ListIndex, (LPARAM)szListText);
SendDlgItemMessage(hWnd, IDC_LIST1, LB_GETTEXT, ListIndex, szListText);
//Установить текст в Edit control
SetWindowText(hEdit1, szListText);
break;
}
break;
Spin

static UDACCEL pUD[1] = { {1,2} };


.................................
case WM_INITDIALOG:
//Установка шага спина в 2
SendMessage(hSpin, UDM_SETACCEL, 1, (LPARAM)pUD);
//установить диапазон работы СПИНА от 0 до 100
SendMessage(hSpin, UDM_SETRANGE, 0, MAKELONG(0, 100));
//уставить начальное значение спина в 50
SendMessage(hSpin, UDM_SETPOS, 0, 50);
Дополнительная работа со Spin
Получение текущего значения:
int poz = SendMessage (hSpin, UDM_GETPOS , 0, 0);

Ручная привязка спина к объекту (спин привязывается к


текстовому полю 1):
SendMessage(hSpin, UDM_SETBUDDY,
(WPARAM)hEdit1, 0);
TreckBar (slider)
Вертикальный тредбар, спин и вертикальная полоса прокрутки посылают одно главное
сообщение - WM_VSCROLL .
Горизонтальные тредбар, спин и полоса прокрутки посылают одно главное сообщение -
WM_HSCROLL .
Разбор сообщений ведется так:
case WM_HSCROLL:
switch(lParam){
case hSlider:
switch (LOWORD(wParam)){
case TB_PAGEUP: //обработчик смены страницы слайдера вверх
break; }
break;

case hSpin: //Обработчики событий спина


break;

case hScroll: //Обработчики событий линейки прокрутки SB_


break; }
break;
Пример обработчика

case WM_HSCROLL:
i = SendMessage(hSlider, TBM_GETPOS, 0, 0);
sprintf(szListText, "poz-%d", i);
SetWindowText(hEdit1, szListText);
break;
Настройка TredBar (Slider)

//установить диапазон работы слайдера от 0 до 10


SendMessage(hSlider, TBM_SETRANGE, TRUE, MAKELONG(0, 10));
//Размер страницы
SendMessage(hSlider, TBM_SETPAGESIZE, 0, (LPARAM)2);
//Выделенная область
SendMessage(hSlider, TBM_SETSEL, FALSE, MAKELONG(1, 4));
//установить движок в начальную позицию 5
SendMessage(hSlider, TBM_SETPOS, TRUE, 5);
Progress Bar
case WM_INITDIALOG:
hProgress = GetDlgItem(hWnd, IDC_PROGRESS1);
//устанавливается диапазон работы прогресса
SendDlgItemMessage(hWnd, IDC_PROGRESS1,
PBM_SETRANGE, 0, MAKELONG(0, 10));
//и начальное состояние линейки прогресса
SendDlgItemMessage(hWnd, IDC_PROGRESS1,
PBM_SETPOS, 5, 0);
Пример обработчика
case WM_HSCROLL:
i = SendMessage(hSlider, TBM_GETPOS, 0, 0);
sprintf(szListText, "poz-%d", i);
SetWindowText(hEdit1, szListText);
SendDlgItemMessage(hWnd, IDC_PROGRESS1,
PBM_SETPOS, i, 0);
break;
Меню

case WM_COMMAND:
switch (LOWORD(wParam)) //получаем индекс компонента
{ case ID_40001: //это меню ФАЙЛ
//Обработчик нажатия на меню Файл
break;
}
break;

Вам также может понравиться