1. 程式人生 > >給視窗新增右鍵選單 WM_CONTEXTMENU

給視窗新增右鍵選單 WM_CONTEXTMENU

在view派生類中新增 WM_CONTEXTMENU 訊息
例如:
void CZxView::OnContextMenu(CWnd* pWnd, CPoint point) 
{
// TODO: Add your message handler code here
CMenu menu;
menu.LoadMenu(IDR_MENU1);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,this);

                                                             //這裡設定選單由左邊界X軸對齊|並且滑鼠的左右鍵都可以選擇選單項


}

另一種形式:

 void ClistcontrolView::OnContextMenu(CWnd* pWnd, CPoint point)
{
 // TODO: 在此處新增訊息處理程式程式碼
 CMenu menu;
 menu.LoadMenu(IDR_MENU1);
 CMenu* pMenu = menu.GetSubMenu(0);
 pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,this,0);
      //這裡設定選單由左邊界X軸對齊|並且滑鼠的左右鍵都可以選擇選單項


}

其中 m.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,this);
//處理上下文選單,也就是右鍵單擊彈出的選單,在右鍵單擊的時候發出這個訊息
上下文選單不是通過LoadFram()掛接在頂層選單上的,而是通過TrackPopupMenu函式來顯示,
m.GetSubMenu(0):獲得指向選單m第一個頂層項的指標,把該項作為上下文選單
TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,this):
指定上下文選單顯示的方式,顯示位置(x,y),視窗,this表示在當前視窗顯示 
m.GetSubMenu(0):獲得指向選單m第一個頂層項的指標,頂層選單項是那些在視窗頂部顯示的選單項,

===========================================================================================================

 GetSubMenu函式

API函式
  函式功能:該函式取得被指定選單啟用的下拉式選單或子選單的控制代碼。

  函式原型:HMENU GetSubMenu(HMENU hMenu,int nPos);

  引數:   hMenu:選單控制代碼。   nPos:啟用下拉式選單或子選單的選單項相對於零的位置。

  返回值:如果函式呼叫成功,返回值是選單項啟用的下拉式選單或子選單的控制代碼。如果選單項沒有啟用一個下拉式選單或子選單,返回值是NULL。

MFC類成員函式
  CMenu::GetSubMenu   CMenu* GetSubMenu( int nPos ) const;

  返回值:  若彈出選單位於指定的位置,則返回CMenu 物件的指標,其中CMenu物件要包含彈出選單的控制代碼;否則為NULL。如果CMenu 物件不存在,那麼將建立臨時的CMenu 物件。但返回的CMenu指標不應被儲存。

   引數:  nPos  指定包含在選單中的彈出選單的位置。對於第一個選單項,位置值開始為0。彈出選單的識別符號不能被該函式使用。  
  說明:獲取彈出選單的CMenu物件。

TrackPopupMenu函式

函式功能:該函式在指定位置顯示快捷選單,並跟蹤選單項的選擇。快捷選單可出現在螢幕上的任何位置。

函式原型:BOOL TrackPopupMenu(HMENU hMenu,UINT uFlags,int x,int y,int nReserved,HWND hWnd,CONST RECT* prcRect);

引數一覽:

      hMenu:被顯示的快捷選單的控制代碼。此控制代碼可為呼叫CreatePopupMenu建立的新快捷選單的控制代碼,也可以為呼叫GetSubMenu取得的與一個已存在選單項相聯絡的子選單的控制代碼。

  uFlags:一種指定功能選項的位標誌。用下列標誌位之一來確定函式如何水平放置快捷選單:

  TPM_CENTERALIGN:若設定此標誌,函式將按引數x指定的座標水平居中放置快捷選單。

  TPM_LEFTALIGN:若設定此標誌,函式使快捷選單的左邊界與由引數X指定的座標對齊。

  TPM_RIGHTALIGN:若設定此標誌,函式使快捷選單的右邊界與由引數X指定的座標對齊。

  用下列標誌位之一來確定函式如何垂直放置快捷選單:

  TPM_BOTTOMALIGN:若設定此標誌,函式使快捷選單的下邊界與由引數y指定的座標對齊。

  TPM_TOPALIGN:若設定此標誌,函式使快捷選單的上邊界與由引數y指定的座標對齊。

  TPM_VCENTERALIGN;若設定此標誌,函式將按引數y指定的座標垂直居中放置快捷選單

  用下列標誌位之一來確定在選單沒有父視窗的情況下使用者的選擇:

  TPM_NONOTIFY:若設定此標誌,當用戶單擊選單項時函式不傳送通知訊息。

  TPM_RETURNCMD;若設定此標誌;函式將使用者所選選單項的識別符號返回到返回值裡。

  (補充:當TrackPopupMenu的返回值大於0,就說明使用者從彈出選單中選擇了一個選單。以返回的ID號為引數wParam的值,程式給自己傳送了一個WM_SYSCOMMAND訊息)

  用下列標誌位之一來確定在快捷選單跟蹤哪一個滑鼠鍵:

  TPM_LEFTBUTTON:若設定此標誌,使用者只能用滑鼠左鍵選擇選單項。

  TPM_RIGHTBUTTON:若設定此標誌,使用者能用滑鼠左、右鍵選擇選單項。

  X:在螢幕座標下,快捷選單的水平位置。

  Y:在螢幕座標下,快捷選單的垂直位置。

  NReserved:保留值,必須為零。

  HWnd:擁有快捷選單的視窗的控制代碼。此視窗接收來自選單的所有訊息。函式返回前,此視窗不接受來自選單的WM_COMMAND訊息。

  如果在引數uFlags裡指定了TPM_NONOTIFY值,此函式不向hWnd標識的視窗發訊息。 但必須給hWnd裡傳一個視窗控制代碼,可以是應用程式裡的任一個視窗控制代碼。

  PrcRect:未用。

  返回值:如果在引數uFlags裡指定了TPM_RETURNCMD值,則返回值是使用者選擇的選單項的識別符號。如果使用者未作選擇就取消了選單或發生了錯誤,則退回值是零。如果沒在引數uFlags裡指定TPM_RETURNCMD值,若函式呼叫成功,返回非零值,若函式呼叫失敗,返回零。若想獲得更多的錯誤資訊,清呼叫GetLastError 。