vsflex8控件AddItem能不能在中间某行新增呢?

oceanmeng 2009-12-02 06:45:47
vsflex8控件fg.AddItem 只能在最后一行新增,那么能不能在中间某行新增呢?做到在左边行号列(也就是0列)点击右键,出现菜单,显示插入新行(类似于Excel),或者其他办法在中间某行新增新行。
...全文
126 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
oceanmeng 2009-12-02
  • 打赏
  • 举报
回复
一样的,iClick = TrackPopupMenu(hMenu, TPM_LEFTALIGN, Pt.x, Pt.y, 0, Me.hwnd, ByVal 0&)
仍然等于1,还有菜单出现,你没有点击它,当它消失时iClick 也返回1
  • 打赏
  • 举报
回复
AppendMenu hMenu, MF_STRING, ByVal 21, "New"
oceanmeng 2009-12-02
  • 打赏
  • 举报
回复

Const MF_CHECKED = &H8&
Const MF_APPEND = &H100&
Const TPM_LEFTALIGN = &H0&
Const MF_DISABLED = &H2&
Const MF_GRAYED = &H1&
Const MF_SEPARATOR = &H800&
Const MF_STRING = &H0&
Private Type POINTAPI
x As Long
y As Long
End Type
Dim hMenu As Long

Private Declare Function CreatePopupMenu Lib "user32" () As Long
Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal nReserved As Long, ByVal hwnd As Long, ByVal lprc As Any) As Long
Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long
Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

'下面iClick不管你点不点击New都是1,这样都执行了fg.AddItem "New", fg.MouseRow + 1,按理说只能点击New后才能执行AddItem,这是为什么?
Private Sub fg_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim Pt As POINTAPI
GetCursorPos Pt
If Button = vbRightButton Then
If fg.MouseCol = 0 Then
hMenu = CreatePopupMenu()
AppendMenu hMenu, MF_STRING, ByVal 0&, "New"
iClick = TrackPopupMenu(hMenu, TPM_LEFTALIGN, Pt.x, Pt.y, 0, Me.hwnd, ByVal 0&)
If iClick = 1 Then
fg.AddItem "New", fg.MouseRow + 1
End If
DestroyMenu hMenu
End If
End If
End Sub
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 oceanmeng 的回复:]
iClick返回是1,不是21,
且VSFlexGrid1.MouseRow 一直都是-1,
另外菜单出现位置不固定。
这些是为什么?
[/Quote]
1, 看8楼
2,MouseRow,点的地方不对
3,查查cellleft。celltop的用法
king06 2009-12-02
  • 打赏
  • 举报
回复
上面是动态创建菜单,
其实简单点,在你的窗体上自己建个菜单,设置visible为false
右键点击的时候,让它的visible为true,用popupmenu()方法弹出它就可以了
oceanmeng 2009-12-02
  • 打赏
  • 举报
回复
iClick返回是1,不是21,
且VSFlexGrid1.MouseRow 一直都是-1,
另外菜单出现位置不固定。
这些是为什么?
  • 打赏
  • 举报
回复

Public Declare Function CreatePopupMenu Lib "user32" () As Long
Public Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal nReserved As Long, ByVal hwnd As Long, ByVal lprc As Any) As Long
Public Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long
Public Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long
Public Declare Function EnableMenuItem Lib "user32" (ByVal hMenu As Long, ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long

Private Sub VSFlexGrid1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = vbRightButton Then
If VSFlexGrid1.MouseCol = 0 Then

hMenu = CreatePopupMenu()

AppendMenu hMenu, MF_STRING, ByVal 21, "New"

iClick = TrackPopupMenu(hMenu, TPM_LEFTALIGN Or TPM_NONOTIFY Or TPM_RETURNCMD, x, y, 0, Me.hwnd, ByVal 0&)

DestroyMenu hMenu

If iClick = 21 Then
VSFlexGrid1.AddItem "New", VSFlexGrid1.MouseRow + 1
endif
oceanmeng 2009-12-02
  • 打赏
  • 举报
回复
那怎么写?
guyehanxinlei 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 patrickkong 的回复:]
可以。
VSFlexGrid1.AddItem idx & vbTab & "A" & idx,位置[row]
[/Quote]
支持
  • 打赏
  • 举报
回复
会不会用api调用menu?
oceanmeng 2009-12-02
  • 打赏
  • 举报
回复
那能否做到在左边行号列(也就是0列)点击鼠标右键,出现菜单,显示插入新行,然后点击插入新行(类似于Excel),就在点中行号那栏插入了新行?
  • 打赏
  • 举报
回复
可以。
VSFlexGrid1.AddItem idx & vbTab & "A" & idx,位置[row]
  • 打赏
  • 举报
回复
在我机器上没问题,就是menu跑到其他的位置。
你试试8楼的。
menu不是很要紧,主要是加行,对吧?

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧