论坛: 编程破解 标题: SDK->ListView->右键菜单(求救) 复制本贴地址    
作者: battle [battle]    论坛用户   登录
#include <windows.h>
#include "resource.h"
#include <commctrl.h>

#pragma comment(lib, "comctl32.lib")

#define ID_LISTVIEW  2000
#define IDR_TOOLBARER 2001
HWND hwndListViewswq;
char frameclass[] = "Frame55555555555555555555555555555555555555555555555555";
LRESULT CALLBACK FrameProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK TreeProc(HWND,UINT,WPARAM,LPARAM);

HWND CreateHotelListView(HWND hWnd);
HWND CreateToolBar(HWND hWnd);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstnace,LPSTR lpCmdLine,int iCmdShow)
{
WNDCLASS Wndclass;
MSG msg;
HWND hWndFrame;
HACCEL hAccel;

Wndclass.style = CS_HREDRAW | CS_VREDRAW;
Wndclass.cbClsExtra = 0;
Wndclass.cbWndExtra = 0;
Wndclass.hInstance = hInstance;
Wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
Wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
Wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
Wndclass.lpszMenuName = NULL;
Wndclass.lpszClassName = frameclass;
Wndclass.lpfnWndProc = FrameProc;

if(!RegisterClass(&Wndclass))
return 0;
InitCommonControls();
hWndFrame = CreateWindow(frameclass,
frameclass,
WS_OVERLAPPEDWINDOW,
0,0,
650,
500,
NULL,
NULL,
hInstance,
NULL);

ShowWindow(hWndFrame,iCmdShow);
UpdateWindow(hWndFrame);


hAccel = LoadAccelerators(hInstance,frameclass);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK FrameProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
HMENU hMenu;
POINT ps;
switch(Message)
{
case WM_CREATE:
hwndListViewswq = CreateHotelListView(hWnd);
break;
case WM_LBUTTONDOWN:
hMenu = LoadMenu((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),(LPSTR)IDR_MENU1);
hMenu = GetSubMenu(hMenu,0);
ClientToScreen(hWnd,&ps);
TrackPopupMenu(hMenu,TPM_RIGHTBUTTON,ps.x,ps.y,0,hWnd,NULL);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_NOTIFY:
TreeProc(hWnd,Message,wParam,lParam);//接受控件消息ListView
break;
}
return DefWindowProc(hWnd,Message,wParam,lParam);
}

HWND CreateHotelListView(HWND hWnd)//创建ListVIew
{
hwndListViewswq = CreateWindowEx(WS_EX_CLIENTEDGE,
  WC_LISTVIEW,
  "",
  WS_TABSTOP |
WS_CHILD |
WS_VISIBLE |
LVS_REPORT,
  0,0,300,200,
  hWnd,
  (HMENU)ID_LISTVIEW,
  (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),
  NULL);

LV_COLUMN  lvColumn;
int        i;
TCHAR      szString[3][20] = {"用户名","绰号", "网速"};


ListView_DeleteAllItems(hwndListViewswq);

lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = 70;
for(i = 0; i < 3; i++)
  {
  lvColumn.pszText = szString[i];
  ListView_InsertColumn(hwndListViewswq, i, &lvColumn);
  }
}

LRESULT CALLBACK TreeProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
HMENU hMenu;
POINT ps;
ps.x = LOWORD(lParam);
ps.y = HIWORD(lParam);
ClientToScreen(hWnd,&ps);
LV_DISPINFO *lpdi = (LV_DISPINFO *)lParam;
#define lpnm  ((LPNMHDR)lParam)
#define pnmtv  ((LPNMTREEVIEW) lParam)
switch(lpnm->code)
{
case NM_RCLICK:
hMenu = LoadMenu((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),(LPSTR)IDR_MENU1);
hMenu = GetSubMenu(hMenu,0);
TrackPopupMenu(hMenu,TPM_RIGHTBUTTON,ps.x,ps.y,0,hWnd,NULL);
break;
}
return FALSE;
}

为什么单击右键以后..菜单显示的地方不是鼠标的旁边...始终在右上角/////屡试不爽啊//

地主 发表时间: 05-04-28 16:50

回复: jhkdiy [jhkdiy]   版主   登录
TrackPopupMenu(hMenu,TPM_RIGHTBUTTON,ps.x,ps.y,0,hWnd,NULL);
TPM_RIGHTBUTTON + TPM_LEFTALIGN

B1层 发表时间: 05-04-28 20:42

回复: battle [battle]   论坛用户   登录
用 TrackPopupMenu(hMenu,TPM_RIGHTBUTTON|TPM_LEFTALIGN,ps.x,ps.y,0,hWnd,NULL);
没弄好阿.....谢谢你阿..
我用GetCursorPos()
解决这个问题了.....



B2层 发表时间: 05-04-29 10:01

回复: jhkdiy [jhkdiy]   版主   登录
我差点忘了菜单是相对于整个屏幕坐标的。哎~~

B3层 发表时间: 05-04-29 11:03

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号