通過TrackPopupMenu函式彈出選單

2021-07-06 01:50:00 字數 2630 閱讀 3719

如果你寫乙個win32程式,你想在某個條目上滑鼠右鍵,彈出乙個簡單的選單,該選單就有乙個選項。

那麼,你不用費很大的力氣去設計這個選單,也不需要寫乙個xml等,你只需要使用trackpopupmenu函式來實現這個簡單的夢想。

看到了吧,是乙個shortcut選單,更重要的是可以展示在螢幕的任何位置,只要你願意。這時候,你應該迫不及待看看函式語法了吧:

bool winapi trackpopupmenu(

_in_ hmenu hmenu,

_in_ uint uflags,

_in_ int x,

_in_ int y,

_in_ int nreserved,

_in_ hwnd hwnd,

_in_opt_ 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,就說明使用者從彈出選單中選擇了乙個選單。當不設定tpm_nonotify和tpm_returncmd時,程式給自己傳送了乙個wm_command訊息,以返回的id號為引數wparam的值)

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

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

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

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

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

nreserved:保留值,必須為零。

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

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

prcrect:未用。

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

還是同樣的原則,無需記住每個引數如何設定,用的時候會查閱就可以了。

這裡要特別注意的是引數x,和引數y,為了讓你信服,看下msdn如何描述這兩個引數的吧:

x :the horizontal location of the shortcut menu,in screen coordinates.

y :the vertical location of the shortcut menu,in screen coordinates.

看到了嗎,是相對於螢幕座標系的,或可以說是相對screen的。

那麼問題就來了,在我們開發的程式中,幾乎使用的都是相對於client的座標系。

所以,特別需要注意的是,如果你的整個程式都使用的是相對於client,那麼再使用trackpopupmenu函式時,需要進行座標轉換。需要使用的函式就是clienttoscreen()。

clienttoscreen(m_hwnd, &msg.ptmouse);   

int cmd = trackpopupmenu(session_im_menu_, tpm_returncmd| tpm_leftalign| tpm_topalign, msg.ptmouse

.x + 30, msg.ptmouse

.y + 10, null, m_hwnd,null);

通過ActiveProcessLinks遍歷程序

程序的遍歷有多種方法。在應用程式裡可以使用createtoolhelp32snapshot函式先做個程序快照 snapshot 然後通過返回的資料進行遍歷。在核心程式設計裡可以通過核心資料結構來實現。核心結構eprocess 執行體程序塊 executive process 是乙個不透明 opaqu...

通過RestHighLevelClient操作ES

一 查詢相關 在es查詢中,must相當於sql語句中的and,should相當於or。當想要實現類似於 select from table where a and b or c or d 的功能時可以借助於es中的bool。即resthighlevelclient中的boolquerybuilde...

IEEE PDF eXpress 通過方法

ieee pdf express這個東西比較煩人 文章是用latex寫的,生成pdf後始終是不能通過 原因是有些文字無法嵌入到pdf中的,本人之前的解決方法是把所有檔案打包生成zip後上傳,讓ieee來生成pdf 但這次一直不行,不過最後找到了乙個非常簡單的方法 安裝pdfcreater,之後列印生...