Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы программирования для информатиков и инженеров. Часть 2 Прикладное программирование в Windows.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
603.45 Кб
Скачать

Сообщения, которые можно посылать спину

 

Сообщение

Действие

1

UDM_GETBUDDY

Получение дескриптора приятельского окна. Дескриптор содержится в младшем слове возвращаемого значения. wParam должен быть равен 0. lParam должен быть равен 0

2

UDM_GETPOS

Получение текущей позиции спина. Значение текущей по­зиции содержится в младшем слове возвращаемого значения. wParam должен быть равен 0lParam должен быть равен 0

3

UDM_GETRANGE

Получение диапазона прокрутки спина. Максимальное зна­чение позиции содержится в младшем, а минимальное – в старшем слове возвращаемого значения. wParam должен быть равен 0lParam должен быть равен 0

4

UDM_SETBUDDY

Определение нового приятельского окна спина, возвращает дескриптор прежнего приятельского окна. wParam должен содержать дескриптор нового приятельского окна. lParam должен быть равен 0

5

UDM_SETPOS

Установка текущей позиции спина. wParamдолжен быть равен 0. lParam должен содержать значение новой позиции

6

UDM_SETRANGE

Установка нового диапазона прокрутки спина. wParam должен быть равен 0. lParam должен содержать максимальное значение позиции в младшем слове, а минимальное в старшем

Пример 11-1. Программа работы со спином

 

Приведенная ниже программа создает спин, используемый как отдельный элемент прокрутки. Спин создается в окне диалога. В данном примере он не имеет приятельского окна. Возможные значения позиций создаваемого спина находятся в диапазоне от 0 до 100, начальное значение позиции равно 50. При изменении текущей позиции спина значение его новой позиции отображается в рабочей области окна диалога.

 

// Демонстрация базовых функций спина

#include <Windows.h>

#include <String.h>

#include <Stdio.h>

#include <Commctrl.h>

#include "Updown.h"

LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);

BOOL    CALLBACK DialogFunc(HWND,UINT,WPARAM,LPARAM);

char szWinName[] = "МоеОкно";  // Имя класса окна

HINSTANCE hInst;

int WINAPI WinMain (HINSTANCE hThisInst,

                    HINSTANCE hPrevInst,

                    LPSTR lpszArgs,

                    int nWinMode)

   {

   HWND hwnd;

   MSG msg;

   WNDCLASS wcl;

   HACCEL hAccel;

   // Определить класс окна

   wcl.hInstance=hThisInst;   // Дескриптор приложения

   wcl.lpszClassName=szWinName;  // Имя класса окна

   wcl.lpfnWndProc=WindowFunc;   // Функция окна

   wcl.style=0;                  // Стиль по умолчанию

   wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION); // Иконка 

   wcl.hCursor=LoadCursor(NULL,IDC_ARROW) ;  // Курсор

   wcl.lpszMenuName="MYMENU";                // Меню

   wcl.cbClsExtra=0;             // Без дополнительной

   wcl.cbWndExtra=0;             // информации

   // Определить заполнение окна белым цветом

   wcl.hbrBackground=

                  (HBRUSH)GetStockObject(WHITE_BRUSH);

   if(!RegisterClass(&wcl)) // Зарегистр. класс окна

      return 0;

   // Создать окно

   hwnd=CreateWindow(szWinName,          // Имя класса

            "Демонстрация функций спина", // Заголовок

                     WS_OVERLAPPEDWINDOW,// Стиль окна

                     CW_USEDEFAULT,    // Х-координата

                     CW_USEDEFAULT,    // Y-координата

                     CW_USEDEFAULT,     // Ширина окна

                     CW_USEDEFAULT,     // Высота окна

                     HWND_DESKTOP,  // Нет родит. окна 

                     NULL,                 // Нет меню

                     hThisInst, // Дескрип. приложения 

                     NULL); // Без дополит. аргументов

   hInst=hThisInst; // Сохранить дескриптор приложения

   // Загрузить акселераторы

   hAccel=LoadAccelerators(hThisInst,"MYMENU");

   InitCommonControls();  // Общие элементы управления

   ShowWindow(hwnd,nWinMode) ; // Показать окно и 

   UpdateWindow(hwnd);      // перерисовать содержимое

   // Запустить цикл обработки сообщений

   while(GetMessage (&msg,NULL,0,0))

      if(!TranslateAccelerator(hwnd,hAccel,&msg))

         {

         TranslateMessage(&msg); // Использ.клавиатуры

         DispatchMessage (&msg); // Возврат к Windows

         }

   return msg. wParam;

   }

 

// Следующая функция вызывается операционной системой

// Windows и получает в качестве параметров сообщения

// из очереди сообщений данного приложения

 

LRESULT CALLBACK WindowFunc(HWND hwnd,

                            UINT message,

                            WPARAM wParam,

                            LPARAM lParam)

   {

   switch(message)

      {

      case WM_COMMAND:

         switch(LOWORD(wParam))

            {

            case IDM_DIALOG:

               DialogBox(hInst,"MYDB",hwnd,

                         DialogFunc);

               break;

            case IDM_HELP:

               MessageBox(hwnd,"Помощь","Помощь",

                          MB_OK);

               break;

            }

         break;

      case WM_DESTROY:         // Завершение программы

         PostQuitMessage(0);

         break;

      default:

         // Все сообщения, не обрабатываемые в данной

         // функции, направляются на обработку по 

         // умолчанию

         return DefWindowProc(hwnd,message,

                              wParam,lParam);

      }

   return 0;

   }

 

//

// Простая функция диалога

//

BOOL CALLBACK DialogFunc(HWND hdwnd,

                         UINT message,

                         WPARAM wParam,

                         LPARAM lParam)

   {

   char str[80];

   long udpos = 0;

   HDC  hdc;

   static HWND udWnd;

   switch(message)

      {

      case WM_INITDIALOG:

         udWnd=CreateUpDownControl

                       (WS_CHILD|WS_BORDER|WS_VISIBLE,

                        10,10,50,50, hdwnd, ID_UPDOWN,

                        hInst, NULL, 100, 0, 50);

         return 1;

      case WM_COMMAND:

         switch(LOWORD(wParam))

            {

            case IDCANCEL:

               EndDialog(hdwnd, 0);

               return 1;

            }

      case WM_VSCROLL: // Обработка сообщения спина

         if(udWnd == (HWND)lParam )

            {

            udpos = SendMessage(udWnd,UDM_GETPOS,0,0);

            sprintf(str,"%d", LOWORD(udpos));

            hdc = GetDC(hdwnd);

            TextOut(hdc, 55, 30, "      ", 6);

            TextOut(hdc, 55, 30, str, strlen(str));

            ReleaseDC(hdwnd,hdc);

            return 1;

            }

      }

   return 0;

   }

 

  Пример диалога со спином представлен на рис. 11.1.

Рис. 11.1. Пример окна диалога со спином

 

Для этой программы потребуется следующий файл ресурсов Spin.h:

 

#include <Windows.h>

#include "Updown.h"

MYMENU MENU

   {

   MENUITEM "Диалог", IDM_DIALOG

   MENUITEM "Помощь", IDM_HELP

   }

MYMENU ACCELERATORS

   {

   VK_F2, IDM_DIALOG, VIRTKEY

   VK_F1, IDM_HELP,   VIRTKEY

   }

MYDB DIALOG 18, 18, 142, 92

CAPTION "Демонстрация функций спина"

STYLE DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU

   {

   PUSHBUTTON "Сброс", IDCANCEL, 52, 65, 37, 14,

              WS_CHILD|WS_VISIBLE|WS_TABSTOP

   }

 

Понадобится также файл определений Updown.h:

 

#define   IDM_DIALOG 100

#define   IDM_HELP   101

#define   ID_UPDOWN  102

 

В приведенной программе спин создается в окне диалога. Это происходит при инициализации диалога во время обработки сообщения WM_INITDIALOG:

 

   udWnd=CreateUpDownControl

                 (WS_CHILD|WS_BORDER|WS_VISIBLE,

                  10,10,50,50, hdwnd, ID_UPDOWN,

                  hInst, NULL, 100, 0, 50);

   return 1;

 

При вызове функции CreateUpDownControl() создается спин, имеющий коорди­наты 10,10 в рабочей области диалога. Ширина и высота спина равны 50 пикселам. Поскольку спин порождается окном диалога, дескриптор диалога hdwnd передается в качестве дескриптора родительского окна. Идентификатор спина – ID_UPDOWN. В данном примере этот идентификатор не используется, однако он должен присут­ствовать, так как может потребоваться в других программах, hInst – дескриптор программы. Поскольку приятельское окно спина в данном случае отсутствует, соответствующий параметр равен NULL. Возможные значения позиций создаваемого спина находятся в диапазоне от 0 до 100, начальное значение позиции равно 50.

При воздействии на спин диалог получает сообщение WM_VSCROLL. Ниже приводится фрагмент программы, обрабатывающей это сообщение. Дескриптор спина передается в параметре сообщения lParam. Для того чтобы проверить, что сообщение пришло именно от спина, значение lParam сравнивается с дескриптором спина, полученным в результате выполнения функции CreateUpDownControl(). Наша программа создает только один спин, реальные же приложения могут создавать несколько элементов управления, способных посылать сообщение WM_VSCROLL, так что обычно такая проверка бывает необходима.

 

   case WM_VSCROLL: // Обработка сообщения спина

      if(udWnd == (HWND)lParam )

         {

         udpos = SendMessage(udWnd,UDM_GETPOS,0,0);

         sprintf(str,"%d", LOWORD(udpos));

         hdc = GetDC(hdwnd);

         TextOut(hdc, 55, 30, "      ", 6);

         TextOut(hdc, 55, 30, str, strlen(str));

         ReleaseDC(hdwnd,hdc);

         return 1;

         }

 

Чтобы получить новое положение спина, ему передается сообщение UDM_GETPOS. С этой целью используется функция SendMessage(). Значение новой позиции спина содержится в младшем слове возвращаемого значения. Значение текущего положения спина отображается в рабочей области окна диалога.