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

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

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

Рис. 3.6. ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π½ΠΎΠ΅ мСню, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Pop-up Menu


Π’ Ρ„Π°ΠΉΠ» рСсурсов Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ контСкстного мСню CG_IDR_POPUP_MULTI_VIEW. Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΎΠ½ΠΎ Π½Π΅ отличаСтся ΠΎΡ‚ мСню, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ создавали ΠΈΠ»ΠΈ использовали Ρ€Π°Π½Π΅Π΅, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ мСню Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΎ строкой _POPUP_ (рис. 3.6). Π­Ρ‚Π° строка Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π² контСкстном мСню.

Если Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ имССтся нСсколько ΠΎΠΊΠΎΠ½, Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ своС контСкстноС мСню. Для этого Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Pop-up Menu нСсколько Ρ€Π°Π·, указывая Π² ΠΏΠΎΠ»Π΅ Add pop-up menu to Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ классы ΠΎΠΊΠΎΠ½. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ вставлСнноС Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ мСню ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° строк.

НапримСр, Ссли Ρƒ вас ΠΌΠ½ΠΎΠ³ΠΎΠΎΠΊΠΎΠ½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Pop-up Menu для Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° прилоТСния ΠΈ для ΠΎΠΊΠ½Π° просмотра. Π’ΠΎΠ³Π΄Π° Ссли Π²Ρ‹ Π½Π°ΠΆΠΌΠ΅Ρ‚Π΅ ΠΏΡ€Π°Π²ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΈ Π² Ρ‚ΠΎ врСмя, ΠΊΠΎΠ³Π΄Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ находится Π² ΠΎΠΊΠ½Π΅ просмотра, Ρ‚ΠΎ отобраТаСтся ΠΎΠ΄Π½ΠΎ контСкстноС мСню, Π° Ссли Π²Ρ‹ Π½Π°ΠΆΠΌΠ΅Ρ‚Π΅ ΠΏΡ€Π°Π²ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΈ ΠΊΠΎΠ³Π΄Π° Π΅Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ располоТСн Π²Π½Π΅ ΠΎΠΊΠ½Π° просмотра – отобраТаСтся Π΄Ρ€ΡƒΠ³ΠΎΠ΅ контСкстноС мСню.

Класс CMultiView

ВсС измСнСния Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ прилоТСния Multi, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈ вставкС Π² Π½Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Pop-up Menu, происходят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² классС ΠΎΠΊΠ½Π°, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ добавляСтся контСкстноС мСню. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Pop-up Menu добавляСт ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ON_WM_CONTEXTMENU ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ сообщСний класса CMultiView, Π° Ρ‚Π°ΠΊΠΆΠ΅ встсавляСт Π² класс CMultiView ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ OnContextMenu ΠΈ PreTranslateMessage.

Π’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса CMultiView добавляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ OnContextMenu. ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты класса Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ. ПослС добавлСния ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ Pop-up Menu класс CMultiView, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² Ρ„Π°ΠΉΠ»Π΅ MultiView.h Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

class CMultiView : public CView {

protected:

 // CG: ΠœΠ΅Ρ‚ΠΎΠ΄ OnContextMenu Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ Pop-up Menu

 afx_msg void OnContextMenu(CWnd*, CPoint point);


 CMultiView();

 DECLARE_DYNCREATE(CMultiView)


// Attributes

public:

 virtual BOOL PreTranslateMessage(MSG* pMsg);

 CMultiDoc* GetDocument();


// Operations

public:


// Overrides

 //{{AFX_VIRTUAL(CMultiView)

public:

 virtual void OnDraw(CDC* pDC);

 virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

protected:

 virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

 virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);

 virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

 //}}AFX_VIRTUAL


// Implementation

public:

 virtual ~CMultiView();

#ifdef _DEBUG

 virtual void AssertValid() const;

 virtual void Dump(CDumpContext& dc) const;

#endif


protected:

 //{{AFX_MSG(CMultiView)

 //}}AFX_MSG

 DECLARE_MESSAGE_MAP()

};

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ классы прилоТСния ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π±Π΅Π· измСнСния.

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

ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ контСкстного мСню ΠΊ ΠΎΠΊΠ½Ρƒ класса CMultiView, Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ сообщСний класса CMultiView добавляСтся новая ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Π° ON_WM_CONTEXTMENU:

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

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


// ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса CMultiView ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ динамичСски

IMPLEMENT_DYNCREATE(CMultiView, CView)


// Π’Π°Π±Π»ΠΈΡ†Π° сообщСний класса CMultiView. Π’ Π½Π΅Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π°

// ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Π° ON_WM_CONTEXTMENU

BEGIN_MESSAGE_MAP(CMultiView, CView)

 ON_WM_CONTEXTMENU()

 //{{AFX_MSG_MAP(CMultiView)

 //}}AFX_MSG_MAP

 // Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

 ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)

 ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)

 ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)

END_MESSAGE_MAP()

ΠœΠ΅Ρ‚ΠΎΠ΄ OnContextMenu класса CMultiView

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€Π°Π²ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΈ Π² ΠΎΠΊΠ½Π΅, ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Π° ON_WM_CONTEXTMENU Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ OnContextMenu ΠΈΠ· класса этого ΠΎΠΊΠ½Π°. ΠœΠ΅Ρ‚ΠΎΠ΄Ρƒ OnContextMenu ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

afx_msg void OnContextMenu(CWnd* pWnd, CPoint pos);

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ pWnd содСрТит ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса CWnd. Он прСдставляСт ΠΎΠΊΠ½ΠΎ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находился ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ, ΠΊΠΎΠ³Π΄Π° Π±Ρ‹Π»Π° Π½Π°ΠΆΠ°Ρ‚Π° правая ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ класса ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Π° сообщСний ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π΅ ΠΎΠΊΠ½ΠΎ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ pos, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса CPoint, содСрТит ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ указатСля ΠΌΡ‹ΡˆΠΈ, зафиксированныС Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ наТатия ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΈ.

РСализация ΠΌΠ΅Ρ‚ΠΎΠ΄Π° OnContextMenu добавляСтся Π² Ρ„Π°ΠΉΠ»Π΅ MultiView.cpp:

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

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

// CG: ΠœΠ΅Ρ‚ΠΎΠ΄ OnContextMenu Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ Pop-up Menu

void CMultiView::OnContextMenu(CWnd*, CPoint point) {

 // ΠžΠ±ΡŠΠ΅ΠΊΡ‚ menu Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ контСкстноС мСню

 CMenu menu;

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

 VERIFY(menu.LoadMenu(CG_IDR_POPUP_MULTI_VIEW));


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

 CMenu* pPopup = menu.GetSubMenu(0);

 ASSERT(pPopup != NULL);


 // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ CWnd, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠΊΠ½ΠΎ

 // Π΄Π»Ρ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π°Π΄ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ контСкстноС мСню

 CWnd* pWndPopupOwner = this;

 while (pWndPopupOwner->GetStyle() & WS_CHILD) pWndPopupOwner = pWndPopupOwner->GetParent();


 // ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ контСкстноС мСню

 pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndPopupOwner);

}

Для Π²Ρ‹Π²ΠΎΠ΄Π° контСкстного мСню Π½Π° экран ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ TrackPopupMenu, входящий Π² класс CMenu. ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π½ΠΎΠ΅ мСню ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π² любом мСстС экрана. Π’Π½Π΅ зависимости ΠΎΡ‚ располоТСния мСню, всС ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Π΅ сообщСния ΠΎΡ‚ Π½Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° TrackPopupMenu Π·Π°Π΄Π°ΡŽΡ‚ располоТСниС контСкстного мСню ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ для Π½Π΅Π³ΠΎ ΠΎΠΊΠ½ΠΎ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Π΅ сообщСния:

BOOL TrackPopupMenu(UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = 0);

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ nFlags прСдставляСт собой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². Они ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ мСню ΠΈ какая ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π±ΠΎΡ€Π° строк ΠΈΠ· этого мСню.

Если Π² качСствС nFlags ΡƒΠΊΠ°Π·Π°Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ TPM_CENTERALIGN, Ρ‚ΠΎ контСкстноС мСню отобраТаСтся ΠΏΠΎ Ρ†Π΅Π½Ρ‚Ρ€Ρƒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ x. Если Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ nFlags установлСн Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ TPM_LEFTALIGN, Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ x опрСдСляСт ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ Π»Π΅Π²ΠΎΠΉ стороны мСню, Π° Ссли установлСн Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ TPM_RIGHTALIGN β€” ΠΏΡ€Π°Π²ΠΎΠΉ.

ΠšΡ€ΠΎΠΌΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² TPM_CENTERALIGN, TPM_LEFTALIGN ΠΈΠ»ΠΈ TPM_RIGHTALIGN Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ nFlags ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ TPM_LEFTBUTTON ΠΈΠ»ΠΈ TPM_RIGHTBUTTON. Атрибут TPM_LEFTBUTTON Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±ΠΎΡ€ ΠΈΠ· мСню осущСствляСтся Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ Π»Π΅Π²ΠΎΠΉ, Π° TPM_RIGHTBUTTON β€” ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ.

НазначСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° x зависит ΠΎΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², установлСнных Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ nFlags. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ y Π²ΠΎ всСх случаях ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ располоТСниС Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ стороны мСню. ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ x ΠΈ y ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² экранных ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ….

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ pWnd Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса CWnd, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠΊΠ½ΠΎ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ всС ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Π΅ сообщСния ΠΎΡ‚ контСкстного мСню.

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π½ΠΎΠ΅ мСню закрываСтся, Ссли Π²Ρ‹ Π½Π°ΠΆΠΌΠ΅Ρ‚Π΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΈ Π²Π½Π΅ мСню. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lpRect позволяСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ закрытия мСню. Если этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π°Π²Π΅Π½ NULL, мСню закрываСтся, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠ°Π» ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΈ Π² любом мСстС экрана Π²Π½Π΅ мСню.

Π’ случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΌΠ΅Ρ‚ΠΎΠ΄ TrackPopupMenu Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π½ΡƒΠ»ΡŒ.

ΠœΠ΅Ρ‚ΠΎΠ΄ PreTranslateMessage класса CMultiView

ΠšΡ€ΠΎΠΌΠ΅ добавлСния Π½ΠΎΠ²ΠΎΠΉ ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ сообщСний класса CMultiView ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° OnContextMenu, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Pop-up Menu добавляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ PreTranslateMessage ΠΊ классу CMultiView.

Π’ Π½Π΅Π³ΠΎ записываСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ клавиш <Shift+F10> ΠΈΠ»ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ клавиши Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ клавишами Windows 95 ΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnContextMenu:

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

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

 BOOL CMultiView::PreTranslateMessage(MSG* pMsg) {

 // CG: Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π±Π»ΠΎΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ Pop-up Menu

 {

  // Если Π½Π°ΠΆΠ°Ρ‚Π° комбинация клавиш <Shift+F10>

  if ((((pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN) && (pMsg->wParam == VK_F10) && (GetKeyState(VK_SHIFT) & ~1)) != 0) || // it's Shift+F10 OR Natural keyboard key

   (pMsg->message == WM_CONTEXTMENU)) {

   // ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ экранныС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ клиСнтской части ΠΎΠΊΠ½Π°

   CRect rect;

   GetClientRect(rect);

   ClientToScreen(rect);

   // ЗаписываСм Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ point класса CPoint ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹

   // Π»Π΅Π²ΠΎΠ³ΠΎ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΡƒΠ³Π»Π° клиСнтской части ΠΎΠΊΠ½Π°, добавляя

   // ΠΊ Π½Π΅ΠΌΡƒ смСщСния Π² 5 пиксСлов ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ

   CPoint point = rect.TopLeft();

   point.Offset(5, 5);

   // ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ контСкстноС мСню Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ point

   OnContextMenu(NULL, point);


   // Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ TRUE, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сообщСниС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ

   return TRUE;

  }

 }


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