Override OnRButtonDown() of CSizingControlBar

從 如何使用 CControlBar 實作 Docking Windows 開始慢慢摸索 CSizingControlBar 的基礎功能。直到 Views in a Sizeable Docking Control Bar 才開始在這個基礎上去延伸自己的東西。今天就是要紀錄一下怎麼在 CViewBar (derived from CSizingControlBar) 上新增自己的功能:彈出右鍵選單。

之前在 如何在 CTreeCtrl 上添加右鍵選單 是用 OnRBClick(),這邊就換個不同的方法。

1. 首先因為 CSizingControlBar 已經有實作 OnRButtonDown() 功能了,所以要先在原先的函式宣告上加入 virtual,這樣 child class 才可以 Override 寫自己的內容。

// sizecbar.h
afx_msg virtual void OnRButtonDown(UINT nFlags, CPoint point);

2. 接著再修改繼承的 CViewBar.h 和 CViewBar.cpp

// CViewBar.h
afx_msg void OnRButtonDown(UINT nFlags,CPoint point);

// CViewBar.cpp
BEGIN_MESSAGE_MAP(CViewBar, TViewBarBase)
 ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

void CViewBar::OnRButtonDown(UINT nFlags,CPoint point)
{
 CMenu menu;
 menu.LoadMenu(IDR_PMPOPMENU);
 CMenu* pPopup = menu.GetSubMenu(0);
 ASSERT(pPopup != NULL);

 ClientToScreen(&point);
 pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,GetParent());
}

就可以成功顯示右鍵選單囉。

 

Ps,過程中遇到一件蠻蠢的事情,ASSERT(pPopup != NULL);這行會一直錯誤,除錯過程中發現他一直是零。Google後看到有人回答:

The only reason for CMenu::GetSubMenu(0) to return NULL is that there’s not popup menu at position 0 of your IDR_POPUP_MENU.

才發現原來之前拉的PopMenu沒有存到檔案,難怪他抓不到冏

 

[參考資料]

1. MFC中如何添右键弹出菜单

2. CMenu::GetSubMenu()