Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Microsoft Visual C++ ΠΈ MFC. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Windows 95 ΠΈ Windows NT. Π§Π°ΡΡ‚ΡŒ 2Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 42

Автор АлСксандр Π€Ρ€ΠΎΠ»ΠΎΠ²

 // ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ OnUpdateTEXT

 bIndicatorTEXT = !bIndicatorTEXT;

}


//============================================================

// ΠœΠ΅Ρ‚ΠΎΠ΄ OnMenuExit класса CStateWindow

//============================================================

void CStateWindow::OnMenuExit() {

 // Π—Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

 DestroyWindow();

 return;

}


//============================================================

// ΠœΠ΅Ρ‚ΠΎΠ΄ OnCreate класса CStateWindow

// ВызываСтся Π²ΠΎ врСмя создания ΠΎΠΊΠ½Π° прилоТСния

//============================================================

int CStateWindow::OnCreate(LPCREATESTRUCT lpCreateStruct) {

 // Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnCreate Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса

 if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;


 // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ панСль состояния

 if (!m_wndStatusBar.Create(this)) {

  // Ошибка ΠΏΡ€ΠΈ создании ΠΏΠ°Π½Π΅Π»ΠΈ состояния

  TRACE0("Failed to create status bar\n");

  return -1;  

 }


 // ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠ°Π½Π΅Π»ΠΈ состояния

 if (!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) {

  // Ошибка ΠΏΡ€ΠΈ установкС ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²

  TRACE0("Failed to set indicators\n");

  return -1;  

 }


 // УстанавливаСм характСристики ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°

 // ID_INDICATOR_PROGRESS

 m_wndStatusBar.SetPaneInfo(m_wndStatusBar.CommandToIndex(ID_INDICATOR_PROGRESS), ID_INDICATOR_PROGRESS,

SBPS_DISABLED | // ВСкст Π½Π΅ отобраТаСтся

  SBPS_NOBORDERS, // Π Π°ΠΌΠΊΠ° Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° отсутствуСт

  150);           // Π¨ΠΈΡ€ΠΈΠ½Π° ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° 150 пиксСлов


 return 0;

}


//============================================================

// ΠœΠ΅Ρ‚ΠΎΠ΄ OnUpdateTEXT класса CStateWindow

// ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сообщСниС ON_UPDATE_COMMAND_UI

// ΠΎΡ‚ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ID_INDICATOR_TEXT

//============================================================

void CStateWindow::OnUpdateTEXT(CCmdUI* pCmdUI) {

 // Π’ зависимости ΠΎΡ‚ состояния Ρ„Π»Π°Π³Π° bIndicatorTEXT

 // ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ Π² ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅ ID_INDICATOR_TEXT

 // строку TEXT ΠΈΠ»ΠΈ PIC

 if (bIndicatorTEXT) pCmdUI->SetText("TEXT"); // ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ строку TEXT

 else pCmdUI->SetText("PIC"); // ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ строку PIC


 // Π Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ тСкста Π² ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅

 pCmdUI->Enable();

}

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» рСсурсов ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π΅Π³ΠΎ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ Status.rc. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π² Π½Π΅Π³ΠΎ мСню, присвоив Π΅ΠΌΡƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ IDR_MENU. Π’Π²Π΅Π΄ΠΈΡ‚Π΅ строки мСню IDR_MENU Π² соотвСтствии с прСдставлСнным Π½Π°ΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠΌ рСсурсов (листинг 3.14). Для всСх строк мСню Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΈΡ… описания. Они Π±ΡƒΠ΄ΡƒΡ‚ записаны Π² Ρ„Π°ΠΉΠ» рСсурсов ΠΊΠ°ΠΊ строковыС рСсурсы, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ со строками мСню.

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² Ρ„Π°ΠΉΠ» рСсурсов строку Ready, Π²Ρ‹Π±Ρ€Π°Π² для Π½Π΅Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ AFX_IDS_IDLEMESSAGE. Π­Ρ‚Π° строка Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π² ΠΏΠ°Π½Π΅Π»ΠΈ состояния Π²ΠΎ врСмя β€œΠ±Π΅Π·Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡβ€ прилоТСния.

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² Ρ„Π°ΠΉΠ» рСсурсов строки, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠ°Π½Π΅Π»ΠΈ состояния: ID_INDICATOR_ADD, ID_INDICATOR_PROGRESS ΠΈ ID_INDICATOR_TEXT.

Листинг 3.14. Π€Π°ΠΉΠ» Status.rc

//Microsoft Developer Studio generated resource script.

//

#include "resource.h"


#define APSTUDIO_READONLY_SYMBOLS

//////////////////////////////////////////////////////////////

//

// Generated from the TEXTINCLUDE 2 resource.

//

#include "afxres.h"


//////////////////////////////////////////////////////////////

#undef APSTUDIO_READONLY_SYMBOLS


//////////////////////////////////////////////////////////////

// Russian resources


#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)

#ifdef _WIN32

LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT

#pragma code_page(1251)

#endif //_WIN32


#ifdef APSTUDIO_INVOKED

//////////////////////////////////////////////////////////////

//

// TEXTINCLUDE

//


1 TEXTINCLUDE DISCARDABLE

BEGIN

 "resource.h\0"

END


2 TEXTINCLUDE DISCARDABLE

BEGIN

 "#include ""afxres.h""\r\n"

 "\0"

END


3 TEXTINCLUDE DISCARDABLE

BEGIN

 "\r\n"

 "\0"

END


#endif // APSTUDIO_INVOKED


//////////////////////////////////////////////////////////////

//

// Menu

//


IDR_MENU MENU DISCARDABLE

BEGIN

 POPUP "Work"

 BEGIN

  MENUITEM "Process",         ID_WORK_PROCESS

  MENUITEM "Direct set ADD",  ID_WORK_DIRECT_ADD

  MENUITEM "Direct set SUB",  ID_WORK_DIRECT_SUB

  MENUITEM "Disable ADD SUB", ID_WORK_DISABLE_ADDSUB

  MENUITEM "Switch TEXT",     ID_WORK_ON_SWITCH_TEXT

  MENUITEM SEPARATOR

  MENUITEM "Exit",            ID_WORK_EXIT

 END

END


//////////////////////////////////////////////////////////////

//

// String Table

//


STRINGTABLE DISCARDABLE

BEGIN

 ID_INDICATOR_ADD "START"

END


STRINGTABLE DISCARDABLE

BEGIN

 ID_INDICATOR_PROGRESS "neve display"

 ID_INDICATOR_TEXT     "TEXT"

END


STRINGTABLE DISCARDABLE

BEGIN

 ID_WORK_PROCESS        "Display and play progress bar"

 ID_WORK_DIRECT_ADD     "Set indicator ID_INDICATOR_ADD to ADD"

 ID_WORK_ON_SWITCH_TEXT "Switch text in indicator ID_INDICATOR_TEXT"

 ID_WORK_DIRECT_SUB     "Set indicator ID_INDICATOR_ADD to SUB"

 ID_WORK_DISABLE_ADDSUB "Disable indicator ID_INDICATOR_ADD"

 ID_WORK_EXIT           "Exit application"

END


STRINGTABLE DISCARDABLE

BEGIN

 AFX_IDS_IDLEMESSAGE "Ready"

END


#endif // Russian resources

//////////////////////////////////////////////////////////////


#ifndef APSTUDIO_INVOKED

//////////////////////////////////////////////////////////////

//

// Generated from the TEXTINCLUDE 3 resource.

//


//////////////////////////////////////////////////////////////

#endif // not APSTUDIO_INVOKED

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ рСсурсов прилоТСния Status ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Ρ„Π°ΠΉΠ»Π΅ resource.h. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» создаСтся автоматичСски Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ рСсурсов Microsoft Visual C++. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ тСкст Ρ„Π°ΠΉΠ»Π° resource.h прСдставлСн Π² листингС 3.15.

Листинг 3.15. Π€Π°ΠΉΠ» resource.h

//{{NO_DEPENDENCIES}}

// Microsoft Developer Studio generated include file.

// Used by Status.rc

//

#define ID_INDICATOR_ADD       1

#define IDR_MENU               101

#define ID_INDICATOR_PROGRESS  102

#define ID_INDICATOR_TEXT      103

#define ID_WORK_PROCESS        40001

#define ID_WORK_DIRECT_ADD     40006

#define ID_WORK_ON_SWITCH_TEXT 40007

#define ID_WORK_DIRECT_SUB     40008

#define ID_WORK_DISABLE_ADDSUB 40009

#define ID_WORK_EXIT           40010

#define ID_TIMER_CHECK         0xE001


// Next default values for new objects

//

#ifdef APSTUDIO_INVOKED

#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE 106

#define _APS_NEXT_COMMAND_VALUE  40011

#define _APS_NEXT_CONTROL_VALUE  1000

#define _APS_NEXT_SYMED_VALUE    104

#endif

#endif

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Status ΠΈ запуститС Π΅Π³ΠΎ. На экранС появится Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ прилоТСния, Π² Π½ΠΈΠΆΠ½Π΅ΠΉ части ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ отобраТаСтся панСль состояния (рис. 3.23).

Рис. 3.23. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Status


Π’ ΠΏΠ°Π½Π΅Π»ΠΈ состояния располоТСны нСсколько ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ². Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ зависит ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠΊΠ½Π° прилоТСния, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ подсказку ΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ строкС мСню прилоТСния ΠΈΠ»ΠΈ систСмного мСню, Π° Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ β€œΠ±Π΅Π·Π΄Π΅ΠΉΡΡ‚Π²ΡƒΠ΅Ρ‚β€ Π² Π½Π΅ΠΌ отобраТаСтся строка Ready.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ OVR. Π’ нашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎΠ½ Π½Π΅ дСйствуСт. Π’Ρ‹ сами ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для управлСния этим ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ.

ВслСд Π·Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ OVR слСдуСт свободноС пространство, занятоС ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ. Π­Ρ‚ΠΎΡ‚ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π΅ отобраТаСтся Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для рСзСрвирования мСста ΠΏΠΎΠ΄ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ progress bar.

Если Π²Ρ‹ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΈΠ· мСню Work строку Process, Ρ‚ΠΎ Π½Π° этом мСстС появится Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΏΠ»Π°Π²Π½ΠΎ ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ своС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Ρ…ΠΎΠ΄ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ процСсса.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ процСсса, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ с ΠΏΠ°Π½Π΅Π»ΠΈ состояния, Π° Π² самом ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅ появится надпись Process completed.

Π—Π°Ρ‚Π΅ΠΌ Π² ΠΏΠ°Π½Π΅Π»ΠΈ состояния ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Ρ‚Ρ€ΠΈ стандартных ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° CAP, NUM ΠΈ SCRL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС клавиш <Caps Lock>, <Num Lock> ΠΈ <Scroll Lock>.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ рассмотрим, называСтся TEXT. Если Π²Ρ‹ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΈΠ· мСню Work строку Switch TEXT, Ρ‚ΠΎ надпись TEXT Π² ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅ замСнится Π½Π° PIC. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ Π΄Π°Π½Π½ΠΎΠΉ строки мСню восстановит ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ состояниС ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°.

ПослСдний ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π² ΠΏΠ°Π½Π΅Π»ΠΈ состояния START. Π­Ρ‚ΠΎΡ‚ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ управляСт трСмя строками мСню Work. ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ строки Direct set ADD Π² ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅ отобраТаСтся строка ADD, Π° ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ строки Direct set SUB – SUB. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС Ρ‚Π°ΠΊΠΆΠ΅ мСняСтся ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°. Если Π²Ρ‹ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΈΠ· мСню Work строку Disable ADD SUB, Ρ‚ΠΎ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½.