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

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

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

ΠœΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° размСщСния полосы progress bar Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ состояния достаточно проста. Π’ Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° потрСбуСтся вывСсти полосу progress bar, просто создайтС Π΅Π΅, ΡƒΠΊΠ°Π·Π°Π² Π² качСствС Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° панСль состояния. ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° progress bar ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ отобраТался Π½Π° мСстС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ². ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Ρ€Π°ΠΌΠΊΡƒ с этого ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½Π΅ΠΌ Π½Π΅ отобраТался тСкст.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Status

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Status. Π’ качСствС Ρ‚ΠΈΠΏΠ° прилоТСния Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΈΠ· списка Type строку Application. НастройтС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Status, ΡƒΠΊΠ°Π·Π°Π², Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ классов MFC.

НабСритС Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ исходный тСкст прилоТСния ΠΈ сохранитС Π΅Π³ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ Status.cpp (листинг 3.13). Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» DialogBar.cpp Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

Листинг 3.13. Π€Π°ΠΉΠ» Status.cpp

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

// ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Status

// (c) Frolov G.V., 1996

// E-mail: [email protected]

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


// Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ для MFC

#include <afxwin.h>

#include <afxext.h>

#include <afxcmn.h>


// Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ» для рСсурсов прилоТСния ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²

#include "resource.h"


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

// Класс CStateApp – Π³Π»Π°Π²Π½Ρ‹ΠΉ класс прилоТСния

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

class CStateApp : public CWinApp {

public:

 // ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ InitInstance,

 // ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ прилоТСния

 virtual BOOL InitInstance();

};


// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ класса CStateApp

CStateApp StateApp;


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

// Класс CStateWindow – прСдставляСт Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ

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

class CStateWindow : public CFrameWnd {


protected:

 CStatusBar  m_wndStatusBar; // ПанСль состояния

 BOOL  bIndicatorTEXT;       // Π€Π»Π°Π³ для управлСния

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

                             // ID_INDICATOR_TEXT


protected:

 // ΠœΠ΅Ρ‚ΠΎΠ΄ для создания ΠΎΠΊΠ½Π° прилоТСния ΠΈ ΠΏΠ°Π½Π΅Π»ΠΈ состояния

 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);


public:

 // ОбъявляСм конструктор класса CStateWindow

 CStateWindow();


 // ОбъявляСм ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ мСню

 afx_msg BOOL OnMenuDirectADD_SUB(UINT nID);

 afx_msg void OnMenuProcessBar();

 afx_msg void OnMenuDisableADD_SUB();

 afx_msg void OnMenuSwitchTEXT();

 afx_msg void OnMenuExit();


 // ΠœΠ΅Ρ‚ΠΎΠ΄ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ON_UPDATE_COMMAND_UI

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

 afx_msg void OnUpdateTEXT(CCmdUI* pCmdUI);


 // ΠœΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ класс

 // CStateWindow ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сообщСния

 DECLARE_MESSAGE_MAP()   

};


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

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

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

BEGIN_MESSAGE_MAP(CStateWindow, CFrameWnd)


 // ΠœΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnCreate

 ON_WM_CREATE()


 // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСния ON_UPDATE_COMMAND_UI

 ON_UPDATE_COMMAND_UI(ID_INDICATOR_TEXT, OnUpdateTEXT)


 // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ мСню Work

 ON_COMMAND(ID_WORK_PROCESS, OnMenuProcessBar)

 ON_COMMAND(ID_WORK_DISABLE_ADDSUB, OnMenuDisableADD_SUB)

 ON_COMMAND(ID_WORK_ON_SWITCH_TEXT, OnMenuSwitchTEXT)  

 ON_COMMAND_EX(ID_WORK_DIRECT_ADD, OnMenuDirectADD_SUB)

 ON_COMMAND_EX(ID_WORK_DIRECT_SUB, OnMenuDirectADD_SUB) 

 ON_COMMAND(ID_WORK_EXIT, OnMenuExit)


END_MESSAGE_MAP()


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

// Π˜Π½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠ°Π½Π΅Π»ΠΈ управлСния. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²

// соотвСтствуСт порядку ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Π² ΠΏΠ°Π½Π΅Π»ΠΈ состояния

// (Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ SetPaneInfo)

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

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)

};


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

// ΠœΠ΅Ρ‚ΠΎΠ΄ InitInstance класса CStateApp

// Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ прилоТСния ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΅Π³ΠΎ Π½Π° экранС

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

BOOL CStateApp::InitInstance() {

 m_pMainWnd = new CStateWindow();

 m_pMainWnd->ShowWindow(m_nCmdShow);

 m_pMainWnd->UpdateWindow();

 return TRUE;

}


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

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

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

CStateWindow::CStateWindow() {

 // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ прилоТСния, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅

 // Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ класса CStateWindow

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


 // УстанавливаСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„Π»Π°Π³Π° bIndicatorTEXT

 bIndicatorTEXT = TRUE;

}


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

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

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

void CStateWindow::OnMenuProcessBar() {

 // ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ID_INDICATOR_PROGRESS

 RECT rectProgress;

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


 // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ полосу progress bar. Π Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π΅Π΅

 // Π½Π° мСстС ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ID_INDICATOR_PROGRESS

 CProgressCtrl ctrlProgressBar;


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

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

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

  return;

 }


 // УстанавливаСм Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ для progress bar

 ctrlProgressBar.SetRange(0, 100);


 // УстанавливаСм шаг приращСния для progress bar

 ctrlProgressBar.SetStep(1);


 // Плавно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ progress bar

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

  // ВыполняСм ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ

  Sleep(10);


  // ВыполняСм шаг приращСния progress bar

  ctrlProgressBar.StepIt();

 }


 // По Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ тСкст Π² самом ΠΏΠ΅Ρ€Π²ΠΎΠΌ

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

 m_wndStatusBar.SetWindowText("Process completed");

}


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

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

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

BOOL CStateWindow::OnMenuDirectADD_SUB(UINT nID) {

 // ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ индСкс ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ID_INDICATOR_ADD

 int nIndex = m_wndStatusBar.CommandToIndex(ID_INDICATOR_ADD);


 // УстанавливаСм Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ отобраТСния ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°

 m_wndStatusBar.SetPaneStyle(nIndex, SBPS_NORMAL);


 // Из мСню Work Π²Ρ‹Π±Ρ€Π°Π½Π° строка Direct set ADD

 if (nID == ID_WORK_DIRECT_ADD) {

  // Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ тСкст ADD

  m_wndStatusBar.SetPaneText(nIndex, "ADD");

 }


 // Из мСню Work Π²Ρ‹Π±Ρ€Π°Π½Π° строка Direct set SUB

 else if(nID == ID_WORK_DIRECT_SUB)   {

  // ИзмСняСм внСшний Π²ΠΈΠ΄ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°

  m_wndStatusBar.SetPaneStyle(nIndex, SBPS_POPOUT);


  // Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ тСкст SUB

  m_wndStatusBar.SetPaneText(nIndex, "SUB");

 }


 return TRUE;

}


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

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

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

void CStateWindow::OnMenuDisableADD_SUB() {

 // ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ индСкс ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ID_INDICATOR_ADD

 int nIndex = m_wndStatusBar.CommandToIndex(ID_INDICATOR_ADD);


 // Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€

 m_wndStatusBar.SetPaneStyle(nIndex, SBPS_DISABLED);

}


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

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

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

void CStateWindow::OnMenuSwitchTEXT() {

 // ИзмСняСм состояниС Ρ„Π»Π°Π³Π° bIndicatorTEXT,

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

 bIndicatorTEXT = !bIndicatorTEXT;

}


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

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

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