Создание элементов управления на диалоговой форме, страница 4

switch (LOWORD (wParam))

{

. . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

//Работа со списком

case IDC_LIST1:

//извещения можно анализировать по старшему слову wParam. Все извещения от списка

//начинаются LBN_ их много, описание смотри в MSDN

if (HIWORD(wParam) == LBN_DBLCLK || HIWORD(wParam) == LBN_SELCHANGE)

                        {                 

//дадим сообщение, что работаем со списком          

MessageBox(hWnd, "Работа в списке", "СПИСОК", MB_OK );

//получить индекс выделенной строки

                        ListIndex= SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0);

//получить текст из списка

SendMessage((HWND)lParam, LB_GETTEXT, ListIndex, (LPARAM)szListText);

//вывести принятый текст на экран

MessageBox(hWnd, szListText, "ПРИНЯТЫЙ ТЕКСТ",  MB_OK );

//а так можно дальше проанализировать двойной щелчок на списке

if (HIWORD(wParam) == CBN_DBLCLK) {/* реакция на двойное нажатие мыши*/};

                        }

                    break;

. . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

SCROLLBARS (Линейки  прокрутки)

11. Создадим две линейки прокрутки на форме: одну вертикальную и одну горизонтальную:

Вертикальной линейке присвоим идентификатор IDC_SCROLLBAR_VER, горизонтальной - IDC_SCROLLBAR_GOR.

12. Для управления линейками создадим программный код. В отличие от других элементов формы, линейки прокрутки не передают родительскому окну сообщение WM_COMMAND. Вместо этого вертикальная линейка дает сообщение WM_VSCROLL, а горизонтальная WM_НSCROLL.

Также для инициализации линеек используются не сообщения (хотя можно и до них добраться), а специальные функции:

#include <windows.h>

#include <stdlib.h>

#include <stdio.h>

#include <commctrl.h>

#include "resource.h"

#define TEST_WM_001   102

HINSTANCE       ghInstance;

HWND    hList1,  hCombo1, hScroll;

char cBuffer[12];

// задать начальное значение текущего положения движков линеек прокрутки

INT  nTekV = 50, nTekG = 50;

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

switch (wMsg)

{

// Сообщение об инициализации диалогового окна

case WM_INITDIALOG:

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

//Инициализация полос прокрутки

//получить хендел окна вертикальной линейки прокрутки

hScroll = GetDlgItem (hWnd, IDC_SCROLLBAR_VER);

// установить диапазон работы от 0 до 100

SetScrollRange(hScroll, SB_CTL, 0, 100, TRUE);

// установить начальное положение движка

SetScrollPos(hScroll, SB_CTL, 50, TRUE);

// выполнить те же действия для горизонтальной линейки

hScroll = GetDlgItem (hWnd, IDC_SCROLLBAR_GOR);

            SetScrollRange(hScroll, SB_CTL, 0, 100, TRUE);

            SetScrollPos(hScroll, SB_CTL, 50, TRUE);

break;

//ПРИМЕР ОБРАБОТКИ  СООБЩЕНИЙ  ОТ  ЛИНЕЕК  ПРОКРУТКИ

//Вертикальная полоса прокрутки

case WM_VSCROLL:

//анализ типа извещений проводится по нижнему слову wParam. Все извещения

//начинаются с SB_ , перечень которых можно найти в MSDN

switch (LOWORD(wParam))

                        {

                        case SB_PAGEUP: nTekV = max(0, nTekV-10); break;

                        case SB_LINEUP: nTekV = max(0, nTekV-1); break;

                        case SB_PAGEDOWN: nTekV = min(100, nTekV+10); break;

                        case SB_LINEDOWN: nTekV = min(100, nTekV+1); break;

                        case SB_THUMBPOSITION:

                        case SB_THUMBTRACK: nTekV = HIWORD(wParam); break;

                        }

                        SetScrollPos((HWND)lParam, SB_CTL, nTekV, TRUE);

            break;

// Горизонтальная полоса прокрутки

case WM_HSCROLL:

switch (LOWORD(wParam))

                        {

                        case SB_PAGEUP: nTekG = max(0, nTekG - 10); break;

                        case SB_LINEUP: nTekG = max(0, nTekG - 1); break;

                        case SB_PAGEDOWN: nTekG = min(100, nTekG + 10); break;

                        case SB_LINEDOWN: nTekG = min(100, nTekG + 1); break;

                        case SB_THUMBPOSITION:

                        case SB_THUMBTRACK: nTekG = HIWORD(wParam); break;

                        }

                        SetScrollPos((HWND)lParam, SB_CTL, nTekG, TRUE);

            break;

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

В результате компилирования и запуска программы теперь имеем: