首页
社区
课程
招聘
[求助]LISTBOX的右键菜单
发表于: 2007-6-30 09:44 8976

[求助]LISTBOX的右键菜单

2007-6-30 09:44
8976
请问在汇编中如何实现对LISTBOX中的某项或者全部内容实现右键菜单复制其内容到剪贴板?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
2
1、换种思路,用双击实现:
.IF uMsg == WM_COMMAND
mov eax, wParam
movzx edx, ax ; edx 就是ListBox的ID: IDListBox
shr eax, 16
   .IF edx == IDListBox && eax == LBN_DBLCLK
           ;做些想做的事情
   .ENDIF
.ENDIF

2、鼠标右击:
.if uMsg == WM_RBUTTONDOWN
   invoke GetClientRect,hList,addr Rct
   mov    eax,lParam
   and    eax,0FFFFh ;鼠标 X 位置
   mov    edx,lParam,
   shr    edx,16        ; 鼠标 Y 位置
   .if    eax >= Rct.left && eax <= Rct.right && edx >= Rct.top && edx <= Rct.bottom
      invoke DestroyWindow,hList
   .endif

3、真正的右键菜单
.if  uMsg == WM_INITDIALOG
       invoke LoadMenu, hInstance, offset MenuName  ;主菜单
       mov hMenuh , eax
       invoke GetSubMenu, hMenuh,0        ;子菜单
       mov hSubMenu, eax
       ...
.elseif  uMsg==WM_CONTEXTMENU
    mov eax, lParam             ;显示弹出菜单                       
      and eax, 0ffffh
      mov ebx, lParam
      shr ebx, 16
      ;invoke TrackPopupMenu, hMenuh, TPM_LEFTALIGN, eax, ebx, 0, hWnd, 0
      invoke TrackPopupMenu, hSubMenu, TPM_LEFTALIGN, eax, ebx, 0, hWnd, 0

相关资料:列表框控件
1,创建方法:子窗口CREATEWINDOW,对话框.LISTBOX ID
2,列表样式:LBS_NOTIFY 父窗口发送消息
          LBS_EXTENDEDSEL 扩展
          LBS_SORT  字母顺序
          LBS_NOREDRAW  改变时不重画
          LBS_NULTIPLESEL 多选
          LBS_STANDARD 标准样式
3,消息传递:发送WM_COMMAND  字参数(WPARAM) 高字节:通知码 低字节;控件标识
4,通知码: LBN_SELCHAANG 发生改变
         LBN_DBLCLK     双击
         LBN_SELCANCLE  选择取消
         LBN_SETFOCUS   收到输入焦点
         LBN_KILLFOCUS   失去输入焦点
应用程序对列表框通过SENDMESSAGE或SENDLGITEMMESSAGE发送以下消息.
         LB_ADDFILE  加入指定文件
         LB_GETTEXT  获取指定文本
         LB_ADDSTRING 加入列表项
         LB_GETTEXTLEN 获取指定项长高
         LB_DELETESTRING 删除列表项
         LB_GETTOPINDEX 获取第一项的索引值
         LB_DIR 列出指定文件
         LB_INSERTSTRING 加入一项
         LB_FINDSTRING  查找指定项
         LB_RESETCONTENT 清空
         LB_GETCOUNT    项数
         LB_SETSEL    设置状态
         LB_GETCURSEL  选种的索引值
         LB_SETCURSEL  设置选中项
         LB_GETSEL       获取选中状态
         LB_SETTOPINDEX  设置第一项索引值
         LB_GETSELCOUNT 获取项数
2007-6-30 14:41
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
3
但是以上的内容好象都没达到效果,因为可以随便在窗体某处右击,没有控制在LISTBOX内,以下代码应该可以实现:

.elseif  uMsg==WM_CONTEXTMENU
...
invoke  GetDlgItem,hWnd,IDC_LST
mov hList,eax
invoke SetWindowLong,hList,GWL_WNDPROC,ListBoxProc
mov lpListBox, eax

ListBoxProc proc hCtl   :DWORD,uMsg:DWORD, wParam:DWORD, lParam :DWORD
.if uMsg == WM_RBUTTONDOWN      ;WM_CONTEXTMENU
mov eax, hList
invoke        MessageBox,hDlg,CTEXT("test"),0,0 ;仅仅做个测试,自己修改
.endif
invoke CallWindowProc,lpLstBox,hCtl,uMsg,wParam,lParam
ret
ListBoxProc endp
上传的附件:
2007-6-30 18:26
0
游客
登录 | 注册 方可回帖
返回
//