好久没弄了,只是实验一下,呵呵!
所涉及的API,就是一个TrackPopupMenu或者TrackPopupMenuEx!
原型如下:
BOOL TrackPopupMenu(
HMENU hMenu, //指向弹出菜单的句柄
UINT uFlags, //设置的标志位,用于指示弹出菜单的样式,如文字对齐方式
int x,
int y, //弹出菜单的左上角位置
int nReserved,
HWND hWnd, //接收弹出菜单消息的窗口
HWND prcRect //忽略
);
及
BOOL TrackPopupMenuEx( HMENU hmenu,
UINT fuFlags,
int x,
int y,
HWND hwnd,
LPTPMPARAMS lptpm
);
首先在资源里添加好一个菜单资源,如下:
IDR_POPMENU MENU
BEGIN
POPUP "1"
BEGIN
MENUITEM "弹出消息一", ID_SUB_ONE
MENUITEM "弹出消息二", ID_SUB_TWO
MENUITEM SEPARATOR
MENUITEM "退出", ID_SUB_EXIT
END
END
由于是在响应右键点击时弹出菜单的,所以在消息响应里处理WM_RBUTTOMDOWN消息时弹出菜单:
1、首先是获取一个菜单句柄
HMENU hMenu=LoadMenu(g_hInst,MAKEINTRESOURCE(IDR_POPMENU));
HMENU hSubMenu=GetSubMenu(hMenu,0);
2、其次是获取弹出菜单的左上角位置,这里是通过获取光标的位置来设置的:
POINT pos;
GetCursorPos(&pos);
3、接下来就是弹出菜单了,直接调用API:
TrackPopupMenu(hSubMenu,TPM_LEFTBUTTON,pos.x,pos.y,0,hDlg,NULL);
4、然后在WM_COMMAND消息里响应菜单消息,而这里wParam的高位16为0,低位16位对应的则是消息ID:
case WM_COMMAND:
if(HIWORD(wParam)==0){
switch(LOWORD(wParam)){
case ID_SUB_ONE:
MessageBox(hDlg,TEXT("对应菜单按钮一"),TEXT("Test"),0);
return TRUE;
case ID_SUB_TWO:
MessageBox(hDlg,TEXT("对应菜单按钮二"),TEXT("Test"),0);
return TRUE;
case ID_SUB_EXIT:
EndDialog(hDlg,0);
return TRUE;
}
}
测试运行如下:
完整和代码如下:
#include
#include"resource.h"
HINSTANCE g_hInst;
INT_PTR CALLBACK MainDlgProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR lpCmdLine,int nShowCmd)
{
g_hInst=hInstance;
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,MainDlgProc);
return 0;
}
INT_PTR CALLBACK MainDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg){
case WM_INITDIALOG:
{
HICON hIcon=LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_MAIN));
SendMessage(hDlg,WM_SETICON,ICON_BIG,(LPARAM)hIcon);
SendMessage(hDlg,WM_SETICON,ICON_SMALL,(LPARAM)hIcon);
SetWindowText(hDlg,TEXT("Test Popup Memu"));
SetDlgItemText(hDlg,IDC_INFO,TEXT("Write By Iawen --2009.02.04"));
return TRUE;
}
case WM_SYSCOMMAND:
switch(wParam)
{
case SC_CLOSE:
DestroyWindow(hDlg);
PostQuitMessage(0);
return TRUE;
case SC_MINIMIZE:
return TRUE;
}
case WM_RBUTTONDOWN:
{
HMENU hMenu=LoadMenu(g_hInst,MAKEINTRESOURCE(IDR_POPMENU));
HMENU hSubMenu=GetSubMenu(hMenu,0);
POINT pos;
GetCursorPos(&pos);
TrackPopupMenu(hSubMenu,TPM_LEFTBUTTON,pos.x,pos.y,0,hDlg,NULL);
}
return TRUE;
case WM_COMMAND:
if(HIWORD(wParam)==0){
switch(LOWORD(wParam)){
case ID_SUB_ONE:
MessageBox(hDlg,TEXT("对应菜单按钮一"),TEXT("Test"),0);
return TRUE;
case ID_SUB_TWO:
MessageBox(hDlg,TEXT("对应菜单按钮二"),TEXT("Test"),0);
return TRUE;
case ID_SUB_EXIT:
EndDialog(hDlg,0);
return TRUE;
}
}
}
return FALSE;
}
附件为完整的工程文件:
PopMenu.rar