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

11.2. Создание спина с «приятельским» окном

 

Чаще всего спин используется с окном редактирования. В этом случае спин называется так и по-английски – spin, тогда как для отдельно используемого спина применяется термин up-down control. Поскольку спины с окнами редакти­рования встречаются очень часто, Windows обеспечивает специальную поддер­жку таких элементов. Так как спин с окном редактирования почти полностью автоматизирован, Ваша программа может не содержать практически никаких операций по управлению им.

Для создания спина с окном редактирования достаточно просто определить такое окно как приятельское для спина. После этого текущее положение спина будет автоматически отображаться в окне редактирования. Более того, при изменении (с помощью мыши или клавиатуры) содержимого окна редактирования будет автома­тически изменяться и текущее положение спина.

 

Пример 11-2. Использование спина с окном редактирования

 

Процедура создания спина с окном редактирования довольно простая и состоит из двух этапов.

Этап 1. Вначале в файл ресурсов программы необходимо добавить окно редактирования.

Этап 2. Далее дескриптор этого окна нужно передать в качестве дескриптора приятельского окна спина при создании последнего.

Файл ресурсов 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

   EDITTEXT   ID_EB1, 10, 10, 20, 12,

              ES_LEFT|WS_CHILD|WS_VISIBLE|WS_BORDER

   }

 

Заметьте, что в определение диалога включено окно редактирования EDITTEXT с идентификатором ID_EB1. Поэтому изменяется и файл определений Updown.h добавлением еще одной константы:

 

#define   IDM_DIALOG 100

#define   IDM_HELP   101

#define   ID_UPDOWN  102

#define   ID_EB1     103

 

Текст программы приведен ниже:

 

// Демонстрация спина с "приятельским окном"

#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)

   {

   static HWND hEboxWnd;

   static HWND udWnd;

   switch(message)

      {

      case WM_INITDIALOG:

         hEboxWnd=GetDlgItem(hdwnd,ID_EB1);

         udWnd=CreateUpDownControl

                     (WS_CHILD|WS_BORDER|WS_VISIBLE|

                      UDS_SETBUDDYINT|UDS_ALIGNRIGHT,

                      55,10,40,50, hdwnd, ID_UPDOWN,

                      hInst, hEboxWnd, 100, 0, 50);

         return 1;

      case WM_COMMAND:

         switch(LOWORD(wParam))

            {

            case IDCANCEL:

               EndDialog(hdwnd, 0);

               return 1;

            }

      }

   return 0;

   }

 

Чтобы понять, как создается спин с окном редактирования, посмотрите на фрагмент программы, обрабатывающей сообщение WM_INITDIALOG:

 

   case WM_INITDIALOG:

      hEboxWnd=GetDlgItem(hdwnd,ID_EB1);

      udWnd=CreateUpDownControl

                  (WS_CHILD|WS_BORDER|WS_VISIBLE|

                   UDS_SETBUDDYINT|UDS_ALIGNRIGHT,

                   55,10,40,50, hdwnd, ID_UPDOWN,

                   hInst, hEboxWnd, 100, 0, 50);

      return 1;

 

Поскольку диалог определен в файле ресурсов, для получения дескриптора окна редактирования программа должна использовать функцию GetDlgItem():

 

HWND GetDlgltem (HWND hDialog, int ID);

 

Функция GetDlgItem() возвращает дескриптор элемента управления (в нашем случае –  hEboxWnd). Дескриптор окна диалога передается в параметре hDialog, а идентификатор элемента управления задается параметром ID. При возникновении ошибки эта функция возвращает NULL.

После получения дескриптора окна редактирования hEboxWnd он используется в качестве дескриптора приятельского окна в функции CreateUpDownControl(), создающую спин. Заметим, что в предыдущем примере 11-1 вместо него использовалось значение NULL. Таким образом, спин и окно редактирования автоматически связываются и работают совместно.

 

Рис. 11.2. Спин с окном редактирования

 

Окно диалога, создаваемого этой программой, показано на рис. 11.2.