ListView_SetItemPositionの座標指定方法の疑問
ExcelのVBAにてデスクトップ上の任意のアイコンを指定したの画面座標の位置へ移動するプログラムを作りたいと考えております。
調べてみたところuser32.dllを利用したコードがweb上に紹介されており、そのコードを読み解いているところです。
そのコードの中でどうしてもなぜ、そのように書いたのか意図が分からない行があるため、
もしわかる方がいらっしゃいましたらご教授お願いします。
あるアイコンを画面座標X,Yに移動したいです。
サンプルコードはあるアイコンをX方向に+100移動するという内容です。
ListView_SetItemPosition lngSysListView32, LVM_SETITEMPOSITION, 0, rc.Top * &H10000 + rc.Left + 100
とあります。
これでは
X=0,Y=rc.Top * &H10000 + rc.Left + 100
となり、X方向のアイコンが移動するように思えません。
また&H10000を乗算する意味もわかりません。
しかし実際に実行するとX方向に+100アイコンが移動するように動作しております。
ListView_SetItemPosition lngSysListView32, LVM_SETITEMPOSITION, rc.Left+100, rc.Top
ではダメでしょうか。
すみませんがよろしくお願いします。
#####紹介されたサンプルコード
######コードの下部付近、太文字が自分が理解できないコードです。
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal uCmd As Long) As Long
Private Declare Function ListView_GetItemRect Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal MSG As Long, ByVal lngIndex As Long, ByRef rc As RECT) As Long
Private Declare Function ListView_SetItemPosition Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal MSG As Long, ByVal lngIndex As Long, ByVal lngPosition As Long) As Long
Private Type LVITEM
mask As Long
iItem As Long
iSubItem As Long
state As Long
stateMask As Long
pszText As Long
cchTextMax As Long
iImage As Long
lParam As Long
iIndent As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Const LVM_GETITEMRECT As Long = &H100E
Private Const LVM_SETITEMPOSITION As Long = &H100F
Private Const GW_CHILD As Long = 5
Private Const LVIR_ICON As Long = 1
Private Sub CommandButton1_Click()
Dim lngTopWindow As Long
Dim lngChildWindow As Long
Dim lngSysListView32 As Long
Dim lvi As LVITEM
Dim rc As RECT
lngTopWindow = FindWindow("Progman", "Program Manager") If lngTopWindow Then lngChildWindow = GetWindow(lngTopWindow, GW_CHILD) If lngChildWindow Then lngSysListView32 = GetWindow(lngChildWindow, GW_CHILD) If lngSysListView32 Then ' インデックス= 0 のアイコンの位置を取得します。 rc.Left = LVIR_ICON ListView_GetItemRect lngSysListView32, LVM_GETITEMRECT, 0, rc ' X 方向に +100 移動させます ListView_SetItemPosition lngSysListView32, LVM_SETITEMPOSITION, **0, rc.Top * &H10000 + rc.Left + 100** End If End If End If
End Sub
######参考にしたサイト
https://okwave.jp/qa/q5525027.html
######動作環境
windows10
excel2016
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/15 00:10
2020/11/15 00:43
2020/11/15 05:10