Π ΠΈΡ. 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