如题!
谢谢!
谢谢!
解决方案 »
- Visual Studio2010里VB中Default和Cancel属性在哪里??没找到
- VB类的EVENT,SUB,FUNCTION的区别
- 关于自联接表中,联接字段有相同值的记录不能被修改的问题
- 如果我知道了一个进程的PID,那么我要通过什么方法才能知道它的句柄(或者有什么方法知道标题和类)?
- 今天难受啊,简单算法问题,来帮帮我啊
- coolbar控件上设置多个带区,怎样获取每个带区被用户拖动的位置呢?以便记录,在下次启动直接到用户拖动的位置。
- 日期字段如果什么都没写该值应该等于什么?
- 关于postmessage的问题
- 如何使vb中的按钮发声?
- Win2000支不支持双屏显示?
- LABLE为什么在选项卡中不能显示?
- 用MMControl播放avi文件的问题?
Private Sub lvw1_Mouseup(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim i As Integer
If Button = 2 Then
For i = 1 To lvw1.ColumnHeaders.Count
If x >= lvw1.ColumnHeaders(i).Left And x < lvw1.ColumnHeaders(i).Left + lvw1.ColumnHeaders(i).Width Then
If i = 1 Then
MsgBox (lvw1.ListItems(lvw1.SelectedItem.Index).Text)
Else
MsgBox (lvw1.ListItems(lvw1.SelectedItem.Index).SubItems(i - 1))
End If
End If
Next
End If
End Sub
只是想求更高效,更正规的方法
先放几天看看吧,过几天再结贴。
ListView1.HitTest(x, y)
i = Item.Index
End SubPrivate Sub listview1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = 2 Then
MsgBox i
End If
End Sub
你给出的方法还是取得的行值呀
If ListView1.ListItems.Count = 0 Then Exit Sub
MsgBox ListView1.SelectedItem.Text
End Sub
If ListView1.ListItems.Count = 0 Then Exit Sub
If Button = 2 Then
MsgBox ListView1.SelectedItem.Text
End If
End Sub
The information in this article applies to:
Microsoft Win32 Software Development Kit (SDK)This article was previously published under Q125694
SUMMARY
You can use the technique described in this article to find out which column was clicked after right-clicking the listview column header.
MORE INFORMATION
LVN_COLUMNCLICK notifies a listview's parent window when a column is clicked using the left mouse button, but no such notification occurs when a column is clicked with the right mouse button. Windows 95 sends an NM_RCLICK notification to the listview's parent window when a column is clicked with the right mouse button, but the message sent does not contain any information as to which column was clicked, especially if the window is sized so that the listview is scrolled to the right. The correct way to determine which column was clicked with the right mouse button, regardless of whether the listview is scrolled, is to send the header control an HDM_HITTEST message, which returns the index of the column that was clicked in the iItem member of the HD_HITTESTINFO struct. In sending this message, make sure the point passed in the HD_HITTESTINFO structure is relative to the header control's client coordinates. Do not pass it a point relative to the listview's client coordinates; if you do, it will return an incorrect column index value. The header control in this case turns out to be a child of the listview control of LVS_REPORT style. The following code demonstrates this method. Note that while the code processes the NM_RCLICK notification on a WM_NOTIFY message, you also process the WM_CONTEXTMENU message, which is also received as a notification when the user clicks the right mouse button.
Sample Code
case WM_NOTIFY:
{
if ((((LPNMHDR)lparam)->code == NM_RCLICK))
{
HWND hChildWnd;
POINT pointScreen, pointLVClient, pointHeader;
DWORD dwpos; dwPos = GetMessagePos(); pointScreen.x = LOWORD (dwPos);
pointScreen.y = HIWORD (dwPos); pointLVClient = pointScreen; // Convert the point from screen to client coordinates,
// relative to the listview
ScreenToClient (ghwndLV, &pointLVClient); // Because the header turns out to be a child of the
// listview control, we obtain its handle here.
hChildWnd = ChildWindowFromPoint (ghwndLV, pointLVClient); // NULL hChildWnd means R-CLICKED outside the listview.
// hChildWnd == ghwndLV means listview got clicked: NOT the
// header.
if ((hChildWnd) && (hChildWnd != ghwndLV))
{
char szClass [50]; // Verify that this window handle is indeed the header
// control's by checking its classname.
GetClassName (hChildWnd, szClass, 50);
if (!lstrcmp (szClass, "SysHeader32"))
{
HD_HITTESTINFO hdhti;
char szBuffer [80]; // Transform to client coordinates
// relative to HEADER control, NOT the listview!
// Otherwise, incorrect column number is returned. pointHeader = pointScreen;
ScreenToClient (hChildWnd, &pointHeader); hdhti.pt = pointHeader;
SendMessage (hChildWnd,
HDM_HITTEST,
(WPARAM)0,
(LPARAM) (HD_HITTESTINFO FAR *)&hdhti);
wsprintf (szBuffer, "Column %d got clicked.\r\n",
hdhti.iItem); MessageBox (NULL, szBuffer, "Test", MB_OK);
}
}
}
return 0L;
}
If Button = 2 Then
Dim i As Integer
Dim LngWidth As Long
LngWidth = 0
For i = 1 To ListView1.ColumnHeaders.Count
LngWidth = LngWidth + ListView1.ColumnHeaders(i).Width
If x <= LngWidth Then MsgBox i: Exit Sub
Next i
End If
End Sub
'想来想去,这是最简单的方法。
有兴趣可以看看
http://expert.csdn.net/Expert/topic/1897/1897586.xml?temp=.9763758
结贴