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

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

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

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

 virtual BOOL InitInstance();

};


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

CMultiMenuApp MultiMenuApp;


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

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

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

class CMultiMenuWindow : public CFrameWnd {


protected:

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

 CStatusBar m_wndStatusBar;


 // Π€Π»Π°Π³ управляСт строкой Prosess мСню Mission

 BOOL bEnable;


 // Π€Π»Π°Π³ управляСт строкой Construction мСню Mission

 BOOL bRadio;


 // Π€Π»Π°Π³ управляСт строкой Restrict мСню Menu

 int nCheck;


protected:

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

  afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);


 // ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Ρ… сообщСний

 // ΠΎΡ‚ мСню прилоТСния

 afx_msg void CMultiMenuWindow::OnDisable();

 afx_msg void CMultiMenuWindow::OnCommand();

 afx_msg void CMultiMenuWindow::OnExit();

 afx_msg void CMultiMenuWindow::OnConstruct();

 afx_msg void CMultiMenuWindow::OnRestrictMenu();

 afx_msg void CMultiMenuWindow::OnFullMenu();


 // ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ для обновлСния мСню

 afx_msg void OnUpdateProcess(CCmdUI* pCmdUI);

 afx_msg void OnUpdateConstruct(CCmdUI* pCmdUI);

 afx_msg void OnUpdateDisable(CCmdUI* pCmdUI);


public:

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

 CMultiMenuWindow();


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

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

 DECLARE_MESSAGE_MAP()

};


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

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

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

BEGIN_MESSAGE_MAP(CMultiMenuWindow, CFrameWnd)

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

 ON_WM_CREATE()


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

 ON_WM_CONTEXTMENU()


 // ΠœΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Ρ… сообщСний

 ON_COMMAND(ID_MENU_DISABLE, OnDisable)

 ON_COMMAND(ID_MISSION_CONSTRUCT, OnConstruct)

 ON_COMMAND(ID_FILE_EXIT, OnExit)

 ON_COMMAND(ID_MISSION_PROCESS, OnCommand)


 ON_COMMAND(ID_MENU_RESTRICT, OnRestrictMenu)

 ON_COMMAND(ID_MENU_FULL, OnFullMenu)


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

 ON_UPDATE_COMMAND_UI(ID_MISSION_PROCESS, OnUpdateProcess)

 ON_UPDATE_COMMAND_UI(ID_MISSION_CONSTRUCT, OnUpdateConstruct)

 ON_UPDATE_COMMAND_UI(ID_MENU_DISABLE, OnUpdateDisable)

END_MESSAGE_MAP()


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

UINT indicator = ID_SEPARATOR;


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

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

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

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

BOOL CMultiMenuApp::InitInstance() {

 m_pMainWnd = new CMultiMenuWindow();

 m_pMainWnd->ShowWindow(m_nCmdShow);

 m_pMainWnd->UpdateWindow();


 return TRUE;

}


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

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

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

CMultiMenuWindow::CMultiMenuWindow() {

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

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

 Create(NULL, "Multi Menu Sample", WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_FULL_MENU));


 // Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ клавиш аксСлСрации

 LoadAccelTable(MAKEINTRESOURCE(IDR_ACCELERATOR));


 // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π»Π°Π³ΠΈ

 bEnable = TRUE;

 bRadio = TRUE;

 nCheck = 0;

}


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

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

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

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

int CMultiMenuWindow::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(&indicator, 1)) {

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

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

  return -1;

 }


 return 0;

}


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

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

// ИзмСняСм состояниС Ρ„Π»Π°Π³ΠΎΠ² bEnable ΠΈ nCheck

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

void CMultiMenuWindow::OnDisable(){

 // МСняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ bEnable с TRUE Π½Π° FALSE ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚

 bEnable = !bEnable;


 // МСняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ bEnable с 1 Π½Π° 0 ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚

 nCheck = (nCheck == 1) ? 0 : 1;

}


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

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

// ИзмСняСм мСню прилоТСния с IDR_FULL_MENU Π½Π°

// IDR_RESTRICT_MENU

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

void CMultiMenuWindow::OnRestrictMenu(){

 CMenu menuOld;       // Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ мСню

 CMenu menuRestrict;  // Π½ΠΎΠ²ΠΎΠ΅ мСню

 CMenu* pMenu;


 // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ мСню

 pMenu = this->GetMenu();


 // БвязываСм мСню с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ menuOld

 menuOld.Attach(pMenu->m_hMenu);


 // УдаляСм мСню

 menuOld.DestroyMenu();


 // Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ мСню IDR_RESTRICT_MENU

 menuRestrict.LoadMenu(IDR_RESTRICT_MENU);


 // УстанавливаСм Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ΅ мСню

 SetMenu(&menuRestrict);


 // Π Π°Π·Ρ€Ρ‹Π²Π°Π΅ΠΌ связь мСню с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ menuRestrict

 menuRestrict.Detach();

}


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

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

// ИзмСняСм мСню прилоТСния с IDR_RESTRICT_MENU Π½Π°

// IDR_FULL_MENU

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

void CMultiMenuWindow::OnFullMenu() {

 CMenu menuOld;

 CMenu menuRestrict;

 CMenu* pMenu;


 pMenu = this->GetMenu();

 menuOld.Attach(pMenu->m_hMenu);

 menuOld.DestroyMenu();


 menuRestrict.LoadMenu(IDR_FULL_MENU);

 SetMenu(&menuRestrict);

 menuRestrict.Detach();

}


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

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

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

void CMultiMenuWindow::OnCommand() {

 MessageBox("Command not implemented");

}


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

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

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

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

void CMultiMenuWindow::OnConstruct() {

 // МСняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ bRadio с TRUE Π½Π° FALSE ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚

 bRadio = !bRadio;

}


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

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

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

void CMultiMenuWindow::OnExit() {

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

 DestroyWindow();

 return;

}


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

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

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

void CMultiMenuWindow::OnUpdateProcess(CCmdUI* pCmdUI) {

 // Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ»ΠΈ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ строку Process мСню Mission

 pCmdUI->Enable(bEnable);

}


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

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

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

void CMultiMenuWindow::OnUpdateConstruct(CCmdUI* pCmdUI) {

 // УстанавливаСм ΠΈΠ»ΠΈ снимаСм ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΡƒ

 // строки Construction мСню Mission

 pCmdUI->SetRadio(bRadio);

}


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

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

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

void CMultiMenuWindow::OnUpdateDisable(CCmdUI* pCmdUI) {

 // УстанавливаСм ΠΈΠ»ΠΈ удаляСм ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΡƒ

 // Ρƒ строки Disable мСню Menu

 pCmdUI->SetCheck(nCheck);

}

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» рСсурсов ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π΅Π³ΠΎ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ MultiMenu.rc. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π² Π½Π΅Π³ΠΎ Π΄Π²Π° мСню, присвоив ΠΈΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ IDR_RESTRICT_MENU ΠΈ IDR_FULL_MENU.

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