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

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

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

Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Status ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π΄Π²Π° класса – Π³Π»Π°Π²Π½Ρ‹ΠΉ класс прилоТСния CStateApp ΠΈ класс Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° прилоТСния CStateWindow.

Π“Π»Π°Π²Π½Ρ‹ΠΉ класс прилоТСния CDlgBarApp

Π“Π»Π°Π²Π½Ρ‹ΠΉ класс прилоТСния CStateApp наслСдуСтся ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса CWinApp. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ StateApp класса CStateApp объявлСн ΠΊΠ°ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ создаСтся сразу послС запуска прилоТСния.

Π’ класс CStateApp Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ InitInstance. Он создаСт Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ прилоТСния, прСдставлСнноС классом CStateWindow, наслСдованным ΠΎΡ‚ класса CFrameWnd.

Класс Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° прилоТСния CStateWindow

Класс CStateWindow управляСт Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠΊΠ½ΠΎΠΌ прилоТСния, создаСт панСль состояния, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сообщСния.

ΠšΡ€ΠΎΠΌΠ΅ ряда ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π² класс CStateWindow Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ„Π»Π°Π³ bIndicatorTEXT, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для управлСния ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ID_INDICATOR_TEXT, ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ m_wndStatusBar класса CStatusBar, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для создания ΠΈ отобраТСния полосы progress bar.

Рассмотрим ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса CStateWindow Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ класса CStateWindow

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ класса CStateWindow ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° прилоТСния. Для этого вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ Create класса CFrameWnd. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Create создаСт ΠΎΠΊΠ½ΠΎ с мСню, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ IDR_MENU:

Create(NULL, "Status Bar Sample", WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MENU));

Π’ конструкторС класса CStateWindow Ρ‚Π°ΠΊΠΆΠ΅ устанавливаСтся Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС Ρ„Π»Π°Π³Π° bIndicatorTEXT:

bIndicatorTEXT = TRUE;

Π’Π°Π±Π»ΠΈΡ†Π° сообщСний класса CStateWindow

Π’Π°Π±Π»ΠΈΡ†Π° сообщСний класса CStateWindow ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Π΅ сообщСния ΠΎΡ‚ мСню Work, Π° Ρ‚Π°ΠΊΠΆΠ΅ содСрТит ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ON_UPDATE_COMMAND_UI ΠΈ ON_WM_CREATE.

ΠœΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Π° ON_UPDATE_COMMAND_UI Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnUpdateTEXT для обновлСния состояния ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ID_INDICATOR_TEXT ΠΏΠ°Π½Π΅Π»ΠΈ состояния:

ON_UPDATE_COMMAND_UI(ID_INDICATOR_TEXT, OnUpdateTEXT)

ΠœΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Π° ON_WM_CREATE Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnCreate Π²ΠΎ врСмя создания ΠΎΠΊΠ½Π°:

ON_WM_CREATE()

Для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Ρ… сообщСний ΠΎΡ‚ мСню Work Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ сообщСний класса CStateWindow Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ нСсколько ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄ ON_COMMAND ΠΈ ON_COMMAND_EX. Они Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ OnMenuProcessBar, OnMenuDisableADD_SUB, OnMenuSwitchTEXT, OnMenuDirectADD_SUB ΠΈ OnMenuExit:

ON_COMMAND(ID_WORK_PROCESS, OnMenuProcessBar)

ON_COMMAND(ID_WORK_DISABLE_ADDSUB, OnMenuDisableADD_SUB)

ON_COMMAND(ID_WORK_ON_SWITCH_TEXT, OnMenuSwitchTEXT)

ON_COMMAND(ID_WORK_EXIT, OnMenuExit)

ON_COMMAND_EX(ID_WORK_DIRECT_ADD, OnMenuDirectADD_SUB)

ON_COMMAND_EX(ID_WORK_DIRECT_SUB, OnMenuDirectADD_SUB)

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

ΠœΠ΅Ρ‚ΠΎΠ΄ OnCreate класса CStateWindow сначала Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnCreate Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса CFrameWnd:

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

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ создаСм панСль состояния, указывая Π² качСствС Π΅Π΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ прилоТСния:

if (!m_wndStatusBar.Create(this)) {

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

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

 return -1;  

}

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ панСль состояния создана, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ SetIndicators, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹:

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

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

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

 return -1;  

}

Массив, содСрТащий ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² indicators ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

static UINT indicators[] = {

 ID_SEPARATOR,          // Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€

 ID_INDICATOR_OVR,      // Π˜Π½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ OVR

 ID_INDICATOR_PROGRESS, // Π Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ мСста для

                        // progress bar

 ID_INDICATOR_CAPS,     // Π˜Π½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ клавиши <Caps Lock>

 ID_INDICATOR_NUM,      // Π˜Π½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ клавиши <Num Lock>

 ID_INDICATOR_SCRL,     // Π˜Π½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ клавиши <Scroll Lock>

 ID_INDICATOR_TEXT,     // Π˜Π½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ TEXT/PIC

 ID_INDICATOR_ADD,      // Π˜Π½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ADD/SUB (Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅

                        // состояниС START)

};

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Π² массивС indicators соотвСтствуСт порядку Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π² ΠΏΠ°Π½Π΅Π»ΠΈ состояния. Π Π°Π·ΠΌΠ΅Ρ€ всСх ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ, выбираСтся автоматичСски, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎΠ±Ρ‹ тСкст ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π² Π½Π΅ΠΌ помСстился. ВСкст ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отобраТаСтся Π² Π½Π΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, бСрСтся ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… строковых рСсурсов прилоТСния. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² послСднСм ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅ ΠΏΠ°Π½Π΅Π»ΠΈ состояния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ID_INDICATOR_ADD Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ строка START, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ опрСдСлСнная Π² рСсурсах прилоТСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

STRINGTABLE DISCARDABLE

BEGIN

 ID_INDICATOR_ADD "START"

END

ВсС ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠ°Π½Π΅Π»ΠΈ состояния, ΠΊΡ€ΠΎΠΌΠ΅ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ID_INDICATOR_PROGRESS, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ стандартным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π‘Ρ‚ΠΈΠ»ΡŒ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ID_INDICATOR_PROGRESS устанавливаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ:

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

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

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

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

ΠœΠ΅Ρ‚ΠΎΠ΄ SetPaneInfo Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ тСкста Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΈ ΡƒΠ±ΠΈΡ€Π°Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‰ΡƒΡŽ Ρ€Π°ΠΌΠΊΡƒ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠ΅Ρ‚ΠΎΠ΄ SetPaneInfo устанавливаСт Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° 150 пиксСлов.

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

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΈΠ· мСню Work строку Process, Π½Π° мСстС ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ID_INDICATOR_PROGRESS создаСтся Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ progress bar, ΠΏΠ»Π°Π²Π½ΠΎ ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ своС состояниС. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ сообщСния ΠΎΡ‚ строки Process мСню Work осущСствляСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ OnMenuProcessBar класса CStateWindow.

ΠœΠ΅Ρ‚ΠΎΠ΄ OnMenuProcessBar опрСдСляСт ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ID_INDICATOR_PROGRESS ΠΈ записываСт ΠΈΡ… Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ rectProgress:

RECT rectProgress;

m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(ID_INDICATOR_PROGRESS), &rectProgress);

Π—Π°Ρ‚Π΅ΠΌ Π½Π° мСстС этого ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° создаСтся Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ progress bar. ΠžΡ€Π³Π°Π½ управлСния progress bar прСдставлСн ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ctrlProgressBar класса CProgressCtrl:

CProgressCtrl ctrlProgressBar;

НСпосрСдствСнно для создания progress bar ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ Create класса CProgressCtrl. Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² этому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ WS_CHILD ΠΈ WS_VISIBLE, ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ rectProgress, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ m_wndStatusBar ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ 1:

if (!ctrlProgressBar.Create(WS_CHILD | WS_VISIBLE, rectProgress, &m_wndStatusBar, 1)) {

 // Ошибка ΠΏΡ€ΠΈ создании progress bar

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

 return;

}

ПослС создания полосы progress bar устанавливаСм Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ (ΠΎΡ‚ 0 Π΄ΠΎ 100), Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

ctrlProgressBar.SetRange(0, 100);

Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ шаг приращСния для progress bar, Ρ€Π°Π²Π½Ρ‹ΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅:

ctrlProgressBar.SetStep(1);

Π—Π°Ρ‚Π΅ΠΌ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° progress bar. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ‚ΡŒ Ρ…ΠΎΠ΄ заполнСния Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, Π΄Π΅Π»Π°Π΅ΠΌ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ, вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Sleep:

for (int i=0; i<100; i++) {

 Sleep(10);

 ctrlProgressBar.StepIt();

}

Когда Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ progress bar окаТСтся Π·Π°ΠΏΠΎΠ»Π½Π΅Π½, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ SetWindowText, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ сообщСниС Process completed Π² самом ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅ ΠΏΠ°Π½Π΅Π»ΠΈ состояния:

m_wndStatusBar.SetWindowText("Process completed");

ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° OnMenuProcessBar ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ctrlProgressBar, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ progress bar, уничтоТаСтся ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΅Π³ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ исчСзаСт с ΠΏΠ°Π½Π΅Π»ΠΈ состояния.

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

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΈΠ· мСню Work строку Process, Π½Π° мСстС ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ID_INDICATOR_PROGRESS создаСтся Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ progress bar, ΠΏΠ»Π°Π²Π½ΠΎ ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ своС состояниС. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ сообщСния ΠΎΡ‚ строки Process мСню Work осущСствляСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ OnMenuProcessBar класса CStateWindow.

ΠœΠ΅Ρ‚ΠΎΠ΄ OnMenuProcessBar опрСдСляСт ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ID_INDICATOR_PROGRESS ΠΈ записываСт ΠΈΡ… Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ rectProgress:

RECT rectProgress;

m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(ID_INDICATOR_PROGRESS), &rectProgress);

Π—Π°Ρ‚Π΅ΠΌ Π½Π° мСстС этого ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° создаСтся Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ progress bar. ΠžΡ€Π³Π°Π½ управлСния progress bar прСдставлСн ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ctrlProgressBar класса CProgressCtrl:

CProgressCtrl ctrlProgressBar;

НСпосрСдствСнно для создания progress bar ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ Create класса CProgressCtrl. Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² этому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ WS_CHILD ΠΈ WS_VISIBLE, ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ rectProgress, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ m_wndStatusBar ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ 1:

if (!ctrlProgressBar.Create(WS_CHILD | WS_VISIBLE, rectProgress, &m_wndStatusBar, 1)) {

 // Ошибка ΠΏΡ€ΠΈ создании progress bar

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

 return;

}

ПослС создания полосы progress bar устанавливаСм Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ (ΠΎΡ‚ 0 Π΄ΠΎ 100), Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

ctrlProgressBar.SetRange(0, 100);

Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ шаг приращСния для progress bar, Ρ€Π°Π²Π½Ρ‹ΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅:

ctrlProgressBar.SetStep(1);

Π—Π°Ρ‚Π΅ΠΌ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° progress bar. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ‚ΡŒ Ρ…ΠΎΠ΄ заполнСния Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, Π΄Π΅Π»Π°Π΅ΠΌ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ, вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Sleep:

for (int i=0; i<100; i++) {

 Sleep(10);

 ctrlProgressBar.StepIt();

}

Когда Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ progress bar окаТСтся Π·Π°ΠΏΠΎΠ»Π½Π΅Π½, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ SetWindowText, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ сообщСниС Process completed Π² самом ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅ ΠΏΠ°Π½Π΅Π»ΠΈ состояния:

m_wndStatusBar.SetWindowText("Process completed");

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

ΠœΠ΅Ρ‚ΠΎΠ΄ OnMenuDirectADD_SUB класса CStateWindow вызываСтся для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ сообщСния с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ID_WORK_DISABLE_ADDSUB, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΌ ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ ΠΈΠ· мСню Work строки Disable ADD SUB.