如果你寫乙個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,之後列印生...