質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

1回答

2032閲覧

ListView_SetItemPositionの座標指定方法の疑問

popy

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2020/11/13 15:18

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

LVM_SETITEMPOSITION message (Commctrl.h) - Win32 apps | Microsoft Docs

このなかで、

lParam

The LOWORD specifies the new x-position of the item's upper-left corner, in view coordinates.

The HIWORD specifies the new y-position of the item's upper-left corner, in view coordinates.

という記述があります。
Y位置は、HIWORD に置かれます

投稿2020/11/13 15:38

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popy

2020/11/15 00:10

y_waiwai様 回答頂きありがとうございました。MS社サイトの情報通り、LVM_SETITEMPOSITONの説明通りの引数となっておりました。情報いただけたおかげで理解が進みました。 ただ、回答を受けてまだ自分が理解できていない箇所があります。 ListView_SetItemPositionの引数に関してです。 ListView_SetItemPosition lngSysListView32, LVM_SETITEMPOSITION, 0, rc.Top * &H10000 + rc.Left + 10 でListView_SetItemPositionの引数は 引数1 lngSysListView32 引数2 LVM_SETITEMPOSITION 引数3 0 引数4 rc.Top * &H10000 + rc.Left + 10 に見えます。 listview_setitempositionの説明をMS社のサイトで確認すると、 https://docs.microsoft.com/en-us/windows/win32/api/commctrl/nf-commctrl-listview_setitemposition 引数1 hwndLV Type: HWND A handle to the list-view control. 引数2 i Type: int The index of the list-view item. 引数3 x Type: int The new x-position of the item's upper-left corner, in view coordinates. 引数4 y Type: int The new y-position of the item's upper-left corner, in view coordinates. に見えます。自分が書いたコード内容とMS社のlistview_setitempositionの説明とマッチしていないように思います。このコードの解釈を教えていただけませんでしょうか。 よろしくお願いします。
y_waiwai

2020/11/15 00:43

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 ここで、ListView_SetItemPosition は SendMessageA の別名として定義されてます つまり、その行は、 SendMessage( lngSysListView32, LVM_SETITEMPOSITION, 0, rc.Top * &H10000 + rc.Left + 100) というAPIを呼び出してるってことになります
popy

2020/11/15 05:10

回答ありがとうございました!! 完全に理解しました! APIの学習を引き続き精進していきます。取り急ぎお礼まで。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問